这一篇在我之前的Android实现UDP的简单单方通信的基础上进行。
上一篇是单方通信,只能手机发送消息给电脑服务器端,而且服务器端没有实现界面,这一篇让手机和电脑实现双方通信。
首先一起来看看服务器端有啥子变化吧
服务器端
相信对于各位,Java写界面已经是很简单的操作啦,这里我的界面十分简陋莫见怪,主要看功能实现啦。
界面如下(界面代码就不给出啦)
界面上收到的消息框只需要根据上篇把收到的消息写入收到消息框中去就可以了;
现在需要将发送消息框的内容发送给Mobile手机端,在OK按钮的监听器中实现,获取输入框的内容msg,再调用发送消息的函数sendMsg(String msg),下面给出发送消息函数的代码。
public void sendMsg(String msg){
System.out.println("Sever send... ");
try {
//指定包要发送的目的地
byte[] data=msg.getBytes("UTF-8");
DatagramPacket request =new DatagramPacket(data,data.length, address, port);
//发送
socket.send(request);
System.out.println("Sever send success...");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
注意几点
以上代码中的DatagramPacket request =new DatagramPacket(data,data.length, address, port);其中的两个参数,address和port为Mobile手机端的IP地址以及所使用的端口号,我们怎么得到这两个参数呢?
得到Mobile发送端的地址及端口号
address = request.getAddress();
port = request.getPort();
这里的request,是接收消息函数receiveSever()中的,为DatagramPacket类型,也就是我接收消息后,从中得到了发送端的地址以及端口号。
另外一个注意点
这里发送端和接收端使用的是同一个socket,也就是通过socket这条通道把PC服务器端和Mobile客户端连接起来,所以收发消息使用的是这同一个socket。
服务器端的改动就这些了,接下来就是Mobile客户端了,从上一篇了解到,客户端是用Android编写的,注意区别于服务器端Java的编写。
客户端
客户端,在上一篇的基础上,在界面上,我添加了一个EditText,作为接收消息框,其实用TextView很合适。这里我就使用EditText啦。
界面如下:
原来客户端本就有发送消息的函数,这里我们再添加接收消息的函数receiveSever(),代码如下:
public void receMsg(){
Log.i("Client receive", "1...1");
try {
// socket = new DatagramSocket(8081);
while(true){
byte[] tong=new byte[10];
DatagramPacket request = new DatagramPacket(tong, 10);
Log.i("Client receive", "2...2");
//程序很可能会阻塞在这里等待接收消息
socket.receive(request);
String s=new String(tong,"UTF-8");
Log.i("Client receive", " OK"+s);
Message msg = new Message();
msg.obj = s;
handler.sendMessage(msg);
// receString.setText(s);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
代码中需要注意的几点
1.同在服务器端讲到的一样,收发消息函数中所用的socket要是同一个socket。
2.接收到的消息,需要显示在Mobile手机端上。因为Android只能是主线程修改界面,所以我们需要添加Android的Handle,Message机制来实现界面修改(显示接收到的消息)
不熟悉Handle机制的童鞋们可以看看我这一篇博客Handler的简单使用(二)
3.发送和接收消息的函数都必须放在线程中。
测试结果
首先启动服务器端(注意客户端和服务器端需要在同一个局域网下,简单的做法就是使他们连接同一个wifi,客户端发送消息函数的目标IP地址参数可以通过在命令行中输入ipconfig得到,注意使用的是ipv4地址)
启动服务器端:
启动客户端:
客户端发送消息helloKitty:
服务器端接收:
服务器端打印出发送端的IP地址以及端口号:
服务器端发送消息“你好”
客户端收到消息“你好”: