我正在开发一个
Android应用程序(客户端),并希望它使用TCP通信与我的Java服务器连接.
我已经完成了代码 – 简单的程序,客户端发送消息,服务器回复它 – 如下所示:
服务器代码:
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!"); } }
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以联系主机.在真实设备上,您必须找到Android设备可以访问的服务器IP地址,例如:通过Wi-Fi.