Java 为什么我的代码在循环一段时间后停止?
我最近在处理套接字并在它们之间传输数据,当时我的程序在循环通过Java 为什么我的代码在循环一段时间后停止?,java,sockets,Java,Sockets,我最近在处理套接字并在它们之间传输数据,当时我的程序在循环通过InputStreamReader\read()后停止工作。 我完全不知道为什么会发生这种情况,我将感谢任何可能的帮助:) 这是我的密码: public class SocketClient { public static void main(String[] args) { String host = "localhost"; int port = 19999; St
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”消息,或者在这之后的任何其他消息
套接字的接收端(“服务器”)获得消息OK,并且正确地发送数据(我在套接字服务器上也使用了一些调试消息)
谁来帮帮我,我快死了 据推测,远程端从不发送“\r”(或ascii 13)- 因此,您的循环被阻塞,等待读取的结果。(您应该检查-1,它是通道的末尾)。从 已读取字符,如果已到达流的结尾,则为-1 而且,
-1
不是13
我很确定您的“服务器”进程不会发送13个字符
您可能想做的是返回
stuff+(char)13
所有内容都有一个try-catch,OP说没有打印任何内容。您是否尝试过使用调试器单步执行代码?调试器说了什么?看起来您的代码卡在了isr.read()
中,这是一种阻塞方法isr
可能包含除13
否之外的任何内容。它不会打印任何内容,问题是“awl”甚至不会打印,这是在while循环结束时,因此连接。close甚至不会被调用。以下是控制台输出:SocketClient初始化查询数据服务器:{“processType”:“retrieveCoin”,“uuid”:“82012e57-6a02-3233-8ee5-63cc5bb52cd1”}已成功发送数据。bis isr ic iwl 6 iwl 0 iwl 8 iwl 0
不太好-但尝试将捕获异常更改为捕获可丢弃-很可能是被丢弃的错误非常感谢!删除端实际上没有发送\r,这是我的问题,非常感谢!(我无意中注释掉了添加的(char)13
:)我已经通过添加字符解决了问题,请不要发布老问题!
while ((c = isr.read()) != 13)
{
System.out.println("iwl " + ((char) c));
instr += ((char) c);
}