2013-11-28 139 views
8

我發現一個寫得很好的教程here在android上的服務器客戶端通信。奇蹟般有效。但這只是溝通的一種方式。我試圖在客戶端聽服務器響應,但不知道我在這裏錯了。這是我嘗試進行更改的服務器的代碼。Android的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"); 

     } 

    } 

} 

客戶

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

     } 

    } 
} 

更新

當客戶端發送任何信息給服務器由服務器接收到的消息,但在服務器發送它的響應

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> 

更新 經過長期掛談到這些錯誤。

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

具有u在這兩個項目提供互聯網的權限??? –

+1

什麼,你的問題,解釋得好,你說的是它的作品像魅力,但不知道wheres問題 –

+0

感謝您的興趣我已更新的問題。 – user934820

回答

1

我仍然不確定你想要達到的目標。您的錯誤-log顯示XMPPConnection - 錯誤。 XMPP不是通過您在發佈代碼中使用的端口進行處理的,因此此錯誤消息可能來自應用程序的不同部分。 另一個錯誤消息與Google Analytics(分析)的HTTP連接有關,並且與您發佈的代碼段無關。 你應該通過以下途徑來解決你的問題:捕獲可能的異常,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

如果您嘗試連接到Web服務器。據我所知,Web服務器處理http協議,並且您正嘗試使用套接字簡單地通過tcp/ip連接到Web服務器。由於違反協議標準,您不會得到預期的響應。你的選擇是,如果你想連接到一個Web服務器,或者你使用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();