0

对于我正在尝试创建的 mmo,我有一个连接到 java 服务器的 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 字符串构建器:

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

      }

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

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

4

2 回答 2

1

一个好的做法是在执行写入之后执行刷新。
这会强制写入套接字。
另外,我建议您将流的关闭放在最后部分
(我知道这与您的问题无关,但我想帮助您更好地编码。
所以结合了我的两个答案的代码,应该看起来像:

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
     }
   }
}
于 2012-07-16T17:55:51.630 回答
1

尝试这个:

outToServer.writeBytes(message+"\n");
outToServer.flush(); // Flush output to socket
modifiedSentence = inFromServer.readLine();

还要检查您的服务器是否实际接收到数据。

于 2012-07-16T17:27:20.797 回答