2016-12-16 8 views
1

私はこれに関連するすべての投稿をチェックしましたが、私の問題に答えるものはありません。とにかく、私はソケットを使って簡単なチャットサーバー - クライアントアプリケーションを作っています。下のコードでは、サーバーは常にクライアントにデータを送信できますが、クライアントがサーバーに送信すると、クライアントにデータを送信しない限りサーバーのUIに表示されません。たとえば、次のクライアントの状況にAndroidサーバーソケットがすぐに聴いていない

サーバー:

Serverは ""
サーバーが表示さ ""
クライアントは、クライアントのUIで "A" を表示する ""
サーバーUIのクライアントrecievesを送信

サーバは、クライアントが "B"
をrecieves
ServerのUIに "B"
サーバーが表示さ "B" を送信しますクライアントは、 "C"
クライアント

クライアントUIの "C" を表示recievesクライアントUIでクライアントディスプレイ "B"

サーバーは、サーバーUIで "C"
サーバー表示 "C" を送信
サーバーの状況にクライアント:

クライアントが
Serverは何もを受けていないクライアントのUIで ""
クライアントディスプレイ "A" を送信します210 Serverは断絶がサーバーUI
で以前
サーバーディスプレイ "A" から "A" //を受け
ServerのUIに "B"
サーバーディスプレイ "B" を送信サーバーUI

サーバーに何も表示されませんクライアントが

クライアントが
クライアントが
クライアントが "W"を送信し、クライアントUIで "Q" を表示する "Q" を送信サーバーのUIに "B"
クライアントディスプレイ "B" を受信しますクライアントのUIで クライアントディスプレイ "W"
クライアントが
Serverは、 "Q"、 "W"、または "E"
サーバーが送信する」のどれを受けていないクライアントのUIで "E"
クライアントディスプレイ "E" を送信します『サーバーのUIで
クライアントが受け取る『P 『サーバーUIで
サーバーが表示さ』」
サーバーディスプレイ』P EクライアントUIに

をP』
クライアントのディスプレイ 『P』をあなたがこれを引き起こしているどう思いますか?私が望むのは、何度もクライアントがデータを送信したときに、サーバーが自分の現在の状況を何もクリックすることなく受信したときだけです。クライアントはサーバーのデータを正常に受信します。どんな答え

Client.java

//imports... 

public class RawClient extends Activity { 

int portNo = 8080; 

//globals.. 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_client); 

    editTextAddress = (EditText) findViewById(R.id.address); 
    buttonConnect = (Button) findViewById(R.id.connect); 
    textResponse = (TextView) findViewById(R.id.response); 
    buttonConnect.setOnClickListener(buttonConnectOnClickListener); 

} 


View.OnClickListener buttonConnectOnClickListener = 
     new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       MyClientTask myClientTask = new MyClientTask(
         editTextAddress.getText().toString(), 
         portNo); 
       myClientTask.execute(); 
      } 
     }; 

public class MyClientTask extends AsyncTask<Void, Void, Void> { 

    String dstAddress; 
    int dstPort; 
    String response = ""; 

    MyClientTask(String addr, int port) { 
     dstAddress = addr; 
     dstPort = port; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     Socket socket = null; 

     try { 
      socket = new Socket(dstAddress, dstPort); 

      ByteArrayOutputStream byteArrayOutputStream = 
        new ByteArrayOutputStream(1024); 
      byte[] buffer = new byte[1024]; 

      int bytesRead; 
      InputStream inputStream = socket.getInputStream(); 

/* 
* notice: 
* inputStream.read() will block if no data return 
*/ 
      while ((bytesRead = inputStream.read(buffer)) != -1) { 
       byteArrayOutputStream.write(buffer, 0, bytesRead); 
       response += byteArrayOutputStream.toString("UTF-8"); 
      } 

     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "UnknownHostException: " + e.toString(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "IOException: " + e.toString(); 
     } finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     textResponse.setText("Connected"); 
     textResponse.setTextColor(Color.parseColor("#2eb82e")); 
     buttonConnect.setEnabled(false); 

     //reinstantiated thread to recieve messages from server/send message to server 
     sendData = new ClientPassData(
       editTextAddress.getText().toString(), 
       portNo); 
     sendData.execute(); 
    } 

} 

//class called to send data.. 
public class ClientPassData extends AsyncTask<Void, Void, Void> { 
    String dstAddress; 
    int dstPort; 
    String getResponse = ""; 

    ClientPassData(String addr, int port) { 
     dstAddress = addr; 
     dstPort = port; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     Socket socket = null; 

     try { 
      socket = new Socket(dstAddress, dstPort); 

      //send data to client  
      PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
        .getOutputStream())), true); 
      out.println("" + my_answer); 
      out.flush(); 

      ByteArrayOutputStream byteArrayOutputStream = 
        new ByteArrayOutputStream(1024); 
      byte[] buffer = new byte[1024]; 

