我試圖實現一個客戶端 - 服務器應用程序,其中服務器可以接受來自客戶端的一些對象,並且對於每個對象,它必須將其解釋爲消息並且妥善處理。套接字服務器在同一個進程中一次只接受一個連接
下面是代碼:
(服務器)
public class GlobalServer{
GlobalServer(){new Thread(() ->{
try {
serverSocket = new ServerSocket(1234);
Socket clientSocket;
while (true) {
clientSocket = serverSocket.accept();
handleClient(clientSocket);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}).start();
}
public void handleClient(Socket clientSocket) throws IOException, ClassNotFoundException{
ObjectInputStream is = new ObjectInputStream(clientSocket.getInputStream());
Object [] objArr = (Object[]) is.readObject();
msgHandler(objArr, clientSocket);
}
public void msgHandler(Object [] objArr, Socket clientSocket){
int msg_type = (int) objArr[0];
switch (msg_type) {
case 1:
System.out.println("type 1 received");
break;
case 2:
System.out.println("type 2 received");
break;
case 3:
System.out.println("type 3 received");
break;
default:
break;
}
}
public static void main(String [] args){
GlobalServer s = new GlobalServer();
}
}
OBS:上的應用是有意義,因爲每個消息中攜帶它的報頭(類型)和它的內容爲接收對象的陣列
(客戶端)
public class Client {
public static void main(String [] args){
try {
Socket client = new Socket("192.168.0.105", 1234);
ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());
Object [] objArr = {3, "Type 3 message"};
os.writeObject(objArr);
Object []objArr1 = {1, "Type 1 message"};
os.writeObject(objArr1);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我對組合通道運行GlobalServer的實例吃了機器,並在另一臺機器上連接到服務器,並順序發送兩條消息。問題在於服務器只接收並處理第一條消息,第二條消息丟失,客戶端沒有服務器接收到第二條消息。奇怪的是,如果我將這兩個messagens作爲兩個不同的aplications發送,服務器就可以很好地處理它。這與在同一過程中發送的兩條消息有關嗎?
代碼工作作爲diferent aplications:
(消息1)
public class Message1 {
public static void main(String [] args){
try {
Socket client = new Socket("192.168.0.105", 1234);
ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());
Object [] objArr = {3, "Type 3 message"};
os.writeObject(objArr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
(消息2)
public class Message2 {
public static void main(String [] args){
try {
Socket client = new Socket("192.168.0.105", 1234);
ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());
Object []objArr1 = {1, "Type 1 message"};
os.writeObject(objArr1);
} catch (IOException e) {
e.printStackTrace();
}
}
}
嘗試寫他們通過os.flush到的ObjectOutputStream() – Sanjeev
同樣的事情後,沖洗你的對象,然後處理第一個忽略了同樣的過程 –