Scoket:UDP通讯模型

简介:
 
UDP是一种不可靠的网络通讯方式,这里的不可靠是从理论上讲的,从实用角度看还是很可靠的,比如QQ消息等就使用的是UDP的通信的方式。
 
一、最简单的通信模型
import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 

/** 
* 数据报套接字服务端 

* @author leizhimin 2009-12-2 22:09:07 
*/
 
public  class TestUDPServer { 
         public  static  void main(String[] args)  throws IOException { 
                System.out.println( "--------------server端------------"); 
                 byte[] buff =  new  byte[1024]; 
                 //创建一个数据包,用来服务端接收到的数据 
                DatagramPacket dp =  new DatagramPacket(buff, 0, buff.length); 
                 //创建一个绑定本机9999端口的数据报套接字 
                DatagramSocket ds =  new DatagramSocket(9999); 
                 while ( true) { 
                         //阻塞式的接收一个数据包 
                        ds.receive(dp); 
                        System.out.println( new String(buff, 0, buff.length)); 
                } 
        } 
}
 
package lavasoft.udpsokt; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetSocketAddress; 

/** 
* 数据报套接字客户端 

* @author leizhimin 2009-12-2 22:34:22 
*/
 
public  class TestUDPClient { 
         public  static  void main(String[] args)  throws IOException { 
                System.out.println( "--------------client端------------"); 
                 byte[] buff =  "Hello Server!".getBytes(); 
                 //创建一个数据包,其中指定了发送的目标地 
                DatagramPacket dp =  new DatagramPacket(buff, 0, buff.length,  new InetSocketAddress( "192.168.1.101", 9999)); 
                 //创建一个数据报套接字,绑定到随机可用的端口上 
                DatagramSocket ds =  new DatagramSocket(); 
                 //通过该数据包套接向目标发送数据 
                ds.send(dp); 
                 //关闭套接字 
                ds.close(); 
        } 
}
 
先启动服务端,然后运行三个客户端。
 
服务端控制台如下:
--------------server端------------ 
Hello Server! 
Hello Server! 
Hello Server!
 
三个客户端的控制台输出都是:
--------------client端------------ 

Process finished with exit code 0
 
二、双向的交互式通信
 
import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 

/** 
* 数据报套接字服务端:接收发送消息 

* @author leizhimin 2009-12-2 22:09:07 
*/
 
public  class TestUDPServer { 
         public  static  void main(String[] args)  throws IOException { 
                System.out.println( "--------------server端------------"); 
                 byte[] buff =  new  byte[1024]; 
                 //创建一个数据包,用来服务端接收到的数据 
                DatagramPacket dp =  new DatagramPacket(buff, 0, buff.length); 
                 //创建一个绑定本机9999端口的数据报套接字 
                DatagramSocket ds =  new DatagramSocket(9999); 
                 while ( true) { 
                         //阻塞式的接收一个数据包 
                        ds.receive(dp); 
                         //打印接收的数据 
                        System.out.println( "[" + dp.getAddress().getHostAddress() +  ":" + dp.getPort() +  "]" +  "的消息:" +  new String(buff, 0, buff.length)); 
                        String msg =  "[" + dp.getAddress().getHostAddress() +  ":" + dp.getPort() +  "]" +  "服务端已经收到你的数据包了!"
                         //响应客户端,回复一个消息,当然这个端口地址需要从接收到的数据包中获取 
                        DatagramPacket dps =  new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, dp.getSocketAddress()); 
                        ds.send(dps); 
                } 
        } 
}
 
import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetSocketAddress; 

/** 
* 数据报套接字客户端;发送接收消息 

* @author leizhimin 2009-12-2 22:34:22 
*/
 
public  class TestUDPClient { 
         public  static  void main(String[] args)  throws IOException { 
                System.out.println( "--------------client端------------"); 
                 byte[] buff =  "Hello Server!".getBytes(); 
                 //创建一个数据包,其中指定了发送的目标地 
                DatagramPacket dp =  new DatagramPacket(buff, 0, buff.length,  new InetSocketAddress( "192.168.14.117", 9999)); 
                 //创建一个数据报套接字,绑定到随机可用的端口上 
                DatagramSocket ds =  new DatagramSocket(); 
                 //通过该数据包套接向目标发送数据 
                ds.send(dp); 

                 byte[] buffres =  new  byte[1024]; 
                 //创建一个用来接收服务器反馈的数据包 
                DatagramPacket dbres =  new DatagramPacket(buffres, 0, buffres.length, ds.getLocalAddress(), ds.getLocalPort()); 
                 //接收数据 
                ds.receive(dbres); 
                 //打印接收的数据 
                System.out.println( new String(buffres, 0, buffres.length)); 
                 //关闭套接字 
                ds.close(); 
        } 
}
 
服务端控制台:
--------------server端------------ 
[192.168.14.117:4198]的消息:Hello Server!
 
客户端控制台:
--------------client端------------ 
[192.168.14.117:4198]服务端已经收到你的数据包了!
 
如果将消息的发送接收做成多线程异步IO模式,就可以简单实现聊天工具的功能了。
 


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/237904,如需转载请自行联系原作者
相关文章
|
2月前
|
网络协议 算法 安全
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
30 1
|
Android开发
Android 使用UDP进行通讯(发送数据和接收数据)
Android 使用UDP进行通讯(发送数据和接收数据)
1559 0
|
Linux C++ Windows
Linux与Windows的UDP通讯代码实现
Linux与Windows的UDP通讯代码实现
331 0
Linux与Windows的UDP通讯代码实现
|
Python
Python编程:socket实现udp通讯
Python编程:socket实现udp通讯
124 0
|
Java 网络协议
JAVA通信编程(四)——UDP通讯
经过TCP和串口通讯编程的了解,相信大家应该掌握CommBuff的套路了,这里首先展示的是通过UDP编程的方式实现CommBuff接口,之后通过简单工厂模式的应用说明如何屏蔽底层通讯差异。 UdpImpl类如下: package com.
830 0
|
网络协议 容器 Java
Socket编程 (异步通讯) (Tcp,Udp) - Part2
原文 http://www.cnblogs.com/zengqinglei/archive/2013/04/30/3051629.html Socket编程(异步通讯)(Tcp,Udp)   上一章主要展示了Socket的Tcp\Udp两种协议下的基本通讯方式,属于同步通讯。
1841 0
|
1月前
|
域名解析 网络协议 关系型数据库
tcp和udp的区别是什么
TCP和UDP是互联网协议中的传输层协议。TCP是面向连接的,通过三次握手建立可靠连接,提供数据顺序和可靠性保证,适用于HTTP、FTP等需要保证数据完整性的应用。UDP则是无连接的,数据报独立发送,传输速度快但不保证可靠性,常用于实时通信、流媒体和DNS解析等对速度要求高的场景。根据应用需求选择合适的协议至关重要。
tcp和udp的区别是什么
|
1月前
|
网络协议 网络性能优化
认识TCP和UDP的区别
重排机制:由于UDP数据包可能因网络原因而发生乱序,因此在应用层需要对接收到的数据包进行排序。
31 4
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信