博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scoket:UDP通讯模型
阅读量:6595 次
发布时间:2019-06-24

本文共 3636 字,大约阅读时间需要 12 分钟。

 
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,如需转载请自行联系原作者
你可能感兴趣的文章
APICLOUD 1.1.0 开发环境搭建
查看>>
React通用Web应用框架-概述
查看>>
服务器 ssl 配置
查看>>
【freemaker实现导出word②】代码实现导出word(包括导出list数据和导出图片到word)...
查看>>
vue vue-router vuex element-ui axios学习笔记(六)在项目中使用MongoDB完成注册
查看>>
使用 Electron 调用基本或附带图像的通知
查看>>
JS引用类型数据的浅拷贝与深拷贝
查看>>
JS函数节流防抖
查看>>
前端面试-js之object类型JSON
查看>>
webpack2 示例之:Scope Hoisting 和 Code Splitting
查看>>
云端开发运维的三大减速带
查看>>
简简单单制作贪吃蛇小游戏
查看>>
Laravel 从入口到输出过程详解
查看>>
Mesh(一)----System Architecture
查看>>
我不是来约架,我只是请他们说几句实话——QCon上海2015编程语言专题前瞻
查看>>
前端好文章收集(持续更新)
查看>>
border、outline、boxshadow那些事以及如何做内凹圆
查看>>
基于JavaScript技术完成单击事件完成显示和隐藏
查看>>
小米战略入股TCL,大家电业务供应链获得强援
查看>>
Android判断用户的网络类型(2/3/4G、wifi)
查看>>