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

黑马程序员——网络编程之UDP传输

2014-11-03 17:03 246 查看
UDP是网络传输中的一种协议,它将数据及源和目的封装在数据包中,每个数据包的大小限制在64K内。UDP在传输前不需要先建立连接,所以传输速度快,但是不可靠。直接操作UDP是不可能的,在Java中将封装成对象——DatagramPacket。通过这个对象中的方法,就可以获取到数据包中的各种信息。DatagramSocket具备发送和接受功能,在进行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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: