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,如需转载请自行联系原作者
相关文章
|
10月前
|
网络协议 算法 安全
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
101 1
|
Android开发
Android 使用UDP进行通讯(发送数据和接收数据)
Android 使用UDP进行通讯(发送数据和接收数据)
1977 0
|
Linux C++ Windows
Linux与Windows的UDP通讯代码实现
Linux与Windows的UDP通讯代码实现
447 0
Linux与Windows的UDP通讯代码实现
|
Python
Python编程:socket实现udp通讯
Python编程:socket实现udp通讯
191 0
|
Java 网络协议
JAVA通信编程(四)——UDP通讯
经过TCP和串口通讯编程的了解,相信大家应该掌握CommBuff的套路了,这里首先展示的是通过UDP编程的方式实现CommBuff接口,之后通过简单工厂模式的应用说明如何屏蔽底层通讯差异。 UdpImpl类如下: package com.
859 0
|
网络协议 容器 Java
Socket编程 (异步通讯) (Tcp,Udp) - Part2
原文 http://www.cnblogs.com/zengqinglei/archive/2013/04/30/3051629.html Socket编程(异步通讯)(Tcp,Udp)   上一章主要展示了Socket的Tcp\Udp两种协议下的基本通讯方式,属于同步通讯。
1961 0
|
3月前
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。
|
3月前
|
存储 网络协议 安全
用于 syslog 收集的协议:TCP、UDP、RELP
系统日志是从Linux/Unix设备及网络设备生成的日志,可通过syslog服务器集中管理。日志传输支持UDP、TCP和RELP协议。UDP无连接且不可靠,不推荐使用;TCP可靠,常用于rsyslog和syslog-ng;RELP提供可靠传输和反向确认。集中管理日志有助于故障排除和安全审计,EventLog Analyzer等工具可自动收集、解析和分析日志。
212 2
|
4月前
|
网络协议 网络性能优化 数据处理
深入解析:TCP与UDP的核心技术差异
在网络通信的世界里,TCP(传输控制协议)和UDP(用户数据报协议)是两种核心的传输层协议,它们在确保数据传输的可靠性、效率和实时性方面扮演着不同的角色。本文将深入探讨这两种协议的技术差异,并探讨它们在不同应用场景下的适用性。
127 4