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

时间:2013-05-05 11:45:08

标签: 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编写的,我可以更改源代码。

1 个答案:

答案 0 :(得分:5)

  

我的理解是,一旦缓冲区为空,BufferedReader.readLine()就会返回null。

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

不要忘记TCP是面向流的(就像BufferedReader)。除非您将其放入协议中,否则没有任何“完整消息”的迹象。这就是为什么协议通常包含消息终止符之类的东西,或者它们在发送之前指定消息中有多少数据。