Android的TCP服务器客户端通信

我在这里find了一个写得很好的教程,用于在android上进行服 奇迹般有效。 但这只是沟通的一种方式。 我想在客户端听服务器响应,但不知道我在这里错了。 这里是我尝试进行更改的服务器的代码。

服务器

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): [AndroidEndpoint@1090563472] 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 

Solutions Collecting From Web of "Android的TCP服务器客户端通信"

readLine()需要一个实际的行:'行被认为是换行符('\ n'),回车符('\ r')或者回车符后面的一个换行符。 “

因此,你应该发送一个,例如。 与BufferedWriter.newLine()。

你有没有在你的代码中写下下面的代码片段?

 out.flush(); 

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

我仍然不确定你想要达到的目标。 您的错误-log显示XMPPConnection – 错误。 XMPP不是通过您在发布的代码中使用的端口进行处理的,所以此错误消息可能来自应用程序的不同部分。 另一个错误消息与Google Analytics(分析)的HTTP-Connection相关,并且与您发布的代码段无关。 你应该通过下面的方法来解决你的问题:捕获可能的exception,Log.d和一个标记,你可以过滤错误消息。 马丁·詹姆斯的提示是我认为的好,所以如果你从服务器收到任何数据,试图切换到inputstream的字节式阅读至less用于validation和低迷,连接也是一个好主意。

尝试写入时,您是否尝试添加新行( "\n" )? 尝试out.write("TstMsg"+ "\n")

如果您尝试连接到Web服务器。 据我所知,networking服务器处理http协议,你试图连接到一个简单的networking服务器与TCP / IP使用套接字。 由于违反协议标准,您将无法获得预期的响应。 你的select是,如果你想连接到一个Web服务器,或者使用android HttpURLConnection相关的类,或者使用任何编程语言中的severSocket相关类来创build自己的应用程序服务器来处理你的客户端。