2013-11-28 4 views
8

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

Сервер

public class Server extends Activity { 

    private ServerSocket serverSocket; 

    Handler updateConversationHandler; 

    Thread serverThread = null; 

    private TextView text; 



    public static final int SERVERPORT = 8080; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView) findViewById(R.id.text2); 

     updateConversationHandler = new Handler(); 

     this.serverThread = new Thread(new ServerThread()); 
     this.serverThread.start(); 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    class ServerThread implements Runnable { 

     public void run() { 
      Socket socket = null; 
      try { 
       serverSocket = new ServerSocket(SERVERPORT); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        socket = serverSocket.accept(); 

        CommunicationThread commThread = new CommunicationThread(socket); 
        new Thread(commThread).start(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    class CommunicationThread implements Runnable { 

     private Socket clientSocket; 

     private BufferedReader input; 

     public CommunicationThread(Socket clientSocket) { 

      this.clientSocket = clientSocket; 

      try { 

       this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public void run() { 


      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        String read = input.readLine(); 

        if (read == null){ 
         Thread.currentThread().interrupt(); 
        }else{ 
         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
         out.write("TstMsg"); 
         updateConversationHandler.post(new updateUIThread(read)); 

        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

    class updateUIThread implements Runnable { 
     private String msg; 

     public updateUIThread(String str) { 
      this.msg = str; 
     } 

     @Override 
     public void run() { 
      text.setText("Client Says: "+ msg + new Date() + "\n"); 

     } 

    } 

} 

Client

public class Client extends Activity { 

    private Socket socket; 

    private static final int SERVERPORT = 8080; 
    private static final String SERVER_IP = "192.168.104.107"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  
        new Thread(new ClientThread()).start(); 

    } 


    public void onClick(View view) { 
     try { 
      EditText et = (EditText) findViewById(R.id.EditText01); 
      String str = et.getText().toString(); 
      PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), 
        true); 
      out.println(str); 
      out.flush(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String read = in.readLine(); 
      System.out.println("MSG:" + read); 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    class ClientThread implements Runnable { 

     @Override 
     public void run() { 

      try { 
       InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
       socket = new Socket(serverAddr, SERVERPORT); 

      } catch (UnknownHostException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

     } 

    } 
} 

Update

Когда клиент посылает любое сообщение на сервер сообщение принимается сервером, но когда сервер отправляет свой ответ

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
out.write("TstMsg"); 

и в клиенте

String read = in.readLine(); 
System.out.println("MSG:" + read); 

Это доза не мь клиентом или мы можем сказать, сервер слушать клиентов сообщение, но клиент не. Я добавил оба разрешения в манифест.

<uses-permission android:name="android.permission.INTERNET" > 
</uses-permission> 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > 
</uses-permission> 

Update После долгого повесьте приходит эти ошибки.

11-28 18:35:45.786: E/GTalkService(292): connectionClosed: no XMPPConnection - That's strange! 
11-28 18:35:48.806: D/ConnectivityService(148): handleInetConditionHoldEnd: net=1, condition=0, published condition=0 
11-28 18:35:54.526: I/GTalkService/c(292): [[email protected]] connect: acct=1000000, state=CONNECTING 
11-28 18:35:55.176: D/dalvikvm(1167): GC_CONCURRENT freed 495K, 9% free 6604K/7239K, paused 2ms+3ms 
11-28 18:35:55.226: D/Finsky(1167): [1] 5.onFinished: Installation state replication succeeded. 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Problem with socket or streams. 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): java.net.ConnectException: failed to connect to www.google-analytics.com/173.194.39.41 (port 80): connect failed: ETIMEDOUT (Connection timed out) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connect(IoBridge.java:114) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.Socket.connect(Socket.java:842) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at com.google.android.apps.analytics.t.run(Unknown Source) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Handler.handleCallback(Handler.java:605) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Looper.loop(Looper.java:137) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.HandlerThread.run(HandlerThread.java:60) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.Posix.connect(Native Method) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connect(IoBridge.java:112) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): ... 9 more 
11-28 18:37:29.016: D/dalvikvm(349): GC_CONCURRENT freed 1258K, 35% free 8238K/12487K, paused 2ms+8ms 
+0

есть у при условии разрешения Интернета в обоих проекта ??? –

+1

Что, ваша проблема, объясните это хорошо, вы говорите, что это работает как шарм, но не знает, что проблема –

+0

спасибо за интерес Я обновил вопрос. – user934820

ответ

1

Я все еще не уверен, чего вы пытаетесь достичь. В вашей ошибке -log отображается XMPPConnection - Ошибка. XMPP не обрабатывается через порт, который вы используете в опубликованном коде, поэтому это сообщение об ошибке может быть либо из другой части вашего приложения. Другое сообщение об ошибке связано с аналитикой HTTP-Connection для Google, и ни одна из них не связана с фрагментом кода, который вы опубликовали. Вы должны снизить свою проблему, если: выбирая возможные исключения, Log.d с тегом, вы можете отфильтровать свою ошибку - сообщения. Подсказка от Мартина Джеймса хорошая, я думаю, поэтому, пытаясь переключиться на байт-мудрый прочтение вашего входного потока, по крайней мере, для проверки и понижения, если вы получаете какие-либо данные с вашего сервера - соединение также является хорошей идеей.

+0

Я добавил весь класс – user934820

1

readLine() ожидает фактическую строку: «Линия считается завершенной любым каналом ('\ n'), возвратом каретки ('\ r') или возвратом каретки по строке.

Поэтому вы должны отправить его, например. с BufferedWriter.newLine().

+0

Сначала я попытался добавить «\ n», но это тоже не сработало. Я просто попробовал еще раз, добавив новую строку. Но клиент зависает при получении ответа от сервера и после долгого зависания ничего не возвращает, кроме множества ошибок. Я обновил трассировку стека. – user934820

0

Вы написали следующий фрагмент кода в код

out.flush(); 

после

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
out.write("TstMsg"); 
0

Вы пытались добавить новую строку ("\n") при попытке написать? Вместо этого попробуйте out.write("TstMsg"+ "\n").

-5

Если вы пытаетесь подключиться к веб-серверу. Насколько я знаю, веб-сервер обрабатывает протокол HTTP, и вы пытаетесь подключиться к веб-серверу просто с помощью tcp/ip с помощью сокета. Вы не получите ожидаемого ответа, поскольку вы нарушаете стандарт протокола.ваш вариант будет, если вы хотите подключиться к веб-серверу, либо используете связанные с Android классы HttpURLConnection, либо создаете свой собственный сервер приложений, используя классы, связанные с severSocket, на любом языке программирования для обработки ваших клиентов.

-1
final Socket s = new Socket(); 
s.connect(new InetSocketAddress(mHost, mPort), 20000); 
final DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
dos.write(("This is a message." + "\r\n").getBytes()); 
dos.flush(); 

В качестве альтернативы:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
String outgoingMsg = "This is a message." + System.getProperty("line.separator"); 
out.write(outgoingMsg); 
out.flush(); 
Смежные вопросы