Java BufferedReader 读取表单套接字不返回 null

标签 java sockets bufferedreader

我目前正在用 Java 编写一个应用程序,它打开一个套接字并且应该通过它接收和发送数据。

据我了解,一旦缓冲区为空,BufferedReader.readLine() 就会返回 null。但是,我的代码不会退出从 BufferedReader 读取行的循环。 我的想法是,我收到一个歌曲列表,然后将一个值发送到歌曲开始播放的服务器。

这是代码:

package me.frankvanbever.MediaServerClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

        public class MediaServerClient {

            /**
             * @param args
             */
            public static void main(String[] args) {

                    Socket server;
                    try {
                        server = new Socket( "10.42.0.41" , 2626 );

                        InputStream in = server.getInputStream();
                        OutputStream out = server.getOutputStream();

                        BufferedReader bin = new BufferedReader( new InputStreamReader( in ) , 4096);

                        String inputline;
                        while( (inputline = bin.readLine()) != null){

                            System.out.println(inputline);

                        }

                        System.out.println("exited loop");
                        out.write('1');
                    } catch (UnknownHostException e) {
                    } catch (IOException e) {
                    }


            }

    }

这是正常行为吗?服务器是用 python 编写的,我可以更改源代码。

最佳答案

It is my understanding that BufferedReader.readLine() returns null once the buffer is empty.

没有。一旦基础返回被关闭,它将返回null。如果您要连接的服务器没有关闭连接,BufferedReader 将挂起,等待下一行文本。

不要忘记 TCP 是面向流的(BufferedReader 也是如此)。除非你把它放在你的协议(protocol)中,否则没有“完整消息”的迹象。这就是为什么协议(protocol)通常包含消息终止符之类的内容,或者它们在发送消息之前指定消息中包含多少数据。

关于Java BufferedReader 读取表单套接字不返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384186/

相关文章:

java - 编译 java 文件并将文件传递到 stdin 会出现错误

java - 当我尝试将 BufferedReader 中的字符串放入字符串数组时出现 NullPointer 异常

java - 如何在不关闭 BufferedReader 的情况下从客户端向服务器发送多个答案

Java Guava 过滤两个不同类型的集合

perl - 想要在 Perl 中通过 IPv6 链接本地 IP 发送 UDP 数据包

java - 带有反射的 ClassCastException

Python 套接字模块 : How to change the local port on the client side?

c - accept() 返回无效参数

java - 如何修复 Android 中的 "Call requires API level 26 (current min is 25) "错误

java - 有没有好的Java跨平台SIP/VOIP开发包?