2013-11-28 17 views
8

Tôi đã tìm thấy hướng dẫn bằng văn bản here dành cho giao tiếp ứng dụng khách trên máy chủ trên Android. Làm việc như một say mê. Nhưng nó chỉ là một cách giao tiếp. Tôi đang cố gắng lắng nghe phản hồi của máy chủ trong ứng dụng khách nhưng không biết tôi đã sai ở đâu. Đây là mã cho máy chủ nơi tôi đang cố gắng thực hiện thay đổi.Giao tiếp Máy khách Máy chủ TCP của Android

server

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"); 

     } 

    } 

} 

Khách hàng

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

     } 

    } 
} 

Cập nhật

Khi khách hàng gửi bất kỳ thông điệp tới máy chủ thông điệp được nhận bởi máy chủ nhưng khi máy chủ gửi thư trả lời của mình

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

và trong ứng dụng

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

Nó liều không nhận được bởi khách hàng hoặc chúng ta có thể nói máy chủ lắng nghe khách hàng nhắn nhưng khách hàng không. Tôi đã thêm cả hai quyền trong tệp kê khai.

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

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

Cập nhật Sau khi xảy ra lỗi dài.

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

có u cung cấp cho phép của internet trong cả hai dự án ??? –

+1

Whats, vấn đề của bạn, giải thích nó tốt, bạn đang nói tat nó hoạt động như quyến rũ nhưng không biết wheres vấn đề –

+0

cảm ơn vì đã quan tâm tôi đã cập nhật câu hỏi. – user934820

Trả lời

1

Tôi vẫn không chắc chắn về những gì bạn đang cố gắng đạt được. Lỗi -log của bạn hiển thị XMPPConnection - Lỗi. XMPP không được xử lý trên cổng bạn đang sử dụng trong mã đã đăng, vì vậy thông báo lỗi này có thể là từ một phần khác của ứng dụng của bạn. Thông báo lỗi khác liên quan đến HTTP - Kết nối cho Google analytics và không liên quan đến đoạn mã mà bạn đã đăng. Bạn nên làm giảm sự cố của mình bằng cách: bắt các ngoại lệ có thể xảy ra, Log.d với một thẻ bạn có thể lọc lỗi của mình - tin nhắn. Các gợi ý từ Martin James là tốt tôi nghĩ, vì vậy cố gắng chuyển sang một byte - khôn ngoan đọc của inputstream của bạn ít nhất là để xác minh và downtracing nếu bạn nhận được bất kỳ dữ liệu từ máy chủ của bạn - kết nối cũng là một ý tưởng tốt.

+0

Tôi đã thêm toàn bộ lớp – user934820

1

readLine() dự kiến ​​một dòng thực tế: 'Một dòng được coi là bị chấm dứt bởi bất kỳ nguồn cấp dữ liệu dòng nào (' \ n '), trả về vận chuyển (' \ r ') hoặc trả về vận chuyển ngay lập tức bởi một linefeed. '

Do đó, bạn nên gửi một ví dụ: với BufferedWriter.newLine().

+0

Đầu tiên tôi đã thử thêm "\ n" nhưng điều đó cũng không hiệu quả. Tôi chỉ thử một lần nữa bằng cách thêm dòng mới. Nhưng khách hàng bị treo khi nhận được phản hồi từ máy chủ và sau một thời gian dài, nó không trả về gì ngoài một loạt lỗi. Tôi đã cập nhật dấu vết ngăn xếp. – user934820

0

Bạn đã viết đoạn sau trong mã của bạn

out.flush(); 

sau

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

Bạn đã cố gắng thêm một dòng mới ("\n") khi cố gắng viết? Thay vào đó, hãy thử out.write("TstMsg"+ "\n").

-5

Nếu bạn đang cố kết nối với máy chủ web. Theo như tôi biết máy chủ web xử lý giao thức http và bạn đang cố gắng để kết nối với một máy chủ web chỉ đơn giản là với tcp/ip bằng cách sử dụng ổ cắm. Bạn sẽ không nhận được phản hồi mong đợi vì bạn đang vi phạm tiêu chuẩn giao thức.tùy chọn của bạn sẽ là nếu bạn muốn kết nối với máy chủ web hoặc bạn sử dụng các lớp liên quan đến HttpURLConnection android hoặc bạn tạo máy chủ ứng dụng của riêng mình bằng cách sử dụng các lớp liên quan đến severSocket trong bất kỳ ngôn ngữ lập trình nào để xử lý khách hàng của bạn.

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

Hoặc:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
String outgoingMsg = "This is a message." + System.getProperty("line.separator"); 
out.write(outgoingMsg); 
out.flush(); 
Các vấn đề liên quan