最近学习了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();
}
}
}