Socket传输(下)----客户端

6 篇文章 0 订阅

上一篇写的是服务端的使用,这一篇要写客户端

客户端可以实现一下功能:
1.链接服务端
2.向服务端发送信息,并得到服务端的反馈

客户端界面:

1.链接服务端
这是一个耗时操作,所以要把它放在一个子线程中

class ClientSocketThread extends Thread {
        @Override
        public void run() {
            //如果是跑在同一个手机上就可以是随意的IP地址,如果是不同手机上的,上面要是同一WIFI下的IP地址
            try {
                Socket socket = new Socket("192.168.1.104", 1234);//ip地址要是对方的地址
                //连接成功后接收消息的方法(后面会讲到)
                connected(socket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

客户端Socket在实例化中,IP地址要填写所要链接服务端的IP地址,不是自己的

在运行的时候要先启动服务端再启动客户端

2.接收服务端发送的消息
因为要不断地接收消息,是一个耗时操作,所以要到子线程中,这里有一个匿名类,是进行消息处理的
首先是匿名类的构造方法

//写数据和读取数据的线程
    class ConnectThread extends Thread {
        Socket socket;
        InputStream in = null;
        OutputStream out = null;

        public ConnectThread(Socket socket) {
            this.socket = socket;
            try {
                in = socket.getInputStream();
                out = socket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

在run方法中实现对服务端数据的监听

@Override
        public void run() {
            byte[] buffer = new byte[1024];
            int bytes = 0;
            //等待另一端发送的数据
            while (true) {
                try {
                    bytes = in.read(buffer);
                    Log.d("TAG", "client_read:" + new String(buffer, 0, bytes));
                    Log.d("TAG", "----------------------------------");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

向服务端发送数据,就是向服务端写入数据的方法

//向另一端写数据的操作
        public void write(byte[] buffer) {
            try {
                out.write(buffer);
                Log.d("TAG", "client_write:" + new String(buffer));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

关闭socket链接,这时输入输出流的链接都会关闭

//关闭的方法
        public void cancle() {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

这个处理数据的类就算是完成了,下面是在connected()方法中将线程启动

 //数据连接发送信息线程的实例化
    private void connected(Socket socket) {
        if (connectThread != null) {
            connectThread.cancle();
            connectThread = null;
        }
        connectThread = new ConnectThread(socket);
        connectThread.start();
        Log.d("TAG", "connect success");
    }

最最后一步是按钮的点击事件

 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //启动客户端
            case R.id.start_btn:
                new ClientSocketThread().start();
                break;
            //向服务端写数据
            case R.id.write_btn:
                String data = "hello_server";
                //数据传输类的对象
                connectThread.write(data.getBytes());
                break;
        }

    }

最后的最后就是源码
https://github.com/XuDaHaoRen/SocketClienDemo

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值