我一直在寻找四个小时,这让我疯了。如果你需要更多的信息/代码问题我会编辑。
所以我有一个使用PrintWriter和BufferedReader连接到服务器的Android客户端。它的工作方式是启动一个新的ASyncTask()来加载连接。建立连接后,它会向服务器发送一条“Join”消息,然后加载一个监听线程,该线程有一个等待UserInput.readLine()!= null的while循环,一旦打破它就会返回一个运行一个进程的字符串获取字符串并执行操作的函数,并重新加载侦听任务。
//Listener thread
class listen extends AsyncTask<Integer, Integer, Void> {
@Override
protected Void doInBackground(Integer... params) {
//Disconnect variable that's only turned true on backpress
if (!disconnect) {
try {
message = Connection.listen(); //socket object
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// async task finished
if (!disconnect) {
say("INCOMMING"); //easy-made function for Toast
input(message);
}
}
}
并在那个连接中:
public String listen() throws IOException {
String userInput;
while ((userInput = in.readLine()) != null) {
}
return userInput;
}
现在在我的服务器java app中,我有一个线程将其他连接线程加载到ArrayList中,并作为总部向所有子客户端发送消息
在我的联系中:
while ((inputLine = in.readLine()) != null) {
//Tells HQ to process string, with id being who it's coming from
hq.Process(id, inputLine);
if (!connected)
break;
}
HQ对象中的:
public void Process(int id, String str) {
String[] msg = str.split(","); //split message
String send = " "; //string I print to console
if (msg[0].equals("join")) {
send = msg[1] + " has joined!";
parent.seats[cnew.get(id).seat] = id;
cnew.get(id).sendData();
System.out.println(id);
}
在加入之后,HQ告诉该连接将该播放器的信息发送到手机
public void sendData() {
out.println("chips," + chips); // Update chip count
//give player his cards
out.println("card," + hq.parent.gameCards.getCard(10) + ","
+ hq.parent.gameCards.getCard(11));
//a cry for help to get some output on the phone
out.println("error,SAY THIS");
// out.flush(); //commented out because it didn't help at all
System.out.println("sending id " + id); //debug checker (ignore this)
}
我的问题是,当我连接四部手机并且他们都互相发送祝酒时,它有效。 但是一旦我改变它以便在玩家加入时立即发回数据,我就不会在Android中得到回复。
我无法弄清楚它为什么不起作用。在服务器端,它正在通过所有内容(使用system.prints检查)。建立了连接,当我点击手机上的按钮时,服务器正在输出它的响应。但手机没有收到任何东西 - 我仍然不知道服务器是否无法发送或手机无法读取。您能在代码中看到可能导致此问题的任何内容吗?需要看更多?或者有关于如何调试连接状态的任何提示? listen()任务永远不会完成它的执行。
更新:所以我发现它可能与我在android端的while()循环有关,doh,可能永远不会破坏。愚蠢的错误。但我试图将其作为测试人员添加,但仍然没有:
public String listen() throws IOException {
String userInput;
while ((userInput = in.readLine()) != null) {
if (userInput.length() > 2)
break;
}
return userInput;
}
更新:下次绝望更新 - 当我点击“返回”(它将退出消息发送到关闭连接的服务器,并调用out.close和rest.close)然后我得到一个永无止境的“MSG”Toast循环 - 我输入的Toast是公认的。 out.close会导致阻塞吗?
答案 0 :(得分:2)
事实证明,服务器端的println没有打印新行 - 在服务器消息结束时添加+“\ n”使其通过。为什么?我不知道..