Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java套接字读取数据_Java_Sockets_Tcp - Fatal编程技术网

从Java套接字读取数据

从Java套接字读取数据,java,sockets,tcp,Java,Sockets,Tcp,我有一个插座在监听某个x端口 我可以从客户端应用程序将数据发送到套接字,但无法从服务器套接字获得任何响应 BufferedReader bis = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; while ((inputLine = bis.readLine()) != null) { instr.append(inputLi

我有一个插座在监听某个x端口

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

  BufferedReader bis = new BufferedReader(new 
  InputStreamReader(clientSocket.getInputStream()));
  String inputLine;
  while ((inputLine = bis.readLine()) != null)
  {
      instr.append(inputLine);    
  }
。。此代码部分从服务器读取数据

但除非服务器上的套接字关闭,否则我无法从服务器读取任何内容。 服务器代码不在我的控制之下,无法对其进行编辑

如何从客户端代码中克服此问题


谢谢

对我来说,这段代码很奇怪:

bis.readLine()
我记得,这将尝试读取缓冲区,直到他找到一个
'\n'
。但如果它从未被发送过呢

我的丑陋版本打破了任何设计模式和其他建议,但始终有效:

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

int[] buffer = new int[bytesExpected];

int readCount = clientSocket.read(buffer);
您还应该添加错误和中断处理的验证。
对于webservices结果,这对我来说是有效的(2-10MB是最大的结果,我已经发送了)

看起来服务器可能没有发送换行符(这是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();

为了在客户机和服务器之间进行通信,需要很好地定义协议


客户端代码会一直阻塞,直到从服务器收到一行代码,或者套接字关闭。你说过你只有在插座关闭后才能收到东西。因此,这可能意味着服务器不发送以EOL字符结尾的文本行。因此,
readLine()
方法会一直阻塞,直到在流中找到这样的字符,或者套接字关闭为止。如果服务器不发送行,请不要使用readLine()。使用适用于已定义协议的方法(我们不知道)。

以下是我的实现

clientSocket=新套接字(config.serverAddress,config.portNumber);
BufferedReader in=新的BufferedReader(新的InputStreamReader(clientSocket.getInputStream());
while(clientSocket.isConnected()){
data=in.readLine();
如果(数据!=null){
debug(“数据:{}”,data);
} 
}

听起来好像服务器没有刷新输出。如果是这样的话,据我所知,你对此无能为力。是的,但在这种情况下,我无法控制服务器。。对此有什么建议吗?好的,我现在理解了
readLine()
,但是是否有任何标准机制可以完全读取数据(请查看服务器协议;)是,从流中读取字节直到返回-1,这表示套接字已关闭。但是,如果你连什么都不知道,接受什么又有什么意义呢?我理解定义明确的概念。我也有同样的问题。在我的服务器上,我使用一个BufferedWriter和writeLine(),然后刷新它。我仍然没有从缓冲输入流的readLine()中获得任何信息。将writeLine()与readLine()配合使用不是定义良好吗?我试着用两种方式发送信息,但没有收到任何信息。我已验证是否建立了连接。@ydobonebi发布您自己的问题,以及诊断问题所需的相关代码。您根本不需要调用available(),而且它不可靠。只要读入一个固定大小的缓冲区。available()的正确用法很少,这不是其中之一。@EJP我写的它不正确,我告诉它正在工作,你的问题是什么?