简单的UDP代码 客户端+服务器 (网络真好玩,发什么自动回复什么,还能查字典呢,一起来玩呀)

本文主要是介绍简单的UDP代码 客户端+服务器 (网络真好玩,发什么自动回复什么,还能查字典呢,一起来玩呀),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简单的UDP echo 服务器+客户端
发什么,回什么

服务器端的代码如下

package udp.echo;import java.net.*;public class Server{
public static void main(String[] args) throws IOException{
//新建一个DatagramSocket
DatagramSocket udpServerSocket=new DatagramSocket(9898);  //连接的同时直接绑定9898端口,如果一台主机有多个网卡,就需要绑定IP+端口
//接下来等着收消息
byte[] receiveBuffer=new byte[1024];//传过来的是二进制数据流,需要一个字节数组来接收
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length);
udpServerSocket.receive(receivePacket);
InetAddress clientAddress=recievePacket.getAddress();
System.out.printf("我从 %s:%d 收到了消息%n",clientAddress.getHostAddress(),receivePacket.getport());
System.out.printf("我一共收到了%d字节的数据%n",receivePacket,getLength())
//需要将发过来的二进制数据流进行解码
String message=new String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");
System.out.println(message);//收到消息了byte[] sendBuffer=message.getButes("UTF-8");
DatagramPacket sendPacket=new DatagramPact(sendBuffer,sendBuffer.length,clientAddress,receivePacket.getPort());
udpServerSocket.send(sendPacket);udpServerSocket.close();  //最后要关闭连接
}

客户端的代码如下:

package udp.echo;import java.net.*;public class Client{public static void main(String[] args) throws IOException{//建立连接DatagramSocket clientSocket=new DatagramSocket(); //客户端不需要绑定端口啥的,直接发送数据String message="收到我的消息没?";//需要将这个文本转成字节型的byte[] sendBuffer=message.getBytes("UTF-8");//默认使用UTF-8编解码,但是推荐写上//构建DatagramPacketbyte[] serverIP=new byte[4];//地址是IPv4类型的,所以是4位//我要发送给本机,本机默认IP地址是127.0.0.1  改成别的主机的IP不同设备互动会更有意思哦(*^^*)serverIP[0]=127;serverIP[1]=0;serverIP[2]=0;serverIP[3]=1;InetAddress serverAddress=InetAddress.getByAddress(serverIP);DatagramPacket sendPacket=new DatagramPacket(sendBuffer,sendBuffer.length,serverAddress,9898);//客户端要带着IP和端口,知道自己往哪儿发,端口号要和服务器那边一致udpClientSocket.send(sendPacket);//发送数据byte[] receiveBuffer=new byte[1024];
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length);
udpClientSocket.receive(receivePacket);
String responseMessage=new String(receivePacket.getData(),0,receivePacket.getLenth(),"UTF-8");
System.out.println("responseMessage");udpClientSocket.close(); //关闭连接

注意:1.无论是发送数据,还是接收数据都需要一个byte类型的数据,需要进行字节类型和字符类型的转换;
2.需要指定相同的编码方式;
3.服务器是先收后发,客户端是先发后收,其他都是类似的;
4.通过DatagramPacket 更加深入的理解UDP是面向报文的

2.把上面的代码稍加改动,就是一个查字典小工具啦

服务器的代码如下:

public class Server{
private static final Map<String,String> dict=new HashMap<>();
static{
dict.put("苹果","apple");
dict.put("梨","pear");
dict.put("桃子","peach");
dict.put("葡萄","grape");
dict.put("香蕉","banana");   //手动输进去有点low啊
}
public static void main(String[] args) throws IOException{
//新建一个DatagramSocket
DatagramSocket udpServerSocket=new DatagramSocket(9898);  //连接的同时直接绑定9898端口,如果一台主机有多个网卡,就需要绑定IP+端口
//接下来等着收消息
byte[] receiveBuffer=new byte[1024];//传过来的是二进制数据流,需要一个字节数组来接收
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer,receiveBuffer.length);
udpServerSocket.receive(receivePacket);
InetAddress clientAddress=recievePacket.getAddress();
System.out.printf("我从 %s:%d 收到了消息%n",clientAddress.getHostAddress(),receivePacket.getport());
System.out.printf("我一共收到了%d字节的数据%n",receivePacket,getLength())
//需要将发过来的二进制数据流进行解码
String message=new String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");
System.out.println(message);//收到消息了String responseMessage=dict.getOrDefault(message,"我也不知道呀");byte[] sendBuffer=responseMessage.getButes("UTF-8");
DatagramPacket sendPacket=new DatagramPact(sendBuffer,sendBuffer.length,clientAddress,receivePacket.getPort());
udpServerSocket.send(sendPacket);udpServerSocket.close();  //最后要关闭连接
}

客户端的代码如下:

package udp.echo;import java.net.*;public class Client{public static void main(String[] args) throws IOException{//建立连接DatagramSocket clientSocket=new DatagramSocket(); //客户端不需要绑定端口啥的,直接发送数据while(true){Scanner scanner=new Scanner(System.in); String message=scanner.nextline();byte[] sendBuffer=message.getBytes("UTF-8");//默认使用UTF-8编解码,但是推荐写上//构建DatagramPacketbyte[] serverIP=new byte[4];//地址是IPv4类型的,所以是4位//我要发送给本机,本机默认IP地址是127.0.0.1  改成别的主机的IP不同设备互动会更有意思哦(*^^*)serverIP[0]=127;serverIP[1]=0;serverIP[2]=0;serverIP[3]=1;InetAddress serverAddress=InetAddress.getByAddress(serverIP);DatagramPacket sendPacket=new DatagramPacket(sendBuffer,sendBuffer.length,serverAddress,9898);//客户端要带着IP和端口,知道自己往哪儿发,端口号要和服务器那边一致udpClientSocket.send(sendPacket);//发送数据byte[] receiveBuffer=new byte[1024];
DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length);
udpClientSocket.receive(receivePacket);
String responseMessage=new String(receivePacket.getData(),0,receivePacket.getLenth(),"UTF-8");
System.out.println("responseMessage");
}udpClientSocket.close(); //关闭连接

3.稍加改动就是一个聊天软件

聊天宝欢迎您嘞!

在这里插入图片描述
在这里插入图片描述

这篇关于简单的UDP代码 客户端+服务器 (网络真好玩,发什么自动回复什么,还能查字典呢,一起来玩呀)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391717

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依