从Java套接字读取数据时(Read Data from a Java Socket)

2019-09-04 01:20发布

我有一个Socket听一些X端口上。

我可以从我的客户端应用程序,但无法从服务器套接字任何响应的数据发送到插座。

  BufferedReader bis = new BufferedReader(new 
  InputStreamReader(clientSocket.getInputStream()));
  String inputLine;
  while ((inputLine = bis.readLine()) != null)
  {
      instr.append(inputLine);    
  }

..这部分代码从服务器读取数据。

但我不能从服务器读取任何东西,直到除非在服务器上关闭套接字。 服务器的代码是不是我的控制下,在其上做一些修改。

如何从客户端代码克服这一点。

谢谢

Answer 1:

到客户端和服务器之间进行通信,协议需要被很好的定义。

客户机代码块,直到线被从所述服务器接收到的,或插座被关闭。 你说,你只有一次关闭套接字收到东西。 所以,这可能意味着该服务器不会发送由EOL字符结束的文本行。 所述readLine()由此方法块,直到这样的字符流中找到,或者关闭套接字。 不要使用的readLine()如果服务器不发送行。 使用该方法适合于定义的协议(我们不知道)。



Answer 2:

貌似服务器可能没有发送换行符(这是什么的readLine()正在寻找)。 尝试的东西,不依赖于这一点。 下面是一个使用缓冲方法的例子:

    Socket clientSocket = new Socket("www.google.com", 80);
    InputStream is = clientSocket.getInputStream();
    PrintWriter pw = new PrintWriter(clientSocket.getOutputStream());
    pw.println("GET / HTTP/1.0");
    pw.println();
    pw.flush();
    byte[] buffer = new byte[1024];
    int read;
    while((read = is.read(buffer)) != -1) {
        String output = new String(buffer, 0, read);
        System.out.print(output);
        System.out.flush();
    };
    clientSocket.close();


Answer 3:

对我来说,这个代码是奇怪的:

bis.readLine()

我记得,这将尝试,直到他创立一个读入缓冲区'\n' 。 但是,如果从未发送?

我的丑版本打破任何的设计模式等建议,但总是工作:

int bytesExpected = clientSocket.available(); //it is waiting here

int[] buffer = new int[bytesExpected];

int readCount = clientSocket.read(buffer);

您应该添加验证错误和中断处理过。 随着web服务的结果,这是对我工作(2-10MB是最大的结果,我所发送)



文章来源: Read Data from a Java Socket
标签: java sockets tcp