Связь с клиентом Android TCP Server

Я нашел хорошо написанный учебник для связи с сервером на 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 

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

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

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

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

 out.flush(); 

после

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

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

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

Intereting Posts