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编程的更多相关文章

  1. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

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

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

  3. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  4. 37 - 网络编程-UDP编程

    目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议,使用UDP协议时,不需要建立连 ...

  5. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  6. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  7. [C# 网络编程系列]专题六:UDP编程

    转自:http://www.cnblogs.com/zhili/archive/2012/09/01/2659167.html 引用: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当 ...

  8. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

  9. iOS 网络编程 TCP/UDP HTTP

    一.HTTP协议的主要特点: 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由Content-Type加以标记 4 ...

随机推荐

  1. 配置Java,jdk环境变量

    注意:所有的都是配系统变量 变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.8.0_202(以自己的为准)变量名:Path 变量值:%JAVA_HOME%\b ...

  2. Qt隐式共享机制

    1.浅拷贝 浅拷贝-引用类型.浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同),对其中任何一个对象的改动都会影响另外一个对象. 2.深拷贝 而深拷贝-值类型.深拷贝是指源对象与 ...

  3. Jmeter 在 beanshell 脚本中写日志

    JMETER 在执行时,会写日志数据,我们在编写脚本的时候也可以自己写日志. 日志记录再jmeter 的bin 目录的 jmeter.log 文件中. jmeter 比较人性化,它在这里提供了脚本可以 ...

  4. 不同平台下int类型、指针类型的数据大小

    不同平台下int类型.指针类型的数据大小 对于int类型数据和指针类型数据的大小,是非常基础的问题. 在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类 ...

  5. Linux 批量查找并替换文件夹下所有文件的内容

    1.批量查找某个目下文件的包含的内容 cd etc grep -rn "查找的内容" ./ 2.批量替换某个目下所有包含的文件的内容 cd etc sed -i "s/查 ...

  6. 葫芦娃团队对火鸡堂、基于云的胜利冲锋队团队的Beta产品测试报告

    Beta项目互测 课程名称:软件工程1916|W(福州大学) 作业要求:Beta阶段团队项目互评 团队名称:葫芦娃队 作业目标:Beta项目互测 一.火鸡堂团队产品测试 1.截图(推荐用动态gif图录 ...

  7. [Algorithm] 53. Maximum Subarray

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  8. 推荐:Markdown编辑软件 --- 小书匠

    推荐:Markdown编辑软件 --- 小书匠 小书匠 使用手册 Markdown编辑工具推荐小书匠工具,功能丰富,简单使用,可以一步导文件至博客园主页. 概要 小书匠编辑器是一款专为markdown ...

  9. 【字符串】【P5830】 【模板】失配树

    [字符串][P5830] [模板]失配树 Description 给定一个长度为 \(n\) 的字符串 \(S\),有 \(m\) 次询问,每次询问给定 \(S\) 的两个前缀,求它们的最长公共 bo ...

  10. Python中字符串匹配函数startswith()函数

    1.函数用途含义 Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则在指定范围内 ...