[英]Java Socket client/server pair can only send one message at a time
可以在客戶端和服務器之間進行成功的對話。 但是,這僅在客戶端和服務器之間發送一條消息的情況下。
示例(工程):
Client: Hello
Server: helloo
Client: what time is it
Server: Let me get that for you
示例(不起作用):
Client: Hello
Server: helloo
Server: *How are you today*
Server: *test message*
Client: Yes
在客戶端發送2條消息之前,星號之間的消息不會出現在客戶端上。 據我了解,它似乎像一個網絡消息系統一樣工作,其中對於所有要顯示的消息,服務器發送的消息數必須等於客戶端發送的消息數的n + -1。
客戶端代碼:
try {
Socket client_socket= new Socket(hostname,port_number);
PrintWriter output = new PrintWriter(client_socket.getOutputStream(),true);
BufferedReader input = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
BufferedReader stdIn=new BufferedReader(new InputStreamReader(System.in));
String fromUser,fromServer;
while ((fromServer=input.readLine())!=null) {
System.out.println("Server: "+fromServer);
if (fromServer.equals("Quit")) {
break;
}
fromUser=stdIn.readLine();
if (fromUser!=null) {
System.out.println("Client: "+fromUser);
output.println(fromUser);
}
}
}
服務器端代碼:
try {
ServerSocket server_socket=new ServerSocket(port_number);
Socket client_socket= server_socket.accept();
PrintWriter output = new PrintWriter(client_socket.getOutputStream(),true);
BufferedReader input = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
BufferedReader stdIn=new BufferedReader(new InputStreamReader(System.in));
output.println("Established");
String fromUser, fromServer;
while ((fromUser=input.readLine())!=null) {
System.out.println("Client: "+fromUser);
if (fromUser.equals("Quit")) {
break;
}
fromServer=stdIn.readLine();
if (fromServer!=null) {
System.out.println("Server: "+fromServer);
output.println(fromServer);
}
}
}
查看代碼,我會明白為什么會發生這種情況,這是因為While
循環初始化之后的SOP停止了代碼等待1行輸入,然后等待發送自己的語句,然后再接收另一個語句。 我嘗試將它們放在if語句中,但這根本導致無法進行通信。
我似乎無法弄清楚如何解決此問題。
如果這需要線程,還有其他方法嗎? (我對線程不太熟悉)
根據您程序的性質,我建議您使用更多線程來處理消息傳遞。
讓我們從服務器開始:如果服務器可以有多個客戶端,那么用線程來區分每個客戶端可能是明智的,例如:
ServerSocket ss;
try {
ss = new ServerSocket(portIn);
while (true) {
Socket s = ss.accept();
// Option 1: runnable class
new Thread(new CustomRunnableClass(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
或者,如果您不希望“會話管理器”成為自定義可運行類,則可以替換new Thread(new CustomRunnableClass(s)).start();
與以下
new Thread(new Runnable() {
@Override
public void run() {
new SomeClass().runThisClass();
}
}
在客戶端,我建議通過新線程來區分偵聽套接字中新消息的任何類:
private void startListening() {
new Thread(new Runnable() {
@Override
public void run() {
for(;;) {
String msg = dis.readUTF();
System.out.println(" ----- Recieved New Message -----\n" + msg);
for (IMessageListener listener : listeners) {
try {
listener.onMessageRecieved(msg);
} catch (Exception e) {
}
}
}
}
}).start();
}
這樣,客戶端可以偵聽客戶端接收到的任何消息,並運行一種方法以在接收到消息時對其進行處理,並且同時不會被掛起。
希望這會有所幫助。
如果您需要非阻塞套接字,則在輸入緩沖區中沒有數據的情況下,讀取器函數應在中間返回。
http://www.java2s.com/Tutorials/Java/Java_Network/0070__Java_Network_Non-Blocking_Socket.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.