[英]Server doesn't receive message in client-server application
在我的客戶端服務器應用程序中,客戶端向服務器發送消息,服務器應顯示該消息。 但是在我的情況下,客戶端只能發送但服務器無法發送。
我嘗試使用不同的端口號(即8080、8000、4444等)。 套接字似乎可以建立連接,但是我真的不知道為什么服務器無法讀取客戶端的輸入。
這是我的完整項目(我在這里忽略了這兩個應用程序的主類,因為我只不過是調用方法而已):
EchoServer.java:
package client.server;
import java.io.*;
import java.net.*;
public class EchoServer {
public EchoServer() {
}
public void establish() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8080);
} catch (IOException e) {
System.out.println("Could not listen on port: 1234");
System.exit(-1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("Accept failed: 1234");
System.exit(-1);
}
PrintWriter out = null;
BufferedReader in = null;
try {
out = new PrintWriter(
clientSocket.getOutputStream(), true);
in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
} catch (IOException ioe) {
System.out.println("Failed in creating streams");
System.exit(-1);
}
String inputLine, outputLine;
try {
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
if (inputLine.equals("Bye.")) {
break;
}
}
} catch (IOException ioe) {
System.out.println("Failed in reading, writing");
System.exit(-1);
}
try {
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
System.out.println("Could not close");
System.exit(-1);
}
}
}
EchoClient.java:
package server.client;
import java.io.*;
import java.net.*;
public class EchoClient {
public EchoClient() {
}
public void establish() {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
//echoSocket = new Socket(InetAddress.getLocalHost(), 1234);
echoSocket = new Socket(InetAddress.getLocalHost(), 8080);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O");
System.exit(1);
}
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;
try {
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
if (userInput.equals("Bye.")) {
break;
}
System.out.println("echo: " + in.readLine());
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
} catch (IOException ioe) {
System.out.println("Failed");
System.exit(
-1);
}
}
}
您的服務器不會將傳入的文本寫到控制台,而只會寫回到尚未處理來自服務器的傳入文本的客戶端。
(out不是System.out,而是Socket.out!)
在服務器中,您正在while循環中使用readLine()進行監聽
while ((inputLine = in.readLine()) != null) {
System.out.println("inputLine "+inputLine);
這不過是客戶端的輸入流。 上面的SOP將打印來自客戶端的消息。 嘗試刷新流,因為直到緩沖區已滿,它才會打印。
代碼似乎很好。 如果您在服務器端和客戶端都在PrintWriter上寫了一些東西,您將得到輸出。
在服務器中添加以下代碼:(使用accept()API創建Socket之后)
out.println("Hello from Server");
在客戶端中添加以下代碼(創建套接字后)
out.println("Hello from client");
其他建議:
1)一旦在服務器上接受套接字連接,就創建一個線程,該線程應處理所有IO處理
2)使用Server創建Socket之后,您也可以在客戶端創建線程。 新線程應處理所有IO處理
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.