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

黑马程序员-网络编程之UDP传输小总结

2013-12-11 18:07 387 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

UDP和TCP

UDP:无连接,不可靠,速度快,数据报大小不超过64k。聊天工具,实时摄像投影软件都是UDP。

TCP:面向连接,通过三次握手监测链接,可靠,速度慢,TCP数据包容量更大。下载软件用的是TCP。

UDP传输:

发送端:

1 创建udp服务,通过DatagramSocket对象。DatagramSocket对象是包投递服务的发送或接受点。
DatagramSocket ds=new DatagramSocket(20000);//为自己指定端口号是20000

2 确定数据,并装成数据包。DatagramPacket类表示数据报包,用于无连接投递服务(udp)
/DatagramPacket(byte[] buf,int lenth,InetAddress address,int port)
//构造数据报包,用来将长度为lenth的发送到指定主机上的指定端口号
byte[] data="我是udp

".getBytes();
DatagramPacket dp=new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),10000);

3 通过socket服务,将已有的数据包发送出去,通过send方法。
ds.send(dp);

4 关闭资源。
ds.close();

接收端:

1 创建udpsocket服务,建立端点
DatagramSocket ds=new DatagramSocket(10000);//监听10000端口,也就是为自己指定端口为10000

2 定义数据包。用于存储接收来的数据包。
//DatagramPacket(byte[]buf,int length)构造DatagramPacket,用来接收长度为length的数据包
byte[]buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);

3 通过服务的receive方法将收到的数据存入数据包中。这是一个阻塞式方法,线程机制,就是说没有数据来,程序就停在这里等到数据来再向下执行。
ds.receive(dp);

4 通过数据包的方法获取其中的数据。
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();//返回这个包的目的端口号(发送的时候)或者源端口号(接收的时候)。每个程序都会被系统自动随机分配一个端口号,即使程序不变,每次随机分配一个。
System.out.println(ip+"::"+data+"::"+port);

//5关闭资源
ds.close();

点对点单向聊天软件的制作,详情见UDPDemo.java 和UDPDemo2.java,用dos命令窗口来实现。

如果想实现群聊,可以把ip最后一位设为255.

利用多线程实现可以同时收发信息的聊天软件。实现代码如下:

/*编写一个聊天程序
* 有收数据的部分和发数据的部分
* 这两个部分需要同时执行,所以用到多线程技术
* 一个线程控制收,一个线程控制发
* 因为收和发的动作是不一致的,所以要定义两个run方法
* 而且这两个run方法要封装到不同的类中*/
class Send1 implements Runnable{
DatagramSocket ds;
DatagramPacket dp;
Send1(DatagramSocket ds){
this.ds=ds;
}
public void run() {
BufferedReader br=null;
try {
br=new BufferedReader(new InputStreamReader(System.in));
String s=null;
while((s=br.readLine())!=null){
if(s.equals("over"))break;
byte[] data=s.getBytes();
dp=new DatagramPacket(data,0,data.length,InetAddress.getByName("127.0.0.1"),10003);
ds.send(dp);
}
} catch (Exception e) {
throw new RuntimeException("发送端出问题了");
}finally{
try {
br.close();
ds.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}

class Receive1 implements Runnable{
DatagramSocket ds;
Receive1(DatagramSocket ds){
this.ds=ds;
}
public void run() {

try {
while(true){
byte[] data=new byte[1024];
DatagramPacket dp=new DatagramPacket(data,data.length);
ds.receive(dp);
String s=new String(dp.getData(),0,dp.getLength());
System.out.println(dp.getAddress().getHostAddress()+"的"+dp.getPort()+"端口号说:"+s);
}
} catch (Exception e) {
throw new RuntimeException("接收端出问题了");
}
}
}

class ChatDemo{
public static void main(String[]args) throws Exception{
DatagramSocket sendSocket=new DatagramSocket();
DatagramSocket receiveSocket=new DatagramSocket(10003);

new Thread(new Send1(sendSocket)).start();
new Thread(new Receive1(receiveSocket)).start();
}
}

----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: