【问题标题】:Java Sockets - Client message not reaching ServerJava 套接字 - 客户端消息未到达服务器
【发布时间】:2018-06-22 09:36:23
【问题描述】:

目前我正在尝试将多条消息从客户端发送到服务器并在服务器上回显它们,但不知何故我的消息没有到达服务器,直到我按 CTRL+Z(D) 并按 Enter 键。 只要用户不输入“退出”,我的循环就会运行,但尽管我将消息写入 OutputStream 并刷新它,但我的消息不会显示在服务器端,就好像我的客户端仍在读取输入一样。

(目前我不想使用 BufferedReaders 或 Threads,纯粹是出于学习原因。)

如果有人能告诉我我的错误/错误在哪里,那就太好了。 还阅读了 javadocs,但仍然找不到我的错误。

客户端.java

public class Client {
//class members
private String msg = null;
private Scanner scn = null;

public Client(String ip, int port) throws IOException {
    //Connect to Server
    try(Socket socket = new Socket(ip,port))
    {
        //Initialize class members
        scn = new Scanner(System.in); //Init Scanner
        msg="";

        System.out.println("Enter message:");
        //Write to Socket
        OutputStream out = socket.getOutputStream();    
        while(!msg.equals("quit"))
        {
            msg=scn.nextLine();
            out.write(msg.getBytes(), 0, msg.length());
            out.flush();
        }

    }
    catch (IOException ex)
    {
        System.err.println(ex);
    }
}

服务器.java

public class Server {
//class members
private String msg = null;

public Server(int port) throws IOException {
    //Setup ServerSocket.
    ServerSocket server = new ServerSocket(port);
    System.out.println("SERVER: Launched service.");
    //Accept incoming connection requests.
    while(true) {
        try(Socket connection = server.accept())
        {
            System.out.println("SERVER: Client connection accepted.");

            //Read Input
            StringBuilder line = new StringBuilder();

            InputStream in = connection.getInputStream();
            for(int c=in.read(); c!=-1; c=in.read())
            {
                line.append((char) c);
            }
            System.out.println(line);

        }
        catch (IOException ex)
        {
            System.out.println("SERVER: Client disconnected!");
        }
    }
}

真诚地, 雷利

【问题讨论】:

    标签: java loops sockets server client


    【解决方案1】:
    • read() 返回 -1 之前,您的服务器不会打印任何内容。
    • read() 在流结束时返回 -1。
    • 通过 TCP 套接字,流结束仅由对等方关闭连接引起。
    • 您的服务器的对等方,即客户端,在您在终端输入 ^Z 之前不会关闭连接。这会导致引发未声明的异常。

    您的程序正在按设计运行。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 2023-04-01
      • 2019-09-05
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2017-02-25
      • 1970-01-01
      相关资源
      最近更新 更多