一、服务端
运行之后,应用会占用一个端口,这个端口提供给客户端来访问,客户端访问需要ip和客户端。启动之后:服务器端的状态为close→listen。服务端过程由ServerSocket来绑定端口,Socket建立连接,BufferedReader读入数据。
1、新建services服务包,新建TCPService类
2、//不希望和任何的Activity绑定,始终运行,此方法不执行逻辑
public IBinder onBind(Intent intent) {
return null;
}
3、
service是运行在UI线程上的, 容易造成阻塞,需要在子线程中运行,new Thread(new Runnable)。
//只启动一次 所以在onCreate()方法中执行
public void onCreate() {
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
//对本机端口的监听
init();
}
}).start();
}
4、对本机端口监听的方法
/*
*在该方法中,创建一个TCP监听的服务
*/
private void init(){
try {
//绑定50000端口号,开始执行监听 状态为:listen
ServerSocket serverSocket=new ServerSocket(50000);
//如果有链接进来,拿到socket 建立了对客户端的连接
Socket socket=serverSocket.accept();
Log.d("Lod","socket.accept");
//读入数据,管道,从bufferedReader(一行一行的读)获取数据,一层一层往下读取
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//注释比较:socket.getInputStream();//一个字节一个字节的处理
String str;
while ((str=bufferedReader.readLine())!=null){
//在这里处理对方发送数据
Log.d("ZJC",str);
}
bufferedReader.readLine();//阻塞式
} catch (IOException e) {
e.printStackTrace();
}
}
1、 在完成Service类后,添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
2、 最后再Activity中启动服务
startService(new Intent(this, TCPService.class));
二、客户端
1、客户端:需要知道ip和端口号
状态:Establish:建立通道,服务器发送数据到客户端,客户端也是一样
2、布局中加入button按钮,设置点击事件发送数据。
服务一样是在子线程中完成,
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
//连接服务器端口
init();
}
}).start();
}
});
3、连接服务器端口的方法
//连接服务器端口
private void init(){
try {
//建立连接通道 状态为establish
Socket socket=new Socket("127.0.0.1",50000);
//向管道中输出数据
PrintWriter printWriter=new PrintWriter(socket.getOutputStream());
//print发送接收不到数据,对应的是close(),println是一行一行的发送可以接收到数据
printWriter.println("Hello ,good moring");
printWriter.flush();
//printWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}