0

私が作成しようとしている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 "";}

      }

おかげで、どんな助けもいただければ幸いです。

編集:クライアントまたはサーバーのいずれかを閉じると、もう一方は前者のメッセージを受信できますが、両方が開いていると受信できません...

4

2 に答える 2

1

これを試して:

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

また、データが実際にサーバーによって受信されているかどうかを確認してください。

于 2012-07-16T17:27:20.797 に答える
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 に答える