62 网络编程(三)——UDP编程
UDP编程标准步骤
服务器端
- 使用DatagramSocket创建服务端:DatagramSocket server = new DatagramSocket(port);//参数为自定义端口号
- 准备接受容器1:必须是byte数组
- 使用DatagramPacket创建接受容器2:DatagramPacket packet = new DatagramPacket(容器1,start,length);//容器2的名字写为了packet
- 接受数据:serve.receive(packet);
- 处理数据:此时数据已经存储到容器1中,对容器1处理即可
- 关闭:根据需要关闭服务端 server.close()
客户端
- 使用DatagramSocket创建客户端:DatagramSocket client = new DatagramSocket(port);//参数为自定义端口号
- 准备数据:必须是byte数组
- 使用DatagramPacket创建packet包:DatagramPacket packet = new DatagramPacket(数据数组,start,数组length,new InetSocketAddress("目标主机地址",port));
- 发送数据:client.send(packet);
- 关闭 :client.close()
以下为一个实例
先启用服务器端,再启动客户端,然后查看服务器端的console结果
Server端
public static void main(String[] args) throws IOException{
System.out.println("服务端启动");
//创建客户端
DatagramSocket server = new DatagramSocket(9917);
//创建容器
byte[] container = new byte[1024*60];
//创建packet
DatagramPacket packet = new DatagramPacket(container,0,container.length);
//接收数据
server.receive(packet);
//处理数据
System.out.println(new String(container,0,container.length));
//关闭
server.close();
}
client端
public static void main(String[] args) throws IOException{
System.out.println("客户端启动");
//创建客户端
DatagramSocket client = new DatagramSocket(12454);
//准备数据
String str = "最后一遍了";
byte[] datas = str.getBytes();
//创建packet
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9917));
//发送
client.send(packet);
//关闭
client.close();
}
运行结果:
服务端启动
最后一遍了
多线程UDP发送与接收
我们将客户端与服务器端各写为一个实现了Runnale的类,这样在其它地方就可以使用线程来启动这两个端,达到双向交流的目的。
Server端
package _20191218; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; /**
* UDP实现接收
* @author TEDU
*
*/
public class ThreadReceive implements Runnable{
private int port;
public ThreadReceive(int port) {
this.port = port;
}
public void run() {
//创建服务器端
System.out.println("服务端开启");
DatagramSocket server = null;
try {
server = new DatagramSocket(port);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//创建容器
byte[] container;
//创建packet
DatagramPacket packet;
while(true) {
container = new byte[1024*10];
packet = new DatagramPacket(container,0,container.length);
//接收
try {
server.receive(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//处理
String message = new String(container,0,packet.getLength());
System.out.println(message);
// System.out.println(message.equals("quit"));
//释放
if(message.equals("quit")) {
break;
}
}
server.close();//释放
}
}
Client端
package _20191218; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Scanner;
/**
* UDP实现发送
* @author TEDU
*
*/
public class ThreadSend implements Runnable{
private int port;
private int toPort;
private String address;
public ThreadSend(int port,int toPort,String address){
this.port = port;
this.toPort = toPort;
this.address = address;
}
public void run() {
//创建客户端
System.out.println("客户端开启");
DatagramSocket client = null;
BufferedReader reader = null;
Scanner scan = new Scanner(System.in);
String message = null;
byte[] datas;
DatagramPacket packet;
try {
reader = new BufferedReader(new InputStreamReader(System.in));
client = new DatagramSocket(port);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//准备数据
while(true) {
// message = scan.nextLine();
try {
message = reader.readLine();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
datas = message.getBytes();
//packet
packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(address,toPort));
//发送
try {
client.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
message = new String(datas,0,packet.getLength());
if(message.equals("quit")) break;
}
client.close();
}
}
用户1
package _20191218;
public class Talker1 {
public static void main(String[] args) {
//接收
new Thread(new ThreadReceive(5577)).start();//接收端口 5577
//发送
new Thread(new ThreadSend(5566,6677,"localhost")).start();//发送端口 5566
}
}
用户2
package _20191218;
public class Talker2 {
public static void main(String[] args) {
//接收
new Thread(new ThreadReceive(6677)).start();//接收端口 6677
//发送
new Thread(new ThreadSend(6666,5577,"localhost")).start();
}
}
运行测试

62 网络编程(三)——UDP编程的更多相关文章
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- python网络-Socket之udp编程(24)
一.udp简介 udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议. udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地. udp在 ...
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- 37 - 网络编程-UDP编程
目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议,使用UDP协议时,不需要建立连 ...
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
- [C# 网络编程系列]专题六:UDP编程
转自:http://www.cnblogs.com/zhili/archive/2012/09/01/2659167.html 引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当 ...
- TCP/IP协议网络编程以及UDP和TCP之传输协议
1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...
- iOS 网络编程 TCP/UDP HTTP
一.HTTP协议的主要特点: 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由Content-Type加以标记 4 ...
随机推荐
- 记录下vue keep-alive IOS下无法保存滚动scroll位置的问题
最近 做的项目,遇到了一点小麻烦,就是我一个页面A页面是加载 列表数据 ,B页面是展示详细信息的.A进去B时,缓存A页面. 效果 做出来 后,缓存是缓存数据 了,但是当我A页面的列表数据 好多,要滚动 ...
- Linux shell awk模式使用
awk的PATTERN表示方法: 1,正则表达式,格式为/regex/ 以冒号为分隔符,显示/etc/passwd以r开头的行的第一段 [root@wei awk]# awk -F: '/^r/{pr ...
- Django 学习笔记之模型高级用法
目录 1 复杂的字段类型 1.1 整数类型的区别 1.2 自增类型的区别 1.3 时间类型 1.4 FilePathField 1.5 FileField 1.6 ImageField 2 关系字段 ...
- Nginx编译安装脚本
Nginx是高性能的web服务器和反向代理服务器,在互联网公司中被广泛使用.以下是Nginx在centos7系统下的一键编译安装脚本,仅供参考,具体编译参数选项请结合实际生产环境需求进行选择,脚本 ...
- Python程序 #!/usr/bin/python 的解释
关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器 ...
- JDK8 Steam流操作
原文:https://github.com/niumoo/jdk-feature/blob/master/src/main/java/net/codingme/feature/jdk8/Jdk8Str ...
- wordpress迁移后登陆时出现Forbidden You don’t have permission to access /wp-login.php on this server
之前在vps上,最近迁移到了php虚拟主机上,迁移后发现无法登陆后台出现403:Forbidden You don’t have permission to access /wp-login.php ...
- 缓存中,2个注解:@cacheable 与 @cacheput 的区别
@cacheable:只会执行一次,当标记在一个方法上时表示该方法是支持缓存的,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果. @cac ...
- python基础语法19 面向对象总结,pickle保存对象注意事项
面向对象的三大特性: 继承,封装,多态 多态的三种表现形式:鸭子类型,继承父类,继承抽象类 pickle保存对象注意事项 class Foo: y = 20 def __new__(cls, *arg ...
- 09-赵志勇机器学习-k-means
(草稿) k-means: 1. 随机选取n个中心 2. 计算每个点到各个中心的距离 3. 距离小于阈值的归成一类. 4. 计算新类的质心,作为下一次循环的n个中心 5. 直到新类的质心和对应本次循环 ...