1.由于版本问题,有的程序不能通讯,需添加以下代码在onCreate方法中
if (android.os.Build.VERSION.SDK_INT > 9){
StrictMode.ThreadPolicy policy = newStrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
Android的主线程(又叫UI线程,线程ID为1)有一些限制策略,使得主线程有些事做不了,比如访问网络就不允许,否则就是报,但在2.3之后的版本,你可以通过添加以下代码更改其限制策略,从而强制使得主线程可以访问网络
StrictMode是一个开发工具主要用于侦测主线程中的磁盘和网络访问
2.服务器端
(1)监听端口
ServerSocket serverSocket = new ServerSocket(4000);
0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为 23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
(2)等待连接
Socket client = serverSocket.accept();
(3)接受客户端信息
BufferedReaderin=new BufferedReader(newInputStreamReader(client.getInputStream()));
Stringstr=in.readLine();
(4 )向客户端发送数据
PrintWriterout=new PrintWriter(new BufferedWriter(newOutputStreamWriter(client.getOutputStream())),true);
out.println("服务器端的数据");
(5)关闭连接
in.close();
out.close();
3.客户端
(1)向指定服务器端端口,指定ip发送消息
socket = new Socket("10.50.44.149", 3000);
(2)向服务区端发送消息
PrintWriter out = new PrintWriter(newBufferedWriter(
newOutputStreamWriter(socket.getOutputStream())), true);
out.println("客户端消息");
(3)接受服务器端的消息
BufferedReaderbr = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
Stringmstr = br.readLine();
(4)关闭连接
br.close();
socket.close();
4.完整代码
(1)客户端 (android设备)
package com.example.qqqq;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
//客户端的实现
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public class MainActivity extends Activity {
private Button but1;
private static int i = 0;
String[] mesg = { "temperature", "humidity","co2" };
private final String DEBUG_TAG ="mySocketAct";
Socket socket = null;
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
if(android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicypolicy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
but1 = (Button)findViewById(R.id.but1);
but1.setOnClickListener(newMyListener());
}
private class MyListener implementsOnClickListener {
@Override
public void onClick(View v){
// ThreadTesttt = new ThreadTest();
aaaaaa.sendEmptyMessageDelayed(0,500);
}
}
private Handler aaaaaa = new Handler() {
public voidhandleMessage(Message msg) {
try {
socket= new Socket("10.50.44.149", 3000);
PrintWriterout = new PrintWriter(new BufferedWriter(
newOutputStreamWriter(socket.getOutputStream())), true);
intj = i++;
out.println(mesg[j% 3]);
BufferedReaderbr = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
Stringmstr = br.readLine();
if(mstr.contains("wendu")) {
Log.d("test","温度:" + mstr.substring(5));
}
if(mstr.contains("shidu")) {
Log.d("test","湿度:" + mstr.substring(5));
}
if(mstr.contains("co2")) {
Log.d("test","co2:" + mstr.substring(3));
}
br.close();
socket.close();
} catch(UnknownHostException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch(IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
aaaaaa.sendEmptyMessageDelayed(0,500);
}
};
protectedvoid onStop() {
super.onStop();
aaaaaa.removeMessages(0);
}
}
xml
http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.qqqq.MainActivity$PlaceholderFragment">
(2)服务器端
package scoket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DecimalFormat;
public class Sockeet00 implements Runnable{
public void run() {
try {
ServerSocketserverSocket=new ServerSocket(3000);
DecimalFormatdf;
System.out.println("接收用户连接:");
while(true)
{
//
Socketclient=serverSocket.accept();
df= new DecimalFormat("0.00");
try
{
//接受客户端信息
BufferedReaderin=new BufferedReader(newInputStreamReader(client.getInputStream()));
Stringstr=in.readLine();
PrintWriterout=new PrintWriter(new BufferedWriter(newOutputStreamWriter(client.getOutputStream())),true);
if(str.equals("temperature")){
out.println("wendu:"+df.format(30+Math.random()));
}
if(str.equals("humidity")){
out.println("shidu:"+df.format(25+Math.random()));
}
if(str.equals("co2")){
out.println("co2:"+df.format(40+Math.random()));
}
in.close();
out.close();
}catch(Exceptionex)
{
System.out.println(ex.getMessage());
ex.printStackTrace();
}
finally
{
client.close();
}
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String [] args)
{
Thread desktopServerThread=newThread(new Sockeet00());
desktopServerThread.start();
}
}