对于mmo我正在尝试创建,我有一个连接到java服务器的android客户端。当服务器在我的计算机上直接运行时,android正在模拟器上运行。他们可以很好地连接并确认连接,但客户端停在一个奇怪的地方,我无法弄清楚原因。
服务器的WorkerThread的Run方法:
public void run() {
try {
InputStream input = clientSocket.getInputStream();
OutputStream output = clientSocket.getOutputStream();
String returns="";
String s="";
try{
s= inputStreamToString(input).toString();
}
catch(Exception e)
{}
output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " +
this.serverText + " - " +
"").getBytes());
output.close();
input.close();
} catch (IOException e) {
//report exception somewhere.
e.printStackTrace();
}
}
InputStream stringbulider:
private static StringBuilder inputStreamToString(InputStream is) {
String line = "";
StringBuilder total = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((line = rd.readLine()) != null) {
total.append(line);
}
} catch (Exception e) {
}
return total;}
客户端的连接方法:
public String sendMessage(String message)
{
try{ clientSocket = new Socket("10.0.2.2", 9000);
String modifiedSentence;
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(message+"\n");
//Stops here
modifiedSentence = inFromServer.readLine();
outToServer.close();
inFromServer.close();
clientSocket.close();
Log.v(modifiedSentence, modifiedSentence);
return modifiedSentence;}
catch(Exception e)
{
return "";}
}
谢谢,任何帮助都将不胜感激。
编辑:更新如果我关闭客户端或服务器,另一个可以收到前者的消息,但如果两者都打开则不能...
答案 0 :(得分:1)
试试这个:
outToServer.writeBytes(message+"\n");
outToServer.flush(); // Flush output to socket
modifiedSentence = inFromServer.readLine();
同时检查服务器是否确实收到了数据。
答案 1 :(得分:1)
一个好的做法是在执行写操作后执行flush。
这会强制写入套接字。
另外,我建议你把溪流的关闭放在最后的部分中
(我知道这与您的问题没有关系,但我想帮助您更好地编码
因此,结合我的答案的代码应该如下所示:
OutputStream outStream = .... //Get it somehow
try {
outStream.write(data);
outStream.flush();
//Do other stuff if needed
} catch (Exception ex) {
//Do something with the exception
}
finally {
if (outStream != null) {
try {
outStream.close();
} catch (IOException ioex) {
//Ignore
}
}
}