Java中网络通信编程之UDP通信

来源:互联网 发布:国外域名要不要备案 编辑:程序博客网 时间:2024/05/01 00:47

最近学习了Java里面的网络通信编程,
感觉收获不小,
特意把有关这方面的知识自己小结了下,
以免以后忘了。
Java里面网络通信主要通过这两种协议来进行通信滴,
UDP和TCP协议。
UDP协议全名是:user datagram protocol 用户数据报协议。
相对比下,其优点有:
udp无需先建立连接再发送数据,而是直接发送数据。因此速度快,效率相对较高。可以一对多。
缺点是:不可靠,安全性不高。因为它不管接收方为谁,是否已经收到,它只是负责发送而已。
UDP协议可以用手机发短信功能去类似理解下。
首先你可以同时全发短信,发送之后你不知道对方是否已经收到短信,也不知道对方是否会回信息。
而TCP则类似打电话,
你和对方一定要先拨号通话后才能对话。即要先建立连接后才能对话。

记得以前刚接触的时候,一兄弟是这样跟我解释说滴,
它说UDP来发广播的实现过程可以用信封来形象化。
这样理解对新手来说确实很给力,通俗易懂,易接受。
整个通信过程用到了两个类
DatagramSocket和DatagramPacket,其中DatagramPacket相当于信封,DatagramSocket则充当邮箱的角色。
 当我们想广播发送数据时,我们先将要发送的数据写入一个数组里面去,
然后装入信封里面去,信封上写明发送地址。然后投到邮箱里面去就行了。

具体步骤可归结如下:

由于是UDP连接,用发送端和接收端来理解可能会更好些。
下面的理解有点牵强附会,不过能让自己易理解这整个过程。勉强点也无所谓。

发送端:

第一步:建立邮箱通道

DatagramSocket socket = new DatagramSocket();

第二步:填好地址,将写好的发送内容填入信封内

DatagramPacket packet = new DatagramPacket(send,  send.lengthnew InetSocketAddress(IPPORT));

注: byte[] send = { 'H''e''l','l','o' }; 

第三步 :投入邮箱,即发送出去

socket.send(packet);

接收端:

第一步:建立邮箱通道

DatagramSocket socket = new DatagramSocket();

第二步:准备好包,用来接收发过来数据

DatagramPacket packet = new DatagramPacket(receiver, receiver.length);

第三步: 接收

socket.receive(packet);

发送端代码:

public class UdpSender

{

final static int PORT = 20000;

final static String IP = "255.255.255.255";

static DatagramSocket socket;

static DatagramPacket packet;

static byte[] send = 

'H''e''l','l','o' };      

  

public static void main(String[] args)

{

try 

{

socket = new DatagramSocket();

packet = new DatagramPacket(send,  send.lengthnew InetSocketAddress(IPPORT));

System.out.println("发送成功");

socket.send(packet);

catch (SocketException e)  

{

e.printStackTrace(); 

catch (IOException e) 

e.printStackTrace();

}

}  

}

接收端代码:

public class UdpReceiver{

final static int PORT = 1234;

static DatagramSocket socket;

static DatagramPacket packet;  

static byte[] receiver = new byte[1024];

public static void main(String[] args)  

{

try

{

socket = new DatagramSocket(PORT);

packet = new DatagramPacket(receiverreceiver.length);

while (true)   //使服务器一直给在等待接收数据,保持程序不结束

{

socket.receive(packet);

socket.send(packet);

System.out.println(packet.getAddress());

System.out.println(packet.getPort());

System.out.println(new String(packet.getData()));

catch (SocketException e)

{

e.printStackTrace();

catch (IOException e)

{

e.printStackTrace();

}

}

}





原创粉丝点击