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 ...
随机推荐
- uni-app通过判断接口403跳转登录页面的问题
需求: 当向后端请求接口返回 403 的时候,直接跳到登录页面让用户登录 实现方案: 在请求结束后拦截器中判断,如果是 403 就跳转 遇到难题: 一级页面(我的) onShow() 中有接口请求,用 ...
- 大规模定制模式之于MES的三点思考
大规模定制(Mass Custermization) ,其目标是大规模生产定制化产品,并且在效率.质量(一致性)等指标方面与大规模批量生产等齐. 这是一种理想或者追求,其提出的背景是目前越发普遍的多品 ...
- 命令行运行ionic run android 出现running one or more of the platforms Error
问题如图所示: 或者 这个问题也是由于端口号被占用的原因,解决的方法在上篇博客<Ionic run android失败解决方法>.
- ASCII、Unicode、utf-8、utf-16、utf-32
理解ASCII.Unicode.utf-8.utf-16.utf-32 目录 理解ASCII.Unicode.utf-8.utf-16.utf-32编码与解码字符集字符编码ASCIIUnicodeUT ...
- linux部署django项目流程(全)
1.python3和python2共存配置 流程在下面网址中 https://www.cnblogs.com/vinic-xxm/p/11358894.html 2.安装依赖包 yum install ...
- rocketmq 使用中碰到的一些问题
1.rocket 入门使用 http://rocketmq.apache.org/docs/quick-start/ 2.内存不够 默认配置内存配置比较高,在测试环境启动会有问题因此需要调整默认的内存 ...
- Nginx 高级配置-实现多域名HTTPS
Nginx 高级配置-实现多域名HTTPS 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx支持基于单个IP实现多域名的功能 Nginx支持基于单个IP实现多域名的功能 ...
- 用Python玩转微信
Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat.readthedocs.io ...
- 给某mooc站点准备的FE大纲
https://segmentfault.com/a/1190000000465431 https://blog.csdn.net/mike_chen2stockings/article/detail ...
- AtCoder Grand Contest 033 题解
传送门 我比赛的时候怕不是在睡觉啊-- \(A\ Darker\ and\ Darker\) 我是不是想得太复杂了--根本没必要像我这样做吧-- 首先问题可以转化成令\(p_{i,j}\)表示到\(( ...