服务器未在客户端-服务器应用程序中接收消息

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处理