您的位置:首页 > 理论基础 > 计算机网络

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

2012-05-09 16:27 429 查看
最近学习了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.length, new InetSocketAddress(IP, PORT));

注: 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.length, new InetSocketAddress(IP, PORT));

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(receiver, receiver.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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: