Java多线程实现TCP网络Socket编程(C/S通信)攻略
TCP网络Socket编程是C/S(客户端/服务器)通信的常用方式之一。在Java中,可以使用多线程来实现TCP网络Socket编程,并达到高效的并发处理能力。下面就是Java多线程实现TCP网络Socket编程(C/S通信)的攻略,包含详细步骤和示例代码。
1. 创建服务器端Socket
在Java中,可以使用ServerSocket
类来创建服务器端的Socket。需要指定端口号和连接请求队列的长度。示例代码如下:
try {
int port = 8888; // 服务器端口号
int backlog = 20; // 连接请求队列的长度
ServerSocket serverSocket = new ServerSocket(port, backlog);
System.out.println("服务器已启动,监听端口" + port + "...");
// 等待客户端连接
while (true) {
Socket socket = serverSocket.accept(); // 接收客户端连接请求
// 新建线程处理客户端请求
new ServerThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
2. 创建客户端Socket
在Java中,可以使用Socket
类来创建客户端的Socket。需要指定服务器的地址和端口号。示例代码如下:
try {
String host = "localhost"; // 服务器地址
int port = 8888; // 服务器端口号
Socket socket = new Socket(host, port);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3. 处理客户端请求的线程
在服务器端,每当有一个客户端连接请求时,就会新建一个线程处理客户端请求。在Java中,可以继承Thread
类,然后覆盖run()
方法来定义线程的执行逻辑。具体的执行逻辑根据实际需求来编写。示例代码如下:
class ServerThread extends Thread {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 发送和接收数据
在Java中,可以使用InputStream
和OutputStream
类来进行数据的收发。需要注意的是,在通信过程中,要对数据进行编码和解码,以确保数据的传输和读取的正确性。示例代码如下:
4.1 客户端发送数据
try {
OutputStream out = socket.getOutputStream(); // 获取Socket输出流
String data = "Hello, server!";
byte[] bytes = data.getBytes("UTF-8"); // 对数据进行编码
out.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
4.2 服务器端接收数据
try {
InputStream in = socket.getInputStream(); // 获取Socket输入流
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) { // 循环读取数据
String data = new String(buffer, 0, len, "UTF-8"); // 对数据进行解码
System.out.println(data);
}
} catch (IOException e) {
e.printStackTrace();
}
5. 示例
下面是一个完整的示例,演示如何使用Java多线程实现TCP网络Socket编程(C/S通信):
5.1 服务器端
public class Server {
public static void main(String[] args) {
try {
int port = 8888; // 服务器端口号
int backlog = 20; // 连接请求队列的长度
ServerSocket serverSocket = new ServerSocket(port, backlog);
System.out.println("服务器已启动,监听端口" + port + "...");
// 等待客户端连接
while (true) {
Socket socket = serverSocket.accept(); // 接收客户端连接请求
// 新建线程处理客户端请求
new ServerThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThread extends Thread {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.2 客户端
public class Client {
public static void main(String[] args) {
try {
String host = "localhost"; // 服务器地址
int port = 8888; // 服务器端口号
Socket socket = new Socket(host, port);
OutputStream out = socket.getOutputStream(); // 获取Socket输出流
String data = "Hello, server!";
byte[] bytes = data.getBytes("UTF-8"); // 对数据进行编码
out.write(bytes);
socket.shutdownOutput(); // 发送完毕,关闭Socket输出流
InputStream in = socket.getInputStream(); // 获取Socket输入流
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) { // 循环读取数据
String reply = new String(buffer, 0, len, "UTF-8"); // 对数据进行解码
System.out.println(reply);
}
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程实现TCP网络Socket编程(C/S通信) - Python技术站