通信协议/UDP通信

通信协议
通信协议是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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值