關(guān)于2.3節(jié)多客戶端重連的問題
@郭霖,多客戶端連入那一節(jié)reader和writer設(shè)置成全局怎么感覺好怪異。比如A客戶端連接,服務(wù)器拿到A的Socket對象,然后創(chuàng)建了reader和writer對象保持和A客戶端的通信。這個時候B客戶端接入,服務(wù)器拿到B的Socket對象,然后創(chuàng)建reader和writer對象,這個時候全局的reader和writer指向了B客戶端所對應(yīng)的Socket,那服務(wù)器這個時候應(yīng)該失去和A客戶端的通信功能了呀,怎么你的還可以通信呢,求解答,謝謝。
2018-06-07
reader writer 設(shè)置為 類變量 然后開啟多個線程 會有線程安全問題吧
2015-07-20
老師的代碼是有問題的,錯誤在?
不該把?BufferedReader bufferedReader;BufferedWriter bufferedWriter; 設(shè)置為全局。
否則會造成 后面接入的客戶端 的BufferedReader?BufferedWriter 會替換掉前面的。也就是只能最后一個客戶端是可以通信的。 ?
老師的代碼:B客戶端接入時,會替換A客戶端的 BufferedReader?BufferedWriter ?僅僅只能通信一次(這個原因還有待研究,被B客戶端替換后理應(yīng)一次都不能通信)。
下面是我糾正后的測試代碼(通過BufferedReader?BufferedWriter的hashCode可以看出已經(jīng)替換替換了):?
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("------------等待客戶端的連接--------------");
//等待客戶端的連接、處于阻塞狀態(tài)
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() 如果沒有信息,會處于阻塞狀態(tài)
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();
}
}
2015-03-19
我也剛剛看到這個視頻,這段服務(wù)器端的代碼我也覺得很神奇啊,b客戶端接入,感覺reader,write都變成b的了,回不去a了,為什么a的客戶端還能通過reader writer跟服務(wù)器通信