20150803-UDP

来源:互联网 发布:隐形眼镜推荐 知乎 编辑:程序博客网 时间:2024/06/05 13:58

一、与TCP区别:

不用建立连接,只管发包,可能会丢失;
不可靠的网络协议;
两端建立socket,但没有虚拟连接;
传输包大小限制(64K以下);
DatagramSocket类:建包
发包:send ; 收包:receive

范例1:

接收端:
步骤:
1.DatagramSocket 套接字建立,传入监听端口
2.DatagramPacket 建包(提前定义好要传入包的数组,用来接收长度为lenth的数据包)
3.等待接收:receive
4.通过socket的getData()方法获得其中的数据,并显示
5.关闭流,(关的是socket流)

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;public class Receive {    public static void main(String[] args) {        try {            DatagramSocket dsRecive =new DatagramSocket(8080); //SocketException异常            byte[] arr = new byte[1024];            DatagramPacket dpRecive = new DatagramPacket(arr, 1024);//接收包中参数:接到存入的数组,即存入长度            dsRecive.receive(dpRecive);//IOException异常            byte[] data = dpRecive.getData();//通过getData得到数据            System.out.println(new String(data));            dsRecive.close();   //关闭的是socket        } catch (SocketException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

发送端:
步骤:
1.建套接字socket
2.建包(提前定义好字节数组),包中包括发过去的数组,长度,发到的ip地址,以及端口。
3.调用套接字的send方法发送
4.关闭流。

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class Send {    public static void main(String[] args) {        try {            DatagramSocket daSend = new DatagramSocket(); //SocketException异常            String s = "你好!";            byte[] arr = s.getBytes();            //InetAddress.getLocalHost()【返回主机地址】可以换成InetAddress.getByName("192.168.0.74")【返回相应主机的IP】,             DatagramPacket dpSend = new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 8080);//SocketException异常            System.out.println("开始发送:");            daSend.send(dpSend);//IOException异常,注:是socket发送包            daSend.close();        } catch (SocketException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

范例2:聊天

发送:
步骤:
1.建立发送端的socket和接收端的socket(接收端指定监听端口)
2.建立键盘输入对象scanner
3.循环体;
1)建立包对象,指定出入的字节数组以及目的地ip及短裤。
2)发送端套接字利用send方法发送包。

3)建立接收包对象,指定接收到的数据放入的数组,及接收长度4)接收端套接字利用receive方法接收。

不关闭流。

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Scanner;public class Send {    public static void main(String[] args) {        try {            DatagramSocket daSend = new DatagramSocket(); //SocketException异常            DatagramSocket dsRecive = new DatagramSocket(8082);            Scanner scanner = new Scanner(System.in);            System.out.println("开始发送:");            byte[] arrBack = new byte[1024];            while(true){                String s = scanner.next();                byte[] arr = s.getBytes();                DatagramPacket dpSend = new DatagramPacket(arr, arr.length, InetAddress.getByName("192.168.0.74"), 8089);                //DatagramPacket dpSend = new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 8080);//SocketException异常                daSend.send(dpSend);//IOException异常,注:是socket发送包                DatagramPacket dpBack = new DatagramPacket(arrBack, 1024);                dsRecive.receive(dpBack);                byte[] databack = dpBack.getData();//通过getData得到数据                System.out.println(new String(databack));                //System.out.println(new String(data,0,dpBack.getLength()));            }            //daSend.close();        } catch (SocketException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

接收:
步骤:
1.建立接收端的socket(接收端指定监听端口)和发送端的socket。
2.建立键盘输入对象scanner
3.循环体;
1)建立接收包对象,指定接收到的数据放入的数组,及接收长度
2)接收端套接字利用receive方法接收。
3)建立包对象,指定出入的字节数组以及目的地ip及短裤。
4)发送端套接字利用send方法发送包。

不关闭流。

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.util.Scanner;public class Receive {    public static void main(String[] args) {        try {            DatagramSocket dsRecive =new DatagramSocket(8089); //SocketException异常            DatagramSocket dsSend = new DatagramSocket();            Scanner sanner = new Scanner(System.in);            byte[] arr = new byte[1024];            while(true){                DatagramPacket dpRecive = new DatagramPacket(arr, 1024);//接收包中参数:接到存入的数组,即存入长度                dsRecive.receive(dpRecive);//IOException异常                byte[] data = dpRecive.getData();//通过getData得到arr数组中的数据                System.out.println(new String(data));                //System.out.println(new String(data,0,dpRecive.getLength()));                String back = sanner.next();                byte[] arrBack = back.getBytes();                DatagramPacket dpBack = new DatagramPacket(arrBack, arrBack.length,InetAddress.getByName("192.168.0.74"), 8082);                dsSend.send(dpBack);            }            //dsRecive.close();   //关闭的是socket        } catch (SocketException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

注:
1.由于我用的同一台主机演示,所以端口不能一样。
因为一个客户机来监听,此端口就被占用,其他客户机就不能来监听了。
2.当接收到数据:
System.out.println(new String(data,0,dpBack.getLength()));
用getLength()来获得包中数据长度,这样后面就不会多出空格,
3.要实现多次发送和接收需要用到多线程。
4.接收数据的数组不能建立在循环内,否则浪费空间,在外部,可以每次放数据即可。

0 0
原创粉丝点击