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,如需转载请自行联系原作者
相关文章
|
6月前
|
网络协议 算法 安全
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
77 1
|
Android开发
Android 使用UDP进行通讯(发送数据和接收数据)
Android 使用UDP进行通讯(发送数据和接收数据)
1880 0
|
Linux C++ Windows
Linux与Windows的UDP通讯代码实现
Linux与Windows的UDP通讯代码实现
392 0
Linux与Windows的UDP通讯代码实现
|
Python
Python编程:socket实现udp通讯
Python编程:socket实现udp通讯
168 0
|
Java 网络协议
JAVA通信编程(四)——UDP通讯
经过TCP和串口通讯编程的了解,相信大家应该掌握CommBuff的套路了,这里首先展示的是通过UDP编程的方式实现CommBuff接口,之后通过简单工厂模式的应用说明如何屏蔽底层通讯差异。 UdpImpl类如下: package com.
847 0
|
网络协议 容器 Java
Socket编程 (异步通讯) (Tcp,Udp) - Part2
原文 http://www.cnblogs.com/zengqinglei/archive/2013/04/30/3051629.html Socket编程(异步通讯)(Tcp,Udp)   上一章主要展示了Socket的Tcp\Udp两种协议下的基本通讯方式,属于同步通讯。
1918 0
|
24天前
|
网络协议 算法 网络性能优化
|
12天前
|
网络协议 SEO
TCP连接管理与UDP协议IP协议与ethernet协议
TCP、UDP、IP和Ethernet协议是网络通信的基石,各自负责不同的功能和层次。TCP通过三次握手和四次挥手实现可靠的连接管理,适用于需要数据完整性的场景;UDP提供不可靠的传输服务,适用于低延迟要求的实时通信;IP协议负责数据包的寻址和路由,是网络层的重要协议;Ethernet协议定义了局域网的数据帧传输方式,广泛应用于局域网设备之间的通信。理解这些协议的工作原理和应用场景,有助于设计和维护高效可靠的网络系统。
24 4
|
18天前
|
缓存 负载均衡 网络协议
面试:TCP、UDP如何解决丢包问题
TCP、UDP如何解决丢包问题。TCP:基于数据块传输/数据分片、对失序数据包重新排序以及去重、流量控制(滑动窗口)、拥塞控制、自主重传ARQ;UDP:程序执行后马上开始监听、控制报文大小、每个分割块的长度小于MTU