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 ...
随机推荐
- win10 如何查看本地连接的WIFI密码
1 在状态栏右侧找到WIFI图标,右键WIFI图标,打开"网路和 Internet"设置 2 切换到 "状态"或"WLAN",找到" ...
- clickhouse使用的一点总结
clickhouse据说是用在大数据量的olap场景列式存储数据库,也有幸能够用到它在实际场景中落地.本篇就来说说简单的使用心得吧. 1. 整体说明 架构啥的,就不多说了,列式存储.大数据量.高性能. ...
- admixture 群体结构分析
tructure是与PCA.进化树相似的方法,就是利用分子标记的基因型信息对一组样本进行分类,分子标记可以是SNP.indel.SSR.相比于PCA,进化树,群体结构分析可明确各个群之间是否存在交流及 ...
- Bedtools genomecov 计算覆盖度
简单说明: 从2.28.0版开始,bedtools使用htslib库支持CRAM格式 除了BAM文件,bedtools默认所有的输入文件都以TAB键分割 除非使用-sorted选项,bedtools默 ...
- 关于vim复制剪贴粘贴命令的总结-转
最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删除): 剪切其实也就顺带删除了所选择的 ...
- 宏GENERATED_BODY做了什么?
Version:4.26.2 UE4 C++工程名:MyProject \ 一般语境下,我们说c++源码的编译大体分为:预处理.编译.链接; cppreference-translation_phas ...
- C# js获取buttonid
var id= document.getElementById('<%=控件的ID.ClientID %>');
- 一劳永逸,使用 PicGo + GitHub 搭建个人图床工具
原文链接: 一劳永逸,使用 PicGo + GitHub 搭建个人图床工具 经常写博客的同学都知道,有一个稳定又好用的图床是多么重要.我之前用过七牛云 + Mpic 和微博图床,但总感觉配置起来比较麻 ...
- 日常Java 2021/10/17
今天开始Javaweb编译环境调试,从tomcat容器开始,然后mysql的下载,连接工具datagrip,navicat for mysql,然后就是编写自己的sql,安装jdbc,eclipse连 ...
- day06 HTTP协议
day06 HTTP协议 HTTP协议 什么是http? HTTP 全称:Hyper Text Transfer Protocol 中文名:超文本传输协议 是一种按照URL指示,将超文本文档从一台主机 ...