TCP练习:(在这里访问的是本机)

一、服务端

运行之后,应用会占用一个端口,这个端口提供给客户端来访问,客户端访问需要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();
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值