【问题标题】:Java ServerSocket OutputStream not flushingJava ServerSocket OutputStream 不刷新
【发布时间】:2020-09-12 14:04:50
【问题描述】:

如果我关闭 OutputStream,我的 ServerSocket (java.net.ServerSocket) 只会刷新数据,但如果我关闭 OutputStream,它会关闭连接。这是我的代码

服务器:

ServerSocket server = new ServerSocket(7788);
Socket client = server.accept();

OutputStream os = client.getOutputStream();

os.write("Hello World".getBytes());
os.flush();
// os.close();

客户:

Socket client = new Socket("localhost", 7788);

byte[] bytes = client.getInputStream().readAllBytes();
String message = new String(bytes);

System.out.println(message);

如果我关闭 OutputStream 一切正常,但我需要为我的项目多次发送数据。有解决办法吗?

【问题讨论】:

    标签: java sockets serversocket outputstream


    【解决方案1】:

    问题不是OutputStream(服务器)上的flush(),而是InputStream(客户端)上的readAllBytes()。来自docs(强调我的):

    public byte[] readAllBytes() 抛出 IOException

    从输入流中读取所有剩余的字节。 此方法阻塞 直到所有剩余的字节都被读取并且流的结尾是 检测到,或抛出异常。

    end of stream 仅在close() 上“发送”,这就是为什么您只能在close() 之后阅读(打印)消息。

    交换单行文本数据的一个非常简单的解决方案是发送由 '\n'(换行)字符分隔的消息,并在客户端部分从套接字逐行读取,例如:

    Server.java

    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server
    {
            public static void main(String[] args) throws Exception
            {
                    ServerSocket server = new ServerSocket(7788);
                    Socket client = server.accept();
    
                    OutputStream os = client.getOutputStream();
                    for (int i = 0; i < 5; i++) {
                            os.write(String.format("message %d\n", i).getBytes());
                            os.flush();
    
                            Thread.sleep(2000);
                    }
    
                    os.close();
            }
    }
    

    Client.java

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    public class Client
    {
            public static void main(String[] args) throws Exception
            {
                    Socket client = new Socket("localhost", 7788);
    
                    BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String message = null;
                    while ((message = reader.readLine()) != null)
                            System.out.println(message);
    
                    reader.close();
            }
    }
    

    $ javac Server.java Client.java
    $ java Server
    

    $ java Client
    message 0
    message 1
    message 2
    message 3
    message 4
    $
    

    如果您运行上面的代码,您将看到消息一个接一个地打印(接收),延迟 2 秒,readLine() 在读取到\n(新行)字符后立即返回。

    如果这对您的用例不可行,我认为您将需要一个更结构化的协议。

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2018-08-26
      相关资源
      最近更新 更多