上一篇写的是服务端的使用,这一篇要写客户端
客户端可以实现一下功能:
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;
}
}