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

来源:互联网 发布:wbinairbook mac os 编辑:程序博客网 时间:2024/06/04 20:20

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

客户端可以实现一下功能:
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
原创粉丝点击