通信协议
通信协议是UDP/TCP通信的基础,没有通信协议的“通信”是没有任何意义上的,通信协议不是底层函数或者高深的原理,而是程序员之间的一种文本约定。
数据在网络上是以字节的形式传送的(底层是01码),我们在读取到数据之后,该以怎样的方式对它进行解码呢?这就是我们在通信之前需要制定的通信协议。如果程序员不知道这个协议,那么他拿到的就是一堆无意义的数据。
以UDP为例:
发送端
我们约定,我们所传送数据的第一个字节代表了数据的种类
1:代表iamge
2:代表message
3:代表file
接下来,所有的字节都是真正需要传递的数据。
在前面的基础上,所有的字节都要进行减1操作(简单加密,接收端读取数据的时候相应要进行加1操作)。
接收端
这个数据发送到服务器之后,服务器首先读取这个数据包,然后对每一个字节进行加1操作
然后对第一个字节进行判断,如果第一个字节是1,那么服务器就知道这个数据代表了一个图片,
如果第一个字节是2,这段数据就是一段文本消息,如果第一个字节是3,这段数据就代表了一个文件。
这就是一个简单的使用通信协议并且对数据进行加密的例子,这个协议,是双方提前约定好的。
在我们制定好自己的通信协议之后,我们就可以着手了解UDP通信的实现了。
UDP通信
对于在同一网段通信的程序来说,UDP是很好的选择。
//@param
public int local_null_port=15000;
public int local_receive_port=14000;
public int Receiver_port=13000;
public String Send_socket="***.***.**.***";//发送端Ipv4地址
public String local_socket="***.***.**.**";//接收端Ipv4地址
我们首先构建接收端的代码
SocketAddress localAddr = new InetSocketAddress(local_socket, local_receive_port);//本地地址
DatagramSocket recvSocket = null;//接收的服务器UDP端口
try {
recvSocket = new DatagramSocket(localAddr);
} catch (SocketException e) {
e.printStackTrace();
}
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);//创建接收数据包对象
try {
recvSocket.receive(packet);//6.在此等待接收对方发的UDP包
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes =packet.getData();//获取数据
对获取的byte数组做一些处理
public void handle(byte[] bs){
switch(bs[0]){
case:1 dosomething_a();break;
case:2 dosomething_b();break;
case:3 dosomething_c();break;
default:break;
}
}
public void dosomething_a(){
//处理数据
}
public void dosomething_b(){
//处理数据
}
public void dosomething_c(){
//处理数据
}
构建发送端
SocketAddress localAddr = new InetSocketAddress(local_socket,local_null_port);
DatagramSocket dSender = null;//2.创建发送的Socket对象
try {
dSender = new DatagramSocket(localAddr);//
} catch (SocketException e) {
e.printStackTrace();
}
byte[] buffer = new byte[40000];
buffer = getbyte(buffer);
DatagramPacket dp = new DatagramPacket(buffer, buffer.length, destAdd); //打包
try {
dSender.send(dp);//发送
} catch (IOException e) {
e.printStackTrace();
}
对发送数据的处理
public byte[] getbyte(byte[] bs){
//do something
return bs;
}