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

Java BufferedReader读取表单套接字不返回null,java,sockets,bufferedreader,Java,Sockets,Bufferedreader,我目前正在用Java编写一个应用程序,它可以打开一个套接字并通过它接收和发送数据 我的理解是,一旦缓冲区为空,BufferedReader.readLine将返回null。但是,我的代码不会退出从BufferedReader读取行的循环。 其思想是,我收到一个歌曲列表,然后将一个值发送到开始播放歌曲的服务器 代码如下: package me.frankvanbever.MediaServerClient; import java.io.BufferedReader; import java.i

我目前正在用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编写的,我可以更改源代码

我的理解是,一旦缓冲区为空,BufferedReader.readLine将返回null

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

不要忘记TCP和BufferedReader一样是面向流的。除非您将其放入协议中,否则不会显示完整的消息。这就是为什么协议通常包括消息终止符之类的东西,或者它们在发送消息之前指定消息中的数据量

我的理解是,一旦缓冲区为空,BufferedReader.readLine将返回null

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


不要忘记TCP和BufferedReader一样是面向流的。除非您将其放入协议中,否则不会显示完整的消息。这就是为什么协议通常包括消息终止符,或者他们在发送消息之前指定消息中的数据量。

因此我必须硬编码一种方法,让我的客户端知道服务器已停止发送内容?@FrankVanbever:您需要将其构建到协议本身中-服务器和客户端都需要对此达成一致。如果我在5秒钟内没有收到任何东西,我想我们已经完成了,但是面对缓慢的网络和快速的网络,这是非常脆弱的,此外,除非您的平台支持超时,否则编写代码相对比较困难。@FrankVanbever或者您可以在没有其他东西要发送时关闭连接,或者如果您需要保持连接打开,您可以发送一个空的like或一行like[End of Message]或您选择的内容。顺便说一句,电子邮件发送。因此,我必须硬编码一种方法,让我的客户知道服务器已停止发送内容?@FrankVanbever:你需要将它构建到协议本身中——服务器和客户都需要同意这一点。如果我在5秒钟内没有收到任何东西,我想我们已经完成了,但是面对缓慢的网络和快速的网络,这是非常脆弱的,此外,除非您的平台支持超时,否则编写代码相对比较困难。@FrankVanbever或者您可以在没有其他东西要发送时关闭连接,或者如果您需要保持连接打开,您可以发送一个空的like或一行like[End of Message]或您选择的内容。顺便说一句,电子邮件发送。在自己的线上。