      int bytesRead; 
      InputStream inputStream = socket.getInputStream(); 
/* 
* notice: 
* inputStream.read() will block if no data return 
*/ 
      //recieve data from server 
      if (inputStream == null) { 

      } 
      while ((bytesRead = inputStream.read(buffer)) != -1) { 
       byteArrayOutputStream.write(buffer, 0, bytesRead); 
       getResponse += byteArrayOutputStream.toString("UTF-8"); 

      } 

     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      getResponse = "UnknownHostException: " + e.toString(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      getResponse = "IOException: " + e.toString(); 
     } finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      //do anything with recieved message 
      //reinstantiate itself to continue listening to server 
     sendData = new ClientPassData(
       editTextAddress.getText().toString(), 
       portNo); 
     sendData.execute(); 
     // } 

    } 

} 

public void cl_send(View view) { 
    if(cl_input.getText().toString().length() <= 0){ 
     Toast t = Toast.makeText(getApplicationContext(), "Cannot Send Empty String", Toast.LENGTH_SHORT); 
     t.show(); 
    } else { 
     sendData = new ClientPassData(
       editTextAddress.getText().toString(), 
       portNo); 
     //set data to send to server here 
     //send! 
     sendData.execute(); 
    } 
} 
} 

サーバーをありがとう。java

//imports.. 

public class RawServer extends Activity { 

//globals.. 

TextView info, infoip, serverEnemScore, txtServMyScore; 
String message = ""; 
ServerSocket serverSocket; 

String lastAnswer = ""; 

Socket globalSocket; 
Thread socketServerThread; 

int round = 1; 
int play = 0; //counter to know how many iterations of the game had happened. 
int servMyScore = 0; //variable that holds my score... 
int servEnemyScore = 0; 
String passValue = "", ser_myAnswer = ""; 

SocketServerReplyThread servePass; 

String lineChat = null; //String that will hold message of Client from InputStream 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_server); 

    initiailize(); 

    infoip = (TextView) findViewById(R.id.infoip); 

    infoip.setText(getIpAddress()); 

    socketServerThread = new Thread(new SocketServerThread()); 
    socketServerThread.start(); //starts listening to connecting clients 
} 

private String getIpAddress() { 
    String ip = ""; 
    try { 
     Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface 
       .getNetworkInterfaces(); 
     while (enumNetworkInterfaces.hasMoreElements()) { 
      NetworkInterface networkInterface = enumNetworkInterfaces 
        .nextElement(); 
      Enumeration<InetAddress> enumInetAddress = networkInterface 
        .getInetAddresses(); 
      while (enumInetAddress.hasMoreElements()) { 
       InetAddress inetAddress = enumInetAddress.nextElement(); 

       if (inetAddress.isSiteLocalAddress()) { 
        ip += "SiteLocalAddress: " 
          + inetAddress.getHostAddress() + "\n"; 
       } 
      } 
     } 
    } catch (SocketException e) { 
     e.printStackTrace(); 
     ip += "Something Wrong! " + e.toString() + "\n"; 
    } 

    return ip; 
} //end of getIpAddress 

public void send(View v){ 
    servePass = new SocketServerReplyThread(globalSocket, score); 
    ser_myAnswer = input.getText().toString(); 
    rowMessages.add(new RowMessage(me, ser_myAnswer)); //add to arraylist 
    adapter.notifyDataSetChanged(); //updates the adapter na naay nadungag na data sa arraylist 
    scrollMyListViewToBottom(); 
    input.setText(""); 
    servePass.run(); 
} 

private class SocketServerThread extends Thread { 

    static final int SocketServerPORT = 8080; 
    int count = 0; 
    boolean flag = false; 

    @Override 
    public void run() { 
     try { 
      serverSocket = new ServerSocket(SocketServerPORT); 

      while (true) { 
       Socket socket = serverSocket.accept(); 
       globalSocket = socket; 

       final SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
         socket, count); 


       BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       lineChat = in.readLine(); 

       RawServer.this.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         if(!lineChat.equals(lastAnswer) && lineChat.length() > 0){ 
          lastAnswer = lineChat; 
          //display answer from client here 
         } 
        } 
       }); 

      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 


private class SocketServerReplyThread extends Thread { 

    private Socket hostThreadSocket; 
    int cnt; 

    SocketServerReplyThread(Socket socket, int c) { 
     hostThreadSocket = socket; 
     cnt = c; 
    } 

    @Override 
    public void run() { 
     OutputStream outputStream; 
     String msgReply; 

     try { 
     //send data to client 
      outputStream = hostThreadSocket.getOutputStream(); 
      PrintStream printStream = new PrintStream(outputStream); 
      printStream.print(msgReply); 
      printStream.close(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      message += "Something wrong! " + e.toString() + "\n"; 
     } 

    } 

} 

} 

答えて

0

コードが正常であっても、この種の問題が発生する可能性があります。たとえば、サーバーに負荷がかかり、ネットワークが成熟する可能性があります。あなたは何らかの保護が必要です。

たとえば、クライアントから送信された各メッセージを増分することができます。サーバーがメッセージ2の前にメッセージ3を受信すると、サーバーは5〜6秒待機します。この時間中にメッセージを受信した場合は、2と3を書き込むことができます。受信しなかった場合は、メッセージ3を書き込むことができます。

したがって、ネットワークの問題を防ぐために、選択した論理システムを実装する必要があります。

関連する問題