gpt4 book ai didi

Java 套接字导致流过早结束

转载 作者:行者123 更新时间:2023-12-01 05:50:19 24 4
gpt4 key购买 nike

我正在设置连接到 XMPP 服务器的 comet 服务器。下面是它的过程:

客户端与 comet 服务器连接,并且打开套接字连接:

try {
radio = new Socket("server", 5222);
out = new PrintWriter(radio.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(radio.getInputStream()));
} catch (UnknownHostException e) {
System.out.println("Unknown host: "+e);
error = e.toString();
} catch(IOException e) {
System.out.println("IO error: "+e);
error = e.toString();
}

接下来,启动一个线程,等待来自套接字的数据:

public void run() {
System.out.println("Thread started.");
String data;
String error;
Client remote;
Client client;
while(!done) {
data = this.output();
remote = bayeux.getClient(remoteId);
client = bayeux.getClient(clientId);
if(data!=null) {
Map<String, Object> packet = new HashMap<String, Object>();
packet.put("xml", data);
remote.deliver(client, "/radio/from", packet, null);
}
error = this.error();
if(error!=null) {
Map<String, Object> packet = new HashMap<String, Object>();
packet.put("details", error);
remote.deliver(client, "/radio/error", packet, null);
}
/* try {
Thread.sleep(500);
}
catch (InterruptedException e ) {
System.out.println("Interrupted!"); } */
}

try {
in.close();
out.close();
radio.close();
} catch(IOException e) {
System.out.println("Error disconnecting: "+e);
error = e.toString();
}
System.out.println("Thread stopped.");
}

public String output() {
try {
String data = in.readLine();
System.out.println("From: "+data);
if(data==null) {
System.out.println("End of stream!");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//error = "End of stream.";
//this.disconnect();
}
return data;
} catch (IOException e) {
error = e.toString();
System.out.println("IO error! "+e);
}
return null;
}

从客户端收到的任何输入都会转发到 XMPP 服务器:

    public void input(String xml) {
System.out.println("To: "+xml);
out.println(xml);
}

这就是问题所在。客户端打开连接并将正确的 XML 发送到 XMPP 服务器以启动流。 in.readLine();挂起,因为它应该挂起,直到从服务器收到响应。收到后立即in.readLine();开始一遍又一遍地返回 null。这不应该发生;它应该挂起直到收到数据。服务器似乎不太可能关闭我,它还没有发送 </stream:stream>发出 XMPP 流结束的信号。关于可能出现的问题有什么想法吗?

感谢您的帮助!

最佳答案

请记住,XMPP 连接可以并且将会在一次读取中为您提供不完整的节或多个节。如果您的 COMET 连接期望您传递的内容是格式良好的 XML,那么您将会遇到问题。同样,XMPP 不是以换行符终止的,所以我不确定为什么您期望 readLine() 非常有用。

接下来,您是否在同一线程上的两个不同套接字上进行同步 I/O?听起来像是陷入僵局的良方。如果你坚持走这条路(而不是仅仅使用 BOSH ),我强烈建议你使用 NIO,而不是你的 sleep hack。

关于Java 套接字导致流过早结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4876951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com