Java套接字编程是大家学习Java网络编程的入门知识,最简单的例子就是实现客户端与服务器端的通信:从客户端可以发送消息至服务器端,从服务器端也可以反馈消息给客户端。下面先简单介绍一下涉及到的概念:
套接字:套接字是为了区别不同的应用程序进程和连接,计算机操作系统为TCP/IP协议提供的接口。
1)套接字是由IP地址和端口号组成的,简单解释一下,假设你的电脑上有两个程序都在运行,并且都从服务器端读取数据,一个是A,一个是B,现在A的服务器和B的服务器同时发送来数据,现在怎么判断接收到的网络数据是给哪一个程序使用的呢?这就是端口的作用了!每个程序监听本机上的一个端口,就可以从这个端口读取数据了!这样数据就不会混乱~~
2)网络流:在网络上传送的数据流;
下面是程序代码:(注:代码中涵盖了数据库操作JDBC以及多线程(线程池操作))
客户端:
import javax.swing.*;
import java.awt.*;
import java.net.Socket;
import java.sql.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.*;
public class test extends JFrame {
private DataOutputStream toServer;
private DataInputStream fromServer;
private Socket socket;
public test(){
//界面制作
setLayout(new FlowLayout());
JLabel label = new JLabel("请输入ID:");
final JTextField id = new JTextField(10);
JButton button = new JButton("search");
add(label);
add(id);
add(button);
JLabel labela = new JLabel(" Employee ID: ");
final JTextField text1 = new JTextField(20);
add(labela);
add(text1);
JLabel labelb = new JLabel(" Last Name: ");
final JTextField text2 = new JTextField(20);
add(labelb);
add(text2);
JLabel labelc = new JLabel(" First Name: ");
final JTextField text3 = new JTextField(20);
add(labelc);
add(text3);
JLabel labeli= new JLabel(" Address: ");
final JTextField text4 = new JTextField(20);
add(labeli);
add(text4);
JButton but = new JButton("Insert");
add(but);
//网络:打开套接字
try{
socket = new Socket("localhost", 8000);
}catch(IOException e){}
//这个按钮测主要作用就是向服务器端发送数据的,数据是从界面上读取的,然后写入网络流发送;
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String access = "insert|" + text2.getText() + "|" + text3.getText() + "|" + text4.getText();
try {
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.write(access);
pw.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
//这个按钮是查询操作,然后通过getInputStream()方法监听端口返回的数据,处理后显示在界面上
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
//网络操作;
InputStreamReader isr;//将从套接字读到的字节转化成为字符;
//isr = new InputStreamReader(socket.getInputStream());
//BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.write("search|" + id.getText());
pw.flush();
char buf[] = new char[200];
//初始化
for(int i = 0; i < 100; i++){
buf[i] = '0';
}
isr = new InputStreamReader(socket.getInputStream());
isr.read(buf);
String result = arrayOp(buf);
//处理字符串;
String re[] = result.split("\\|");
//显示查询结果
text1.setText(id.getText());
text2.setText(re[0]);
text3.setText(re[1]);
text4.setText(re[2]);
}catch(IOException ex){};
}
});
}
//处理字符串的函数(主要是字符串在Java网络流里面不好传输)
public String arrayOp(char buf[]){
String result = "";
for(int i = 0; i < buf.length; i++){
if(buf[i] == '0')
break;
result = result + buf[i];
}
return result;
}
//实例化
public static void main(String args[]){
JFrame frame = new test();
frame.setTitle("数据库操作");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(350, 220);
frame.setVisible(true);
}
}
服务器端:
import java.awt.BorderLayout;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Server extends JFrame{
/**
* @param args
*/
private JTextArea jta = new JTextArea();
private DataInputStream input;
private DataOutputStream output;
private Socket socket;
//线程池
private ExecutorService executor = Executors.newFixedThreadPool(3);
String result = "";
//监听中!
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Server server = new Server();
server.listen();
}
public Server(){
setLayout(new BorderLayout());
add(new JScrollPane(jta), BorderLayout.CENTER);
setTitle("Server");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void listen() throws IOException{
//create a server socket
//注意服务器端的接口声明,没有IP了~~
ServerSocket serverSocket = new ServerSocket(8000);
jta.append("~~~欢迎使用数据库操作服务器端~~~\n");
while(true){
socket = serverSocket.accept();
//建立线程,放入线程池
Runnable task = new Mc();
executor.execute(task);
}
}
private class Mc implements Runnable{
public Mc(){
}
public void run(){
try{
String dbUrl = "jdbc:odbc:jdbc";
String user = "";
String password = "";
//读取流;
InputStreamReader isr;
isr = new InputStreamReader(socket.getInputStream());
//BufferedReader br = new BufferedReader(isr);
///PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
char buf[] = new char[200];
//初始化
for(int i = 0; i < 200; i++){
buf[i] = '0';
}
while(true){
isr.read(buf);
String operation = arrayOp(buf);
//转义字符!!
String arrayStr[] = operation.split("\\|");
//连接数据库;
try{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}catch(ClassNotFoundException ep){
System.out.println(ep.toString());
}
Connection c = DriverManager.getConnection(dbUrl, user, password);
Statement s = c.createStatement();
//执行查询语句;
if(arrayStr[0].equals("search")){
jta.append("您的查询ID号为:" + arrayStr[1] + "\n");
jta.append("正在为您执行查询操作····请稍等\n");
ResultSet r =
s.executeQuery(
"SELECT FirstName, LastName, Address " +
"FROM Employees " +
"WHERE " +
"(EmployeeID=" + arrayStr[1] + ") ");
while(r.next()) {
result = r.getString("LastName") + "|" + r.getString("FirstName") + "|" + r.getString("Address");
}
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.write(result);
pw.flush();
jta.append("查询完毕,数据已返回客户端\n\n");
c.close();
}
else if(arrayStr[0].equals("insert")){
jta.append("正在为您执行插入操作····请稍等\n");
jta.append("LastName :" + arrayStr[1] + "\n");
jta.append("FirstName :" + arrayStr[2] + "\n");
jta.append("Address :" + arrayStr[3] + "\n");
for(int i = 0; i < 200; i++){
buf[i] = '0';
}
String access = "INSERT INTO Employees(LastName, FirstName, Address) VALUES('" + arrayStr[1]+"','"
+ arrayStr[2] +"','" + arrayStr[3] +"')";
s.executeQuery(access);
c.close();
jta.append("插入完成^_^\n\n");
}
s.close(); // Also closes ResultSet*/
}catch(SQLException ex){
System.out.println(ex.toString());
}/////////
}
}catch(IOException ep){}
}
public String arrayOp(char buf[]){
String result = "";
for(int i = 0; i < buf.length; i++){
if(buf[i] == '0')
break;
result = result + buf[i];
}
return result;
}
}
}
好啦,上面的例子对Java的线程,网络,数据库都有演示~~~不过不能在你的电脑上演示,因为么得数据库啊,大家可以把数据库那一段删了或改了,这样就OK了~~
分享到:
相关推荐
在这个Java实现的UDP简易客户端与服务器端程序中,我们可以通过两个核心文件——UDPClient.java和UDPServer.java来理解其工作原理。 首先,让我们来看看`UDPServer.java`。服务器端通常负责监听特定的端口,接收...
一旦有客户端连接,服务器端会为每个客户端创建一个新的套接字用于数据传输。客户端则通过套接字连接到服务器,发送和接收数据。 在Java中,我们可以使用`java.net.Socket`类来创建客户端套接字,`java.net....
在Java中,我们可以使用`java.net.ServerSocket`类来创建服务器端的套接字,监听指定端口。一旦有客户端连接,服务器端就需要创建一个`Socket`对象来处理这个连接。接着,通过`Socket`的输入流(`InputStream`)读取...
1. 服务器端生成一个随机数。 2. 客户端发起连接请求,服务器接收连接。 3. 客户端发送猜测,服务器接收并验证。 4. 如果猜测正确,服务器通知客户端胜利;如果猜测错误,服务器会提示过高或过低。 5. 客户端根据...
在这个“客户端和服务器互联——计算机网络课程设计”项目中,我们聚焦于实现一个Echo程序,它是一个简单的聊天工具,能够模拟服务器与多个客户端之间的信息交互。 首先,我们需要理解“服务器”和“客户端”的概念...
通过这个“Chat-Application”,开发者可以深入理解Java套接字编程的基本原理和实践,同时学习如何设计并实现一个简单的聊天系统。这不仅有助于提升网络编程技能,也为构建更复杂的分布式系统打下基础。
Java语言在实现服务器客户端聊天界面时,主要涉及网络编程的核心概念——套接字(Socket)技术,以及用户界面设计。套接字是网络通信的基本组件,它提供了进程间通信(IPC,Inter-Process Communication)的能力,...
开发者通常会编写服务器端代码(如Java、Python或Node.js)来实现上述功能,并使用客户端开发语言(如JavaScript、Swift或Java)创建用户界面并与服务器通信。 总的来说,聊天系统的服务器和客户端涉及了网络通信、...
本项目名为"TCP服务器与客户端源代码工程",主要关注如何使用编程语言实现TCP通信的两端——服务器端(Server)和客户端(Client)。这里我们将深入探讨TCP协议、服务器与客户端的工作原理,以及如何在实际项目中...
`ServerSocket(int port)`构造函数用于创建一个监听指定端口的服务器套接字。 4. **`accept()`方法**: - `ServerSocket`的`accept()`方法阻塞,直到有客户端连接到服务器。当有连接时,它返回一个`Socket`对象,...
当有客户端连接请求时,accept()方法将返回一个新的套接字用于与客户端通信。接收到客户端的获取时间请求后,服务器使用time库获取当前时间,然后将其转换为字符串,再通过sendall()方法发送给客户端。 2. **客户端...
- **网络编程**:使用Socket和ServerSocket类创建客户端和服务器端通信。 - **URL和URLConnection**:访问网络资源,如下载网页内容。 8. **建立对话框**(第八讲): - **对话框**:在主窗口之外显示的临时窗口...
本文将深入探讨标题和描述中提及的几个关键知识点:Java套接字编程、Java的网络功能与编程基础、TCP网络协议以及Java Transaction API。 首先,我们来了解**Java套接字编程**。套接字(Socket)是实现进程间通信的...
在Java仿QQ项目中,网络编程的概念如套接字(Socket)、输入输出流(InputStream/OutputStream)以及多线程编程是非常关键的。Java的并发库使得开发者能够轻松地处理多个并发连接,保证了系统的高效运行。同时,为了...
`ServerSocket`用于创建服务器端监听套接字,等待客户端连接;`Socket`则代表客户端与服务器之间的连接。 2. **多线程处理**:由于聊天室需要同时处理多个用户的请求,因此多线程是必不可少的。每个客户端连接都会...
1. **资源管理不当**:如果服务器或客户端没有正确地关闭输入/输出流或套接字,可能会导致资源泄露,进而影响后续的通信。确保在每次发送完消息后都关闭流,而在结束通信时关闭套接字。 2. **多线程同步问题**:...
Socket编程是计算机网络编程中的重要组成部分,特别是在Java中,它为开发者提供了实现客户端与服务器端通信的能力。本实例——"Socket服务器端实例(网络聊天室)",将带你深入理解Socket在构建网络聊天室中的应用。 ...
在JAVA中,可以使用java.net.DatagramSocket类来创建UDP套接字,用于发送和接收数据包。服务器端会将屏幕截图的数据编码为字节流,然后通过UDP发送到各个客户端。而客户端则监听特定的UDP端口,接收到数据后解码并...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...