网络Socket编程UDP协议例子
服务端代码
public class UDPChatServer {
//通讯端口
private Integer port=8000;
//数据报文的通讯通道对象
private DatagramChannel channel;
//发送数据的最大大小
private final Integer MAX_SIZE=1024;
private Charset charset=Charset.forName("UTF-8");
public UDPChatServer() throws IOException {
//DatagramChannel本身的open方法返回一个DatagramChannel对象
channel=DatagramChannel.open();
//获取数据报的socket对象UDP 的socket
DatagramSocket socket=channel.socket();
//将socket对象绑定上本地的端口
SocketAddress address=new InetSocketAddress(port);
socket.bind(address);
System.out.println("server started!");
}
private void service(){
//初始化一个新的字节缓存对象容量为MAX_SIZE=1024 个字节。
ByteBuffer receiveBuffer=ByteBuffer.allocate(MAX_SIZE);
while (true){
//将缓存中的数据清空
receiveBuffer.clear();
try {
//从渠道中获取固定大小的数据,获取client连接
InetSocketAddress client= (InetSocketAddress) channel.receive(receiveBuffer);
//客户端每次请求到receiveBuffer里
//设置buffer指针的下标0。这样就可以从buffer开头,对该buffer进行遍历(读取)了
receiveBuffer.flip();
//将字节数据转为字符串
String msg= charset.decode(receiveBuffer).toString();
System.out.println(String.format("new data :%s %s %s ",client.getAddress(),client.getPort(),msg));
//应答client 发送数据到通道中的客户端
channel.send(ByteBuffer.wrap(reply(msg).getBytes(charset)),client);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private String reply(String word){
return "you said :"+word;
}
public static void main(String[] args) throws IOException {
new UDPChatServer().service();
}
}
客户端代码:
public class UDPChatClient {
private Integer port=8000;
private String host="localhost";
//UDP socket
private DatagramSocket socket;
private InetAddress address;
private Charset charset=Charset.forName("UTF-8");
public UDPChatClient() throws IOException {
socket=new DatagramSocket();
//设置服务器的地址
address=InetAddress.getByName(host);
System.out.println("connection ok");
}
public static void main(String[] args) throws IOException {
new UDPChatClient().say();
}
private void say() throws IOException {
BufferedReader localreader=new BufferedReader(new InputStreamReader(System.in));
String word;
while ((word=localreader.readLine())!=null){
// 将string转为byte数组 发送udp包
byte[] data=word.getBytes(charset);
//组装包指定ip和端口的数据包
DatagramPacket outputPacket=new DatagramPacket(data,data.length,address,port);
//发送
socket.send(outputPacket);
//接收udp包放到byte数组中
DatagramPacket inputPacket=new DatagramPacket(new byte[1024],1024);
socket.receive(inputPacket);
//打印获取的数据
System.out.println(new String(inputPacket.getData(),0,inputPacket.getLength(),charset));
//客户端主动关闭
if (word.equals("bye")){
socket.close();
break;
}
}
}
}
网络Socket编程UDP协议例子的更多相关文章
- 网络Socket编程TCP协议例子
1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...
- UDP协议网络Socket编程(java实现C/S通信案例)
我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...
- socket之UDP协议,并发编程介绍,操作系统发展史
socket之UDP协议 1.UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection 参考 ...
- Java:基于TCP协议网络socket编程(实现C/S通信)
目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...
- java多线程实现TCP网络Socket编程(C/S通信)
目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...
- 3、网络并发编程--udp代码、操作系统发展史、多道技术、进程理论
昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...
- python网络-Socket之udp编程(24)
一.udp简介 udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议. udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地. udp在 ...
- 网络编程 - UDP协议
UDP协议 服务端 ''' UDP 协议 又称 数据报协议 SOCK_DGRAM ''' from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 ...
- 网络编程——UDP协议和通信
第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...
随机推荐
- Oracle中根据当前时间和活动类型去数据库查询活动id
活动类型默认是1,代表邀请好友 select * from t_invite_activityinfo twhere sysdate >= t.begintime and sysdate< ...
- Linux服务器密钥安全登录
使用密钥登录的好处:1.省事,不用每次去敲用户名和密码:2.安全,密钥长度一般是1024位,比我们设的密码要长得多: 以下是为新用户jackson添加密钥登录的步骤. 1.添加用户,并添加到sudoe ...
- 查看Redis集群主从对应关系工具
工具的作用: 1)比"cluster nodes"更为直观的显示结果 2)指出落在同一个IP上的master 3)指出落在同一个IP上的master和slave对 运行效果图: 源 ...
- Matlab用mpeaks函数求峰值点坐标
clear;clc;close all % 初始化 m = [-6,-2,0,2,4,6]; sigma = [1,1,0.5,0.25,0.6,2]; h = [1,2,3,2,2.13,3.14] ...
- css 特殊使用技巧
1 border颜色设置 border-color: transparent black black black; 分别设置四条边框的颜色 上边transparent 透明无色 2 阴影 t ...
- Async Return Types
Async methods have three possible return types: Task<TResult>, Task, and void. The Task<TRe ...
- 【repost】DOM CRUD
//DOM 的 CRUD // c 创建create // 1.直接往body中动态的添加标签(可以是任意类型)document.write('helloWorld');document.write( ...
- POJ2229--Sumsets(动态规划)
Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...
- Tarjan求缩点化强连通图
Describe: 求一个有向图加多少条边可以变成一个强连通图 Solution: Tarjan缩点染色后,判断出度和入度,所有点的出度 = 0 的和 和 入度 = 0 的和的最大值即为所求. 缩点染 ...
- 编程中常用的DOS命令
1. dir directory 无参数:查看当前所在目录的文件和文件夹. /s : 查看当前目录以及其所有子目录的文件和文件夹 /a :查看包含的隐含文件的所有文件. /ah :只显示出隐含文 ...