关于2.3节多客户端重连的问题
@郭霖,多客户端连入那一节reader和writer设置成全局怎么感觉好怪异。比如A客户端连接,服务器拿到A的Socket对象,然后创建了reader和writer对象保持和A客户端的通信。这个时候B客户端接入,服务器拿到B的Socket对象,然后创建reader和writer对象,这个时候全局的reader和writer指向了B客户端所对应的Socket,那服务器这个时候应该失去和A客户端的通信功能了呀,怎么你的还可以通信呢,求解答,谢谢。
@郭霖,多客户端连入那一节reader和writer设置成全局怎么感觉好怪异。比如A客户端连接,服务器拿到A的Socket对象,然后创建了reader和writer对象保持和A客户端的通信。这个时候B客户端接入,服务器拿到B的Socket对象,然后创建reader和writer对象,这个时候全局的reader和writer指向了B客户端所对应的Socket,那服务器这个时候应该失去和A客户端的通信功能了呀,怎么你的还可以通信呢,求解答,谢谢。
2015-03-12
老师的代码是有问题的,错误在
不该把 BufferedReader bufferedReader;BufferedWriter bufferedWriter; 设置为全局。
否则会造成 后面接入的客户端 的BufferedReader BufferedWriter 会替换掉前面的。也就是只能最后一个客户端是可以通信的。
老师的代码:B客户端接入时,会替换A客户端的 BufferedReader BufferedWriter 仅仅只能通信一次(这个原因还有待研究,被B客户端替换后理应一次都不能通信)。
下面是我纠正后的测试代码(通过BufferedReader BufferedWriter的hashCode可以看出已经替换替换了):
package com.jo.server;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
BufferedReader bufferedReader = null;
public static void main(String[] args) {
SocketServer socketserver = new SocketServer();
socketserver.startServer();
}
public void startServer(){
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(9988);
System.out.println("------------等待客户端的连接--------------");
//等待客户端的连接、处于阻塞状态
while(true){
socket = serverSocket.accept();
manageConnection(socket);
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(socket != null)
socket.close();
if(serverSocket != null)
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void manageConnection(final Socket socket){
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
System.out.println("------------client--------------" + socket.hashCode() + "connedted");
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String clientMsg;
while((clientMsg = bufferedReader.readLine()) != null){//readLine() 如果没有信息,会处于阻塞状态
System.out.println("bufferedReader.hashCode()" + bufferedReader.hashCode() +
"====socket.hashCode():" + socket.hashCode()+
"====clientMsg:" + clientMsg);
bufferedWriter.write("server reply:" + clientMsg + "\n");
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(bufferedWriter != null)
bufferedWriter.close();
if(bufferedReader != null)
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
举报