【发布时间】:2014-09-16 14:41:21
【问题描述】:
我最近在处理套接字并在它们之间传输数据时,我的程序在循环通过 InputStreamReader#read() 后刚刚停止工作。
我完全不知道为什么会这样,如果有任何帮助,我将不胜感激:)
这是我的代码:
public class SocketClient
{
public static void main(String[] args)
{
String host = "localhost";
int port = 19999;
String instr = "";
System.out.println("SocketClient initialized");
try
{
InetAddress address = InetAddress.getByName(host);
Socket connection = new Socket(address, port);
BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream());
OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");
String process = "{\"processType\":\"retrieveCoin\",\"uuid\":\"82012e57-6a02-3233-8ee5-63cc5bb52cd1\"}" + (char) 13;
System.out.println("Querying Data Server: " + process);
osw.write(process);
osw.flush();
System.out.println("Sent data successfully.");
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
System.out.println("bis");
InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");
System.out.println("isr");
int c;
System.out.println("ic");
while ((c = isr.read()) != 13)
{
System.out.println("iwl " + ((char) c));
instr += ((char) c);
}
System.out.println("awl");
connection.close();
System.out.println("Recieved data: " + instr);
}
catch (Exception ex)
{
System.out.println("Exception: " + ex);
}
}
}
在 while 循环结束之前,控制台输出都很好,因为“awl”消息不会打印,或者之后的任何其他内容都不会打印。
套接字的接收端(“服务器”)可以正常接收消息,并正确发送数据(我也在套接字服务器上使用一些调试消息)。
请有人帮助我,我快死在这里了!
【问题讨论】:
-
所有内容都有一个try-catch,并且OP说没有打印任何内容。
-
您是否尝试使用调试器单步执行代码?
-
调试器说什么?看起来您的代码卡在
isr.read()中,这是阻塞方法。isr可以包含除13之外的任何内容 -
不,它不打印任何东西,问题是“awl”甚至没有被打印,这是在while循环结束时,所以connection.close甚至没有被调用。这是控制台输出:
SocketClient initialized Querying Data Server: {"processType":"retrieveCoin","uuid":"82012e57-6a02-3233-8ee5-63cc5bb52cd1"} Sent data successfully. bis isr ic iwl 6 iwl 0 iwl 8 iwl 0 -
不是很好 - 但尝试将 catch Exception 更改为 catch Throwable - 万一它抛出错误