我有一個簡單的服務器多客戶端程序,將用戶的輸入發送給每個人。 服務器獲取消息,然後系統地將它們發送給每個人。爲什麼我的服務器沒有響應輸入,直到斷開連接?
我遇到的問題是,服務器獲取消息,但直到從服務器斷開連接後才發回。我爲每個用戶都有一個線程,並且有一個線程發送消息。
這裏是主服務器:
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(25566);
SendThread SendThread = new SendThread();
new Thread(SendThread).start();
while(true){
Socket clientSocket = serverSocket.accept();
CollectThreads socketThread = new CollectThreads(clientSocket);
SendThread.Clients.add(socketThread);
new Thread(socketThread).start();
}
}
這裏是輸入線程(CollectThreads):
public Socket Client;
public CollectThreads(Socket socket)
{
//Here we set the socket to a local variable so we can use it later
Client = socket;
}
@Override
public void run() {
System.out.println("i");
try{
PrintWriter out = new PrintWriter(Client.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(Client.getInputStream()));
out.println("Connected");
boolean x = true;
while(x){
String s;
if((s = in.readLine()) != null){
System.out.println(s);
SendThread.log.add(s);
}
}
} catch(IOException exception) {
System.out.println("Error: " + exception);
}
}
和發件人(SendThread):
public ArrayList<CollectThreads> Clients = new ArrayList<CollectThreads>();
public static ArrayList<String> log = new ArrayList<String>();
@Override
public void run() {
try{
while(true){
String x;
while(!Clients.isEmpty()){
x = log.get(0);
for(int c = 0; c < Clients.size(); c += 1){
PrintWriter out = new PrintWriter(Clients.get(c).Client.getOutputStream(), true);
out.println(x);
System.out.println(x);
}
log.remove(0);
}
}
} catch(IOException exception) {
System.out.println("Error: " + exception);
}
}
如果我輸入x,服務器控制檯打印x,我斷開連接,然後第二次打印x。 任何人都可以找到我的錯誤?或告訴我爲什麼這不起作用?
您的服務器不會對readLine()正確返回null做出反應。它應該關閉套接字並退出循環。目前它在EOS上很難循環。 – EJP
@EJP這是一個模擬,看看這個工程,我會盡快修復 – Hiblah200
模擬ups仍然需要工作。第一次做錯了沒有好處。它只是給你別的東西來解決。 – EJP