1.首先,在AndroidManifest.xml文件中,必须加入
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2.以PC为接收端(服务器Server端),以Android虚拟机为发送端(客户Client端),那么在安卓的程序中,新建socket语句必须使用安卓虚拟机的环路地址,即“10.0.2.2”(相当于PC机的127.0.0.1)。输入其他的地址,诸如(PC机内网地址,“127.0.0.1”等)均无法将安卓虚拟机连上PC机。
Socket socket = new Socket("10.0.2.2", 3333);
3.  需要在安卓的主线程代码中 (一般就是onCreate(Bundle savedInstanceState)函数中)加入以下代码,防止出现android.os.NetworkOnMainThreadException:
   StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
原理是这样的:一般主线程(跑UI的线程)不推荐使用网络相关的服务,因为使用到网络可能会导致运行UI的线程很卡,最终很可能会出现ARN(Application Not Responding)的提示框。所以如果在主线程中运用到了网络相关的服务(例如本例的TCP连接),会在LogCat中出现NetworkOnMainThreadException的异常。
StrictMode则是Android专门为开发者提供的工具类,你可以决定当出现诸如NetworkOnMainThreadException异常时,将异常存至LogCat中,而不是直接终止你的安卓应用的运行。
由于本程序为示例代码,故不在安卓虚拟机中加入线程之类的东西去开启TCP客户端,而用了StrictMode忽略NetworkOnMainThreadException异常。
4.当然,要先运行PC端上的Serve代码,再运行虚拟器上的程序,这样才能监听到啦!
接下来附代码:
1.server端(运行在PC上):
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPDesktopServer implements Runnable {
public static final int SERVERPORT = 3333;
public void run() {
try {
System.out.println("Server: Connecting...");
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
while (true) {
System.out.println("Server:Connected.");
Socket client = serverSocket.accept();
System.out.println("Server: Receiving...");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
String str = in.readLine();
System.out.println("Server: Received: '" + str + "'");
} catch (Exception e) {
System.out.println("Server: Error");
e.printStackTrace();
} finally {
client.close();
System.out.println("Server: Done.");
}
}
} catch (Exception e) {
System.out.println("Server: Error");
e.printStackTrace();
}
}
public static void main(String a[]) {
Thread desktopServerThread = new Thread(new TCPDesktopServer());
desktopServerThread.start();
}
}
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPDesktopServer implements Runnable {
public static final int SERVERPORT = 3333;
public void run() {
try {
System.out.println("Server: Connecting...");
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
while (true) {
System.out.println("Server:Connected.");
Socket client = serverSocket.accept();
System.out.println("Server: Receiving...");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
String str = in.readLine();
System.out.println("Server: Received: '" + str + "'");
} catch (Exception e) {
System.out.println("Server: Error");
e.printStackTrace();
} finally {
client.close();
System.out.println("Server: Done.");
}
}
} catch (Exception e) {
System.out.println("Server: Error");
e.printStackTrace();
}
}
public static void main(String a[]) {
Thread desktopServerThread = new Thread(new TCPDesktopServer());
desktopServerThread.start();
}
}
2.client端(运行在安卓Android虚拟机上)(示例代码,只包括两个重要函数):
public void establishTCP() throws IOException {
Log.d("TCP", "Client: Connecting...");
Socket socket = new Socket("10.0.2.2", 3333);
String message = "AndroidRes,Where is my Pig (Android)?";
try {
Log.d("TCP", "Client: Sending: '" + message + "'");
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
out.println(message);
} catch (Exception e) {
Log.e("TCP", "S: Error", e);
} finally {
socket.close();
}
}
public void onCreate(Bundle savedInstanceState) {
// 详见StrictMode文档,防止出现 android.os.NetworkOnMainThreadException 异常
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signal); //自行修改布局文件名
try {
establishTCP();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.d("TCP", "Client: Connecting...");
Socket socket = new Socket("10.0.2.2", 3333);
String message = "AndroidRes,Where is my Pig (Android)?";
try {
Log.d("TCP", "Client: Sending: '" + message + "'");
PrintWriter out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()), true);
out.println(message);
} catch (Exception e) {
Log.e("TCP", "S: Error", e);
} finally {
socket.close();
}
}
public void onCreate(Bundle savedInstanceState) {
// 详见StrictMode文档,防止出现 android.os.NetworkOnMainThreadException 异常
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signal); //自行修改布局文件名
try {
establishTCP();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
                    
                     
                    
                 
                    
                
 
         
 
                
            
        
 浙公网安备 33010602011771号
浙公网安备 33010602011771号