网络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是 ...
随机推荐
- this指针和const成员函数
1.this指针 1)this指针是成员函数的隐式参数,成员函数通过this指针来访问调用它自己的那个对象,成员函数对各成员的访问均通过this进行 2)当某个对象调用它的成员函数时,编译器会把这个对 ...
- javaWeb的验证码编写
一.前言 验证码可以说在我们生活中已经非常普遍了,任何一个网站,任何一个App都会有这个功能,但是为啥要有这个呢?如何做才能做出来呢?下面小编会带领大家一起用java完成一个验证码的功能. 二.验证码 ...
- ArcGIS 点云转DEM
- 《计算机科学基础》学习笔记_Part 1 Computer and Data
Technorati Tags: 计算机科学基础,读书笔记 Chapter 1. Introduction Ø 计算机:黑盒,Output Data=f(Input Data, Program) Ø ...
- 3、利用GDB进行程序调试
本文将用一个实际例子讲解如何通过GDB进行程序调试. 首先,我们需要理解的是GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,其产生和调试的目的是让调试者知道,程序在执行时内部发生了什么 ...
- python编写producer、consumer
自主producer.consumer 首先在不同的终端,分别开启两个consumer,保证groupid一致 ]# python consumer_kafka.py 执行一次producer ]# ...
- jQuery插件初级练习1答案
html: <script> $(".btn").click(function(){ $.color($("#box"),"blue&qu ...
- AngularJs 指令中 的Scope属性
一.概念说明 可以是true. false .哈希对象 {} 1.true 新创建了一个作用域,且继承了父作用域:在初始化的时候,用了父作用域的属性和方法去填充我们这个新的作用域.它和父作用域不是同一 ...
- 使用NetHogs监控进程网络使用情况
Nethogs 是一个终端下的网络流量监控工具,它的特别之处在于可以显示每个进程的带宽占用情况,这样可以更直观获取网络使用情况.它支持 IPv4 和 IPv6 协议.支持本地网卡及 PPP 链接. 使 ...
- unigui编译路径设置
unigui编译路径设置 先设路径变量 再追加如下路径,即可成功编译: ;$(uni)\uniTools\Dcu\Delphi2021;$(uni)\uniGUI\Dcu\Delphi2021;$(u ...