服务端代码

 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协议例子的更多相关文章

  1. 网络Socket编程TCP协议例子

    1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...

  2. UDP协议网络Socket编程(java实现C/S通信案例)

    我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...

  3. socket之UDP协议,并发编程介绍,操作系统发展史

    socket之UDP协议 1.UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection 参考 ...

  4. Java:基于TCP协议网络socket编程(实现C/S通信)

    目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...

  5. java多线程实现TCP网络Socket编程(C/S通信)

    目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...

  6. 3、网络并发编程--udp代码、操作系统发展史、多道技术、进程理论

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...

  7. python网络-Socket之udp编程(24)

    一.udp简介 udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议. udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地. udp在 ...

  8. 网络编程 - UDP协议

    UDP协议 服务端 ''' UDP 协议 又称 数据报协议 SOCK_DGRAM ''' from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 ...

  9. 网络编程——UDP协议和通信

    第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...

随机推荐

  1. vba中布尔类型、字符串操作

    在vba中,bool类型数据可以参与数学运算,true为-1,false为0 Sub mysub() Dim mybool As Boolean Debug.Print Debug.Print myb ...

  2. java se的那些细节

    局部变量:方法体内或语句块内,不能有修饰符 成员变量:与类的对象共存,可以有修饰符 类属性:与类共存,可以有修饰符 一.局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基 ...

  3. Keras人工神经网络多分类(SGD)

    import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import ...

  4. linux 后台执行nohup 命令,终端断开无影响

    nohup /root/start.sh & 在shell中回车后提示: [~]$ appending output to nohup.out原程序的的标准输出被自动改向到当前目录下的nohu ...

  5. C++编译器详解(三)函数调用的区别:_cdecl以及_stdcall

    1._stdcall是Pascal程序的缺省调用方式,通常用于Win32 API中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上&qu ...

  6. Unicode和多字节的相互转换

    多字节转Unicode 四步: Step1 #include <iostream> #include "windows.h" using namespace std; ...

  7. IT桔子-抓取数据

  8. MapGIS SDK(C++)【基础篇】

    算法测试:Demo.Test https://www.cnblogs.com/2008nmj/p/10060847.html //例1-1 简单要素 void AppendSFeature(CSFea ...

  9. 设置customer_id

    update t_user_identification u set u.customer_id = (select c.customer_id from t_customer c from t_us ...

  10. 20155326 2016-2017-2《Java程序设计》课程总结

    20155326 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 20155326刘美岑的第一次作业:第一次写博客,写下了对java的期待 20155326 ...