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



对于我试图创建的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 OKnnWorkerRunnable: " +
               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 "";}
      }

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

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

试试这个:

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

还要检查您的服务器是否真的收到了数据。

一个好的做法是在执行写入之后执行flush
这将强制在套接字上进行写入
此外,我建议您将流的结束置于finally部分
(我知道这与你的问题无关,但我想帮助你更好地编码。
因此,一个结合了我的两个答案的代码应该看起来像:

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

最新更新