下面是一段基于 BIO 模型实现的简单 Socket 编程
服务端
package cn.inetty.java;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class iServer {
private static ExecutorService executorService =
Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors() * 2
);
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(8888));
System.out.println("serverSocket:"+serverSocket);
// while (true) {
// new Thread(new ServerTask(serverSocket.accept())).start();
// }
// 使用线程池来创建线程
while (true) {
executorService.execute(new ServerTask(serverSocket.accept()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class ServerTask implements Runnable {
private Socket socket = null;
public ServerTask(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// 需要注意 ObjectOutputStream和ObjectInputStream 在服务端创建顺序和客户端创建顺序问题
try (
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
){
String name = inputStream.readUTF();
System.out.println("Accept Client Message = "+name);
outputStream.writeUTF("Hello "+name);
outputStream.flush();
} catch (IOException e) {
try {
socket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
e.printStackTrace();
}
}
}
}
客户端
package cn.inetty.java;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class iClient {
public static void main(String[] args) throws IOException {
Socket socket = null;
ObjectInputStream inputStream = null;
ObjectOutputStream outputStream = null;
try {
socket = new Socket();
socket.connect(new InetSocketAddress("localhost", 8888));
outputStream = new ObjectOutputStream(socket.getOutputStream());
inputStream = new ObjectInputStream(socket.getInputStream());
System.out.println(socket);
String name = "ming";
outputStream.writeUTF(name);
outputStream.flush();
System.out.println("Client Send Message = " + name);
System.out.println("From Server Message = " + inputStream.readUTF());
} catch (IOException e) {
try {
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
e.printStackTrace();
}
}
}