目录
一、非线程安全
1). ClientSocket类
public static final String IP_ADDR = "localhost"; //服务器地址
public static final int PORT = 80; //服务器端口号
public static void main(String[] args) throws IOException {
//创建Socket连接对象
Socket socket = new Socket(IP_ADDR,PORT);
// 【向服务器发送信息】 —— 打开输出流(出)
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("【客户端】发送消息: ");
String clientStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(clientStr);
// 【接收服务器的响应信息】 —— 打开输入流(入)
DataInputStream input = new DataInputStream(socket.getInputStream());
String ServerText = input.readUTF();
System.out.println("【客户端】获取响应消息: " + ServerText);
//关闭流
out.close();
input.close();
}
2). ServerSocket类
public static final int PORT = 80; //服务器端口号
public static final int TIME_OUT = 10*1000; //连接超时时间
public static void main(String[] args) throws IOException {
// 创建ServerSocket对象,监听指定端口的Socket的链接请求,并设置超时时间
ServerSocket serverSocket = new ServerSocket(PORT);
serverSocket.setSoTimeout(TIME_OUT);
// 采用循环不断地接收来自客户端的请求
while(true){
// 每当接收客户端Socket请求时,服务器端产生一个对应的Socket对象
Socket socket = serverSocket.accept();
// 【接收客户端数据】 —— 打开输入流(入)
DataInputStream input = new DataInputStream(socket.getInputStream());
String clientInputStr = input.readUTF();
System.out.println("【服务器】接收消息:" + clientInputStr);
// 【响应客户端】 —— 打开输出流(出)
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("【服务器】响应消息: ");
String ServerOutputStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(ServerOutputStr);
//关闭流
out.close();
input.close();
}
}
二、线程安全
1). ClientSocket类
public static final String IP_ADDR = "localhost"; //服务器地址
public static final int PORT = 80; //服务器端口号
public static void main(String[] args){
System.err.println("启动客户端...");
Socket socket = null;
try{
// 创建流套接字对象并将其连接到指定主机上的指定端口号
socket = new Socket(IP_ADDR,PORT);
// 【向服务器发送信息】 —— 打开输出流(出)
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("【客户端】发送消息: ");
String clientStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(clientStr);
// 【接收服务器的响应信息】 —— 打开输入流(入)
DataInputStream input = new DataInputStream(socket.getInputStream());
String ServerText = input.readUTF();
System.out.println("【客户端】获取响应消息: " + ServerText);
//关闭流
out.close();
input.close();
} catch (Exception e) {
System.err.println("客户端异常:" + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
socket = null;
System.err.println("客户端 finally 异常:" + e.getMessage());
}
}
}
}
2). ServerSocket类
public static final int PORT = 80; // 服务器端口号
public static final int TIME_OUT = 15 * 1000; // 连接超时时间
public static void main(String[] args) {
System.err.println("启动服务器...");
KeTangServer server = new KeTangServer();
server.start();
}
public void start() {
try {
// 创建ServerSocket对象,监听指定端口的Socket的链接请求,并设置超时时间
ServerSocket serverSocket = new ServerSocket(PORT);
serverSocket.setSoTimeout(TIME_OUT);
while (true) {
// 一旦有堵塞, 则表示服务器与客户端获得了连接
Socket client = serverSocket.accept();
// 处理这次连接
new HandlerThread(client);
}
} catch (Exception e) {
System.err.println("服务器异常: " + e.getMessage());
}
}
private class HandlerThread implements Runnable {
private Socket socket; //Socket对象
public HandlerThread(Socket client) {
socket = client;
new Thread(this).start();
}
public void run() {
try {
// 【接收客户端数据】 —— 打开输入流(入)
DataInputStream input = new DataInputStream(socket.getInputStream());
String clientInputStr = input.readUTF();
System.out.println("【服务器】接收消息:" + clientInputStr);
// 【响应客户端】 —— 打开输出流(出)
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("【服务器】响应消息: ");
String ServerOutputStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(ServerOutputStr);
// 关闭流
out.close();
input.close();
} catch (Exception e) {
System.err.println("服务器run异常: " + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (Exception e) {
socket = null;
System.err.println("服务端finally异常:" + e.getMessage());
}
}
}
}
}
三、最终结果