服务器未在客户端-服务器应用程序中接收消息
Server doesn't receive message in client-server application
在我的客户端-服务器应用程序中,客户端向服务器发送消息,服务器应显示该消息。但是在我的情况下,客户端只能发送,而服务器不能实现。
我尝试过使用不同的端口号(即 8080、8000、4444 等)。貌似socket可以建立连接,但是真不知道为什么server端读取不到client的输入
这是我的完整项目(我在这里忽略了两个应用程序的主要 类,因为我除了调用方法之外别无其他):
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);
}
}
}
您的服务器不会将传入的文本写入控制台,而只会返回给尚未处理来自服务器的传入文本的客户端。
(出来的不是 System.out,而是 Socket.out!)
在您的服务器中,您正在 whileloop
中使用 readLine() 进行监听
while ((inputLine = in.readLine()) != null) {
System.out.println("inputLine "+inputLine);
这只是来自客户端的输入流。以上 SOP 将打印来自客户端的消息。尝试刷新您的流,因为在您的缓冲区已满之前它不会打印。
代码似乎没问题。如果你在服务器端和客户端都在 PrintWriter 上写一些东西,你会得到输出。
在服务器中添加以下代码:(使用 accept() 创建套接字后 API)
out.println("Hello from Server");
在客户端添加如下代码(创建Socket后)
out.println("Hello from client");
其他建议:
1) 在服务器接受套接字连接后创建一个线程,该线程应处理所有 IO 处理
2) 创建Socket with Server后,也可以在客户端创建线程。新线程应该处理所有IO处理
在我的客户端-服务器应用程序中,客户端向服务器发送消息,服务器应显示该消息。但是在我的情况下,客户端只能发送,而服务器不能实现。
我尝试过使用不同的端口号(即 8080、8000、4444 等)。貌似socket可以建立连接,但是真不知道为什么server端读取不到client的输入
这是我的完整项目(我在这里忽略了两个应用程序的主要 类,因为我除了调用方法之外别无其他):
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);
}
}
}
您的服务器不会将传入的文本写入控制台,而只会返回给尚未处理来自服务器的传入文本的客户端。
(出来的不是 System.out,而是 Socket.out!)
在您的服务器中,您正在 whileloop
中使用 readLine() 进行监听while ((inputLine = in.readLine()) != null) {
System.out.println("inputLine "+inputLine);
这只是来自客户端的输入流。以上 SOP 将打印来自客户端的消息。尝试刷新您的流,因为在您的缓冲区已满之前它不会打印。
代码似乎没问题。如果你在服务器端和客户端都在 PrintWriter 上写一些东西,你会得到输出。
在服务器中添加以下代码:(使用 accept() 创建套接字后 API)
out.println("Hello from Server");
在客户端添加如下代码(创建Socket后)
out.println("Hello from client");
其他建议:
1) 在服务器接受套接字连接后创建一个线程,该线程应处理所有 IO 处理
2) 创建Socket with Server后,也可以在客户端创建线程。新线程应该处理所有IO处理