我有一个Socket听一些X端口上。
我可以从我的客户端应用程序,但无法从服务器套接字任何响应的数据发送到插座。
BufferedReader bis = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while ((inputLine = bis.readLine()) != null)
{
instr.append(inputLine);
}
..这部分代码从服务器读取数据。
但我不能从服务器读取任何东西,直到除非在服务器上关闭套接字。 服务器的代码是不是我的控制下,在其上做一些修改。
如何从客户端代码克服这一点。
谢谢
到客户端和服务器之间进行通信,协议需要被很好的定义。
客户机代码块,直到线被从所述服务器接收到的,或插座被关闭。 你说,你只有一次关闭套接字收到东西。 所以,这可能意味着该服务器不会发送由EOL字符结束的文本行。 所述readLine()
由此方法块,直到这样的字符流中找到,或者关闭套接字。 不要使用的readLine()如果服务器不发送行。 使用该方法适合于定义的协议(我们不知道)。
貌似服务器可能没有发送换行符(这是什么的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();
对我来说,这个代码是奇怪的:
bis.readLine()
我记得,这将尝试,直到他创立一个读入缓冲区'\n'
。 但是,如果从未发送?
我的丑版本打破任何的设计模式等建议,但总是工作:
int bytesExpected = clientSocket.available(); //it is waiting here
int[] buffer = new int[bytesExpected];
int readCount = clientSocket.read(buffer);
您应该添加验证错误和中断处理过。 随着web服务的结果,这是对我工作(2-10MB是最大的结果,我所发送)