从Java套接字读取数据

whlutmcx  于 2023-02-07  发布在  Java
关注(0)|答案(4)|浏览(135)

我有一个Socket正在侦听某个x端口。
我可以将数据从客户端应用程序发送到套接字,但无法从服务器套接字获得任何响应。

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

此代码部分从服务器读取数据。
但是我不能从服务器读取任何东西,除非服务器上的Socket被关闭。服务器代码不在我的控制之下,不能编辑它。
我如何从客户端代码中克服这个问题。
谢谢

ctrmrzij

ctrmrzij1#

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

20jt8wwn2#

为了在客户端和服务器之间通信,需要很好地定义协议。
客户端代码阻塞,直到从服务器接收到一行代码,或者套接字关闭。您说过只有在套接字关闭时才能接收到一些内容。因此,这可能意味着服务器不会发送以EOL字符结尾的文本行。readLine()方法因此阻塞,直到在流中找到这样的字符。或者套接字被关闭。如果服务器不发送行,不要使用readLine()。使用适合于定义的协议(我们不知道)的方法。

ep6jt1vc

ep6jt1vc3#

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

bis.readLine()

我记得,这将尝试读入一个缓冲区,直到找到一个'\n'。但是如果从来没有发送过呢?
我的丑陋版本打破了任何设计模式和其他建议,但总是工作:

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

int[] buffer = new int[bytesExpected];

int readCount = clientSocket.read(buffer);

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

jk9hmnmh

jk9hmnmh4#

下面是我的实现

clientSocket = new Socket(config.serverAddress, config.portNumber);
 BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

  while (clientSocket.isConnected()) {
    data = in.readLine();

    if (data != null) {
        logger.debug("data: {}", data);
    } 
}

相关问题