java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket
什么是UDP协议:
Java简单使用UDP:
DatagramSocket udpClient = new DatagramSocket() 端口随机 客户端
DatagramSocket udpSocket = new DatagramSocket(port) 指定端口 :服务端
package tcpandudp.udpexample; import java.io.IOException;
import java.net.*;
import java.util.Scanner; /**
* @ClassName UdpClient
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/12.
*/
public class UdpClient {
public static void main(String[] args) {
/**
* 键盘输入
*/
Scanner scanner = new Scanner(System.in); /**
* 构建客户端UDP Socket 端口随机 从键盘获取数据发送
* 初始化要发给服务端的数据包
*/
try (DatagramSocket udpClient = new DatagramSocket()){
/**
* 初始化要发给服务端的数据包
*/
DatagramPacket outputPacket = new DatagramPacket(new byte[0],0, InetAddress.getByName("127.0.0.1"),2233);
//返回数据的字节数组
byte[] inBuffer = new byte[4096];
/**
* 循环发送并获取返回数据
*/
while (scanner.hasNextLine()){
//获取键盘输入
String line = scanner.nextLine();
//将初始化的数据包加入数据
outputPacket.setData(line.getBytes());
// 使用socket 发送数据
udpClient.send(outputPacket); //返回数据包构建
DatagramPacket inputPacket = new DatagramPacket(inBuffer,inBuffer.length);
//返回数据写入inputPacket包
udpClient.receive(inputPacket);
System.out.println("收到返回数据:" + new String(inputPacket.getData(),0,inputPacket.getLength()));
}
} catch (SocketException | UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package tcpandudp.udpexample; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; /**
* @ClassName UDPServer
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/12.
*/
public class UDPServer {
public static void main(String[] args) {
/**
* 定义UDP服务端监听的端口
*/
int port = 2233;
/**
* 构造一个接受UDP数据的包
*/
byte[] inBuffer = new byte[4096];
DatagramPacket inPacket = new DatagramPacket(inBuffer,inBuffer.length);
/**
* 构建socket 接受数据放到UDP包中解析,
* udpSocket 实例放到try()语句中自动管理,报错后自动close()
*/
try (DatagramSocket udpSocket = new DatagramSocket(port)){
/**
* 获取客户端数据
*/
while (true){
//获取客户端数据,装到inPacket包中
udpSocket.receive(inPacket);
System.out.println(inBuffer == inPacket.getData()); //测试包中的数组和定义的inBuffer数组是否是同一个对象
/**
* 将收到的包中字节(inPacket.getData())转换为字符串
*/
System.out.println("收到:" + new String(inPacket.getData(),0,inBuffer.length));
/**
* 构建发送包
*/
DatagramPacket outPacket = new DatagramPacket(inPacket.getData(),inPacket.getLength(),inPacket.getSocketAddress());
//发送数据
udpSocket.send(outPacket);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MulticastSocket基于UDP协议实现多点广播:
package tcpandudp.udpexample; import java.io.IOException;
import java.io.PipedReader;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner; /**
* @ClassName MulticastSocketServerAndClient
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/12.
*/
public class MulticastSocketClient {
/**
* 多点广播的IP:224.0.0.0 到 239.255.255.255
*/
private static final String BROAD_CAST_IP = "230.1.1.1";
/**
* 多点广播的端口任意
*/
private static final int BROAD_CAST_PORT = 30000;
private void start(){
/**
* 创建广播socket
*/
try (MulticastSocket multicastSocket = new MulticastSocket(BROAD_CAST_PORT);
Scanner scanner = new Scanner(System.in);
){
/**
* 构建IP地址实例
* 初始化Socket 加入监听广播组地址(接收组内消息,向组内发送消息)
*/
InetAddress broadcastAddr = InetAddress.getByName(BROAD_CAST_IP);
multicastSocket.joinGroup(broadcastAddr);
/**
* 启动一个线程接收广播数据
*/
new Thread(){
@Override
public void run() {
/**
* 构建接收数据的UDP包
*/
byte[] inBuffer = new byte[4096];
DatagramPacket inPacket = new DatagramPacket(inBuffer,0,inBuffer.length);
/**
* 获取到数据输出
*/
while (true){
try {
multicastSocket.receive(inPacket);
System.out.println("收到:" + new String(inPacket.getData(),0,inPacket.getLength()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
/**
* 构建要发送的UDP数据包
* 主线程获取命令行输入,发送广播
*/
DatagramPacket outPacket = new DatagramPacket(new byte[0],0, broadcastAddr,BROAD_CAST_PORT);
while (scanner.hasNextLine()){
/**
* 获取输入内容字节,加到包中
* 然后发送出去
*/
outPacket.setData(scanner.nextLine().getBytes());
multicastSocket.send(outPacket);
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 程序入口
*/
public static void main(String[] args) {
new MulticastSocketClient().start();
}
}
java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket的更多相关文章
- java 网络编程基础 UDP协议DatagramSocket,MulticastSocket 实现局域网聊天软件(Server + Client模式)
开发思路: 服务端两个Socket: UDP的DatagramSocket接收客户端消息. 广播multicastSocket 发送广播消息 客户端一个Socket: multicastSocke ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- Java网络编程基础(Netty预备知识)
今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...
- java网络编程基础——TCP网络编程一
基于TCP协议的网络编程 TCP/IP协议是一种可靠的网络协议,它的通信的两端各自建立一个Socket,从而在通信的两端之间形成网络虚拟链路. Java使用Socket对象来代表两端的通信端口,并通过 ...
- java网络编程基础——网络基础
java网络编程 网络编程基础 1.常用的网络拓扑结构: 星型网络.总线网络.环线网络.树形网络.星型环线网络 2.通信协议的组成 通信协议通常由3部分组成: 语义部分:用于决定通信双方对话类型 语法 ...
- JAVA基础知识之网络编程——-基于UDP协议的通信例子
UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...
- java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...
- Java学习笔记52(网络编程:UDP协议案例)
InetAddress类: 表示互联网中的IP地址,示例: package demo; import java.net.InetAddress; import java.net.UnknownHost ...
- 网络编程: 基于UDP协议的socket
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...
随机推荐
- 力扣 - 剑指 Offer 10- I. 斐波那契数列
题目 剑指 Offer 10- I. 斐波那契数列 思路1(递归 / 自顶向下) 这题是很常见的一道入门递归题,可以采用自顶向下的递归方法,比如我们要求第n个位置的值,根据斐波那契数列的定义fib(n ...
- C/C++ Qt Tree与Tab组件实现分页菜单
虽然TreeWidget组件可以实现多节点的增删改查,但多节点操作显然很麻烦,在一般的应用场景中基本上只使用一层结构即可解决大部分开发问题,TreeWidget组件通常可配合TabWidget组件,实 ...
- Topcoder 12519 ScotlandYard(点对 dp+最长路)
题面传送门 题意: 有两个人 A 和 B 玩一个游戏.游戏规则大致是这样的: 有 \(n\) 个城市和三种交通工具公交.地铁和出租车. 给出三个 \(n\times n\) 的字符矩阵 \(b,m,t ...
- 睡眠或者重启windows,无法ssh连接或者pingVMware的虚机
睡眠后无法直接ssh重连VMware主机问题 这个问题我在win8上出现过,win10看了下同事可以正常连,不知道其他有没有问题. 解决方法: 1.关闭vmnet8和vmnet0里面的 npcap 功 ...
- 【Redis】过期键删除策略和内存淘汰策略
Redis 过期键策略和内存淘汰策略 目录 Redis 过期键策略和内存淘汰策略 设置Redis键过期时间 Redis过期时间的判定 过期键删除策略 定时删除 惰性删除 定期删除 Redis过期删除策 ...
- 巩固javaweb第十三天
巩固内容: HTML 表格 表格由 <table> 标签来定义.每个表格均有若干行(由 <tr> 标签定义),每行被分割为若干单元格(由 <td> 标签定义).字母 ...
- day 03Linux修改命令提示符
day 03Linux修改命令提示符 昨日回顾 1.选择客户机操作系统: Microsoft Windows # 一次只能安装一台电脑 Linux(推荐) VMware ESX # 服务器版本VNwa ...
- An internal error occurred during: “Updating Maven Project”. Unsupported IClasspathEntry kind=4解决办法
An internal error occurred during: "Updating Maven Project". Unsupported IClasspathEntry k ...
- go goroutines 使用小结
go +方法 就实现了一个并发,但由于环境不同,需要对并发的个数进行限制,限制同一时刻并发的个数,后面称此为"并发限流". 为什么要并发限流? 虽然GO M+P+G的方式号称可以轻 ...
- 【Linux】【Commands】文件管理工具
文件管理工具:cp, mv, rm cp命令:copy 源文件:目标文件 单源复制:cp [OPTION]... [-T] SOURCE DEST 多源复制:cp [OPTION]... SOURCE ...