黑马程序员——网络编程之UDP传输
2014-11-03 17:03
246 查看
UDP是网络传输中的一种协议,它将数据及源和目的封装在数据包中,每个数据包的大小限制在64K内。UDP在传输前不需要先建立连接,所以传输速度快,但是不可靠。直接操作UDP是不可能的,在Java中将封装成对象——DatagramPacket。通过这个对象中的方法,就可以获取到数据包中的各种信息。DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接受端。
UDP的发送端:
(1)建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未使用的端口。
(2)提供数据,并将数据封装到数据包中。
(3)用socket服务的send方法将将数据包发送出去。
(4)关闭资源。
UDP的接收端:
(1)创建udp的socket服务,必须要明确一个端口。
(2)定义数据包,用于存储接收到数据。
(3)通过socket服务的接收方法将收到的数据存储到数据包中。
(4)通过数据包的方法获取数据包中的具体信息,如IP、端口、数据等等。
(5)关闭资源。
输出结果:
127.0.0.1:64150---hello!这是发送端
我们使用UDP协议写一个聊天程序,它应该有发送的部分和接收的部分,这两部分是同时执行的,需要使用多线程技术,一个线程控制收消息,一个线程控制发消息。
UDP的发送端:
(1)建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未使用的端口。
(2)提供数据,并将数据封装到数据包中。
(3)用socket服务的send方法将将数据包发送出去。
(4)关闭资源。
import java.net.*; public class test1 { public static void main(String[] args) throws Exception { //建立udp的socket的服务,这里先把异常抛出去。 DatagramSocket ds=new DatagramSocket(); //提供数据,进行封装。 String text="hello!这是发送端"; byte[] buf=text.getBytes(); DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10004); //用socket服务的send方法将数据包发送出去。 ds.send(dp); //关闭资源 ds.close(); } }
UDP的接收端:
(1)创建udp的socket服务,必须要明确一个端口。
(2)定义数据包,用于存储接收到数据。
(3)通过socket服务的接收方法将收到的数据存储到数据包中。
(4)通过数据包的方法获取数据包中的具体信息,如IP、端口、数据等等。
(5)关闭资源。
import java.net.*; public class test1_rec { public static void main(String[] args) throws Exception { //建立udp的socket服务。 DatagramSocket ds=new DatagramSocket(10004);//指定和发送端一样的端口 //定义数据包,用于存储接收到的数据。 byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); //通过socket服务的接收方法将收到的数据存储到数据包中。 ds.receive(dp);//该方法是阻塞式方法 //通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。 String ip=dp.getAddress().getHostAddress(); int port=dp.getPort(); String text=new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+port+"---"+text); //关闭资源。 ds.close(); } }
输出结果:
127.0.0.1:64150---hello!这是发送端
我们使用UDP协议写一个聊天程序,它应该有发送的部分和接收的部分,这两部分是同时执行的,需要使用多线程技术,一个线程控制收消息,一个线程控制发消息。
import java.net.*; import java.io.*; //发送端继承Runnable,重写run方法。 class send implements Runnable{ private DatagramSocket ds; public send(DatagramSocket ds){ this.ds=ds; } public void run() { //读取键盘输入 BufferedReader buffr=new BufferedReader(new InputStreamReader(System.in)); String line=null; try { while((line=buffr.readLine())!=null){ //判断输入“886”就结束聊天 if("886".equals(line)){ break; } byte[] buf=line.getBytes(); DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001); ds.send(dp); } ds.close(); } catch (IOException e) { e.printStackTrace(); } } } //接收端继承Runnable,重写run方法。 class receive implements Runnable{ private DatagramSocket ds; public receive(DatagramSocket ds){ this.ds=ds; } public void run() { try { while(true){ byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length); ds.receive(dp); String ip=dp.getAddress().getHostAddress(); String data=new String(dp.getData(),0,dp.getLength()); System.out.println(ip+"::"+data); } } catch (IOException e) { e.printStackTrace(); } } } public class chatDemo { public static void main(String[] args) throws Exception { DatagramSocket sendDs=new DatagramSocket(); DatagramSocket receiveDs=new DatagramSocket(10001); //开启接收线程和发送线程 new Thread(new send(sendDs)).start(); new Thread(new receive(receiveDs)).start(); } }
相关文章推荐
- 黑马程序员_网络编程1(IP,TCP和UDP,DatagramSocket与DatagramPacket,TCP传输)
- 黑马程序员——8.网络编程(网络模型、网络地址、传输协议(UDP、TCP/IP)、客户端和服务器端、URL)
- 黑马程序员 【】java学习之路——网络编程之UDP传输简析
- 黑马程序员_网络编程一(IP,TCP和UDP, DatagramSocket与DatagramPacket,TCP传输)
- 黑马程序员 【】java学习之路——网络编程 UDP 键盘录入传输
- 网络编程(UDP传输并将使用多线程进行优化)
- 黑马程序员:网络编程之UDP传输
- 网络编程一(IP,TCP和UDP, DatagramSocket与DatagramPacket,TCP传输)
- 黑马程序员——网络编程之UDP
- 黑马程序员—–UDP协议传输
- 黑马程序员_学习笔记第22天——网络编程TCP/UDP
- Java基础—网络编程【OSI/RM TCP/IP】【网络通信三要素】【UDP传输 & TCP传输】【DNS域名解析】
- 黑马程序员——网络编程之UDP协议
- 黑马程序员——网络编程之UDP、TCP/IP
- 黑马程序员——网络编程之TCP传输
- 黑马程序员_java网络编程——UDP传输和TCP传输
- 黑马程序员——网络编程(二)------UDP、TCP和多线程
- day23网络编程UDP,TCP。IP。DatagramSocket。DatagramPacket。聊天程序。TCP传输。文本转换服务器。
- 黑马程序员—网络编程之UDP
- Java 网络编程(二) 两类传输协议:TCP UDP