为什么我的java服务器和android客户端来回发送任何消息?

时间:2012-07-16 16:36:52

标签: java android tcp

对于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 "";}

      }

谢谢,任何帮助都将不胜感激。

编辑:更新如果我关闭客户端或服务器,另一个可以收到前者的消息,但如果两者都打开则不能...

2 个答案:

答案 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
     }
   }
}