Клиентский интерфейс Android и Java-сервер TCP

Я разрабатываю приложение для Android (клиент) и хочу, чтобы он соединился с моим сервером Java, используя TCP-связь.

Я проделал код – простую программу, клиент отправил сообщение, а сервер – обратно – как показано ниже:

Код сервера:

import java.net.*; public class Server { public static void main(String[] args) { int nreq = 1; try { ServerSocket sock = new ServerSocket (8080); for (;;) { Socket newsock = sock.accept(); System.out.println("Creating thread ..."); Thread t = new ThreadHandler(newsock,nreq); t.start(); } } catch (Exception e) { System.out.println("IO error " + e); } System.out.println("End!"); } } 

Код Thread Handler в том же файле проекта сервера:

  import java.io.*; import java.net.*; class ThreadHandler extends Thread { Socket newsock; int n; ThreadHandler(Socket s, int v) { newsock = s; n = v; } public void run() { try { PrintWriter outp = new PrintWriter(newsock.getOutputStream(), true); BufferedReader inp = new BufferedReader(new InputStreamReader( newsock.getInputStream())); outp.println("Hello :: enter QUIT to exit \n"); boolean more_data = true; String line; while (more_data) { line = inp.readLine(); System.out.println("Message '" + line + "' echoed back to client."); if (line == null) { System.out.println("line = null"); more_data = false; } else { outp.println("From server: " + line + ". \n"); if (line.trim().equals("QUIT")) more_data = false; } } newsock.close(); System.out.println("Disconnected from client number: " + n); } catch (Exception e) { System.out.println("IO error " + e); } } } 

И это клиентская сторона (Android):

 package com.android.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Client extends Activity { /** Called when the activity is first created. */ Scanner scanner = new Scanner(System.in); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final EditText msg = (EditText) findViewById(R.id.etMsg); Button send = (Button) findViewById(R.id.bSend); final TextView convo = (TextView) findViewById(R.id.tvConvo); final TextView status = (TextView) findViewById(R.id.tvStatus); try { send.setOnClickListener(new View.OnClickListener() { Socket s = new Socket("localhost", 8080); String message = msg.getText().toString(); @Override public void onClick(View v) { status.setText("..."); PrintWriter outp = null; BufferedReader inp = null; status.setText("Established connection.."); String serverMsg = null; try { outp = new PrintWriter(s.getOutputStream(), true); inp = new BufferedReader(new InputStreamReader(s.getInputStream())); serverMsg = inp.readLine(); } catch (IOException e) { e.printStackTrace(); } convo.append(serverMsg + "\n"); if (message != null) { if (msg.getText().toString().trim() == "QUIT") { try { s.close(); } catch (IOException e) { e.printStackTrace(); } status.setText("Disconnected from server."); } else { try { convo.append(message + "\n"); outp.println(message); serverMsg = inp.readLine(); convo.append(serverMsg + "\n"); } catch (IOException e) { e.printStackTrace(); } } } else status.setText("Problem in connection..!"); } }); } catch (IOException e) { e.printStackTrace(); } } } 

И это XML-файл:

 <?xml version="1.0" encoding="utf-8" ?> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@+id/tvText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Your message here:" /> - <EditText android:id="@+id/etMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10"> <requestFocus /> </EditText> <TextView android:id="@+id/tvStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Status..." android:textAppearance="?android:attr/textAppearanceSmall" /> <Button android:id="@+id/bSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Conversation:" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/tvConvo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout> 

Я попытался запустить его, но ничего не происходит. Когда я нажимаю кнопку, TextView не видит сообщение «Hello» с сервера.

Вы подключаетесь с вашим клиентом Android к localhost .

 Socket s = new Socket("localhost", 8080); 

Это будет работать только тогда, когда ваш сервер работает на устройстве Android. Но я думаю, что он работает на вашем ПК. Итак, когда вы запускаете свое приложение на эмуляторе Android, вы можете подключиться к 10.0.2.2 , чтобы связаться с хостом. На реальном устройстве вам нужно узнать IP-адрес вашего сервера, который может быть достигнут устройством Android, например, через Wi-Fi.

Если ваш сервер находится в Windows, введите cmd в поле поиска в меню «Пуск», а затем введите ipconfig в командной строке. Вы увидите что-то вроде IVP4 Address----- 192.168.0.101 . Вам нужно использовать этот адрес и номер порта на вашем клиенте.