2016-12-16 2 views
1

Я проверил каждую связанную с этим запись, но никто не отвечает на мою проблему. Во всяком случае, я делаю простое приложение-клиент-клиент чата с помощью сокетов. В приведенном ниже коде происходит, что сервер всегда может отправлять данные клиенту, но когда клиент отправляет сервер, он не отображается в пользовательском интерфейсе сервера, если вы не отправляете данные клиенту. Например:Android-Socket Socket не прослушивает сразу

сервера для клиента ситуации:

Сервер посылает "A"
сервер отображает "A" в сервере UI
Client recieves "A"
клиент отображает "A" в Client UI

сервер посылает "B"
Сервер отображает "B" в пользовательском интерфейсе сервера
Клиент recieves "B"
клиент отображает "B" в Client UI

Сервер отправляет "C"
Сервер отображает "C" в серверной UI
Клиент recieves "C"
клиент отображает "C" в Client UI

Клиент для сервера ситуации:

Клиент посылает "A"
клиент отображает "A" в Client UI
Сервер не получает ничего
отображают сервера ничего сервера UI

Сервер посылает "B"
сервера отображается "B" в сервере UI
Sever получает "A" // из предыдущих
дисплеев Server "A" в сервере UI
Клиент получает "B"
клиент отображает "B" в пользовательском интерфейсе сервера

Клиент посылает "Q"
клиент отображает "Q" в Client UI
Клиент посылает "W"
клиент отображает "W" в Client UI
Клиент посылает сообщение "E"
клиент отображает "E" в Client UI
Сервер не получает ни один из "Q", "W", или "E"
Сервер отправляет " P»
Сервер показывает "P" в сервер UI
отображает сервера "E" в сервере UI
Клиент получает "P"
клиент отображает "P" в Client UI

Что вы думаете является причиной этого ? Все, что я хочу, - это когда клиент отправляет данные независимо от того, сколько раз сервер получает, не нажимая ничего, как моя текущая ситуация. Клиент получает данные сервера в порядке. Спасибо за любой ответ

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(); 
    } 
} 
} 

Server.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

Даже если вы код в порядке, у вас могут быть такие проблемы. Например, сервер может быть перегружен, сеть может быть повреждена. Вы должны иметь некоторую защиту.

Например, вы можете увеличить каждое сообщение, отправленное клиентом. Когда сервер получает сообщение 3 перед сообщением 2, он ждет пять или шесть секунд. Если в течение этого времени он получает сообщение, вы можете записать 2 и после 3. Если вы его не получили, вы можете написать сообщение 3. Если вы никогда не получите второе сообщение, вы.

Итак, вы должны реализовать логическую систему по вашему выбору, чтобы предотвратить сетевые проблемы.

Смежные вопросы