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,如需转载请自行联系原作者
相关文章
|
4月前
|
网络协议 算法 安全
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯
56 1
|
Android开发
Android 使用UDP进行通讯(发送数据和接收数据)
Android 使用UDP进行通讯(发送数据和接收数据)
1803 0
|
Linux C++ Windows
Linux与Windows的UDP通讯代码实现
Linux与Windows的UDP通讯代码实现
366 0
Linux与Windows的UDP通讯代码实现
|
Python
Python编程:socket实现udp通讯
Python编程:socket实现udp通讯
152 0
|
Java 网络协议
JAVA通信编程(四)——UDP通讯
经过TCP和串口通讯编程的了解,相信大家应该掌握CommBuff的套路了,这里首先展示的是通过UDP编程的方式实现CommBuff接口,之后通过简单工厂模式的应用说明如何屏蔽底层通讯差异。 UdpImpl类如下: package com.
842 0
|
网络协议 容器 Java
Socket编程 (异步通讯) (Tcp,Udp) - Part2
原文 http://www.cnblogs.com/zengqinglei/archive/2013/04/30/3051629.html Socket编程(异步通讯)(Tcp,Udp)   上一章主要展示了Socket的Tcp\Udp两种协议下的基本通讯方式,属于同步通讯。
1896 0
|
21天前
|
消息中间件 网络协议 算法
UDP 和 TCP 哪个更好?
【8月更文挑战第23天】
64 0
|
26天前
|
网络协议 网络安全 Python
电脑中 TCP/UDP 端口是否开放的测试:令人意想不到的神奇策略等你发现!
【8月更文挑战第19天】在网络管理和维护中,常需确认TCP/UDP端口是否开放以确保服务运行顺畅。端口如同计算机对外通信的“门”,TCP提供可靠连接,UDP则快速但无连接。测试端口是否开放的方法多样:可用`telnet`测试TCP端口,如`telnet localhost 80`;UDP测试较复杂,可用`nc`工具,如`nc -u -z localhost 53`。此外,也有在线工具可供选择,但需确保其安全性。
38 1
|
27天前
|
缓存 网络协议 算法
TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!
TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!