最后更新:2021-12-21 17:16:58 手机定位技术交流文章
从理论上讲,由于TCP将建立一种联系,而UDP会将食物丢弃。
因此,只有TCP区分服务器和客户客户,但UDP没有区分服务器和客户。
UDP协议特点:
简而言之,民主联盟的协议就像在短片中将食物扔到街对面。
需要一个人(收到终端天体的数据套件发件人)投掷天线(数据),需要一张天线板(数据套件数据包天体)装入天线。
| 构造器 | 说明 |
|---|---|
| public DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 创建发送端数据包对象, buf: 要传输的字节, 要发送的文本 长度: 要传送的项目的字节数 。 地址: 接收端的 IP 地址对象 端口: 接收港口的端口号 |
| public DatagramPacket(byte[] buf, int length) | 创建接收端的数据包对象buf: 存储收到的物品, 长度: 可以接收物品的最大长度 |
| 方法 | 说明 |
|---|---|
| public int getLength() | 接收到的字节数或要交付的数据长度要返回。 |
| byte[] getData() | 返回数据包中的数据 |
| InetAddress getAddress() | 返回用于发送或接收数据的计算机 IP 地址。 如果没有指定 IP 地址, 此函数返回机器的 IP 地址 。 |
| SocketAddress getSocketAddress () | 返回传输或接收数据报告的远程主机 Socket 地址。 (通常使用IP地址和端口号) |
| int getPort() | 返回传送或接收数据的远程主机端口号,如果没有设置,则返回0。 |
| 构造器 | 说明 |
|---|---|
| public DatagramSocket() | 创建对象发送发送endSocket,系统会随机分配一个端口号 |
| public DatagramSocket(int port) | 创建在接收端,套接字对象此外,在当地东道方上,对所提供的港口号具有约束力。 这不是一件可怕的事情 你不得不利用这个 来制造发件人。 |
| 方法 | 说明 |
|---|---|
| public void send(DatagramPacket dp) | 发送数据包 |
| public void receive(DatagramPacket p) | 接收数据包并将数据装入 p. |
发送端代码示例:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
* TCP客户,UDP发件人 *
public class SenderDemo {
public static void main(String[] args) {
System.out.println(呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼);
try (
/然后,创建发送对象(扔食物者)。
DatagramSocketsocket= new DatagramSocket();
){
/ 开始建立字节阵列封装数据(类别)。
byte[]buffer= "我就是拒绝被扔掉的泡菜" 这是一顿可怕的饭".getBytes(StandardCharsets.UTF_8);
/ 生成一个带有收件人IP地址和端口号的数据集对象(空格)。
DatagramPacketpacket= new DatagramPacket(buffer, buffer.length,
InetAddress.getLocalHost(), 8888);
// 扔菜!!!!
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1024*64由于一个UDP数据集可能高达64kb接收端代码示例:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiverDemo {
public static void main(String[] args) {
System.out.println(do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do);
try (
建立接收对象(人),端口号必须与发送数据包对象的端口号相同。
DatagramSocketsocket= new DatagramSocket(8888);
){
/ 使软件包对象接受来自磁盘的数据。
byte[]bytes= new byte[1024*64];
DatagramPacketpacket= new DatagramPacket(bytes, bytes.length);
// 等待接收数据
/ 一旦启用,服务器端将准备接受数据。
socket.receive(packet);
// 读取数据
Stringstr= new String(bytes, 0, packet.getLength());
System.out.println("收到的数据:" + str);
} catch (Exception e) {
e.printStackTrace();
}
}
}
多发多收:
示例:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
* TCP客户,UDP发件人 *
public class SenderDemo {
public static void main(String[] args) {
System.out.println(呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼);
try (
/然后,创建发送对象(扔食物者)。
DatagramSocketsocket= new DatagramSocket();
){
Scannerin= new Scanner(System.in);
做一个死循环, 读取数据无限期 直到你读取退出。
while (true) {
System.out.println(“请输入发件人姓名:”);
Stringstr= in.nextLine();
/作为出路的裁判
if ("exit".equals(str)){
System.out.println("再见,别打电话了");
break;
}
/ 开始建立字节阵列封装数据(类别)。
byte[]buffer= str.getBytes(StandardCharsets.UTF_8);
/ 生成一个带有收件人IP地址和端口号的数据集对象(空格)。
DatagramPacketpacket= new DatagramPacket(buffer, buffer.length,
InetAddress.getLocalHost(), 8888);
// 扔菜!!!!
socket.send(packet);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1024*64注意:
示例:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiverDemo {
public static void main(String[] args) {
System.out.println(do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do);
try (
建立接收对象(人),端口号必须与发送数据包对象的端口号相同。
DatagramSocketsocket= new DatagramSocket(8888);
){
/ 使软件包对象接受来自磁盘的数据。
byte[]bytes= new byte[1024*64];
DatagramPacketpacket= new DatagramPacket(bytes, bytes.length);
/ 连续数据接收的书写循环
while (true) {
// 等待接收数据
/ 一旦启用,服务器端将准备接受数据。
socket.receive(packet);
// 读取数据
Stringstr= new String(bytes, 0, packet.getLength());
System.out.println("收到了来自" + packet.getAddress() + "相反的数据端口是:"
+ packet.getPort() + ",数据为:" + str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用广播地址:确定额外端口,其他主机(包括主机)分配给同一网络段的主机。
具体步骤:
发送者数据包的目的地是一个广播地址,有明确的港口。 (,88)
只有网络中的其他主机注册相关港口,他们才能获得信息。 (88)
例如,网络部分。第一个IP地址中有三个位于同一区域。
只需更改发件人源代码, 例如 :
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
* TCP客户,UDP发件人 *
public class SenderDemo {
public static void main(String[] args) {
System.out.println(呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼,呼);
try (
/然后,创建发送对象(扔食物者)。
DatagramSocketsocket= new DatagramSocket();
){
Scannerin= new Scanner(System.in);
做一个死循环, 读取数据无限期 直到你读取退出。
while (true) {
System.out.println(“请输入发件人姓名:”);
Stringstr= in.nextLine();
/作为出路的裁判
if ("exit".equals(str)){
System.out.println("再见,别打电话了");
break;
}
/ 开始建立字节阵列封装数据(类别)。
byte[]buffer= str.getBytes(StandardCharsets.UTF_8);
/ 生成一个带有收件人IP地址和端口号的数据集对象(空格)。
记得用收音机 更改IP地址
DatagramPacketpacket= new DatagramPacket(buffer, buffer.length,
InetAddress.getByName("255.255.255.255"), 8888);
// 扔菜!!!!
socket.send(packet);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
虽然保留了地址,但使用该地址是不可接受的。
发件人为集体广播地址(例如:)选择IP地址以及端口号
要玩 IP, 接收者必须约束组 。(a) 接收端有登记发件人提供的港号,以便接收集团电文。
该组必须在接收端播放 IP :
MulticastSocket, 数据组子类, 可在接收端播放 IP 。
因此,在建造接收对象时, 利用他的儿子多播片套。
他的孩子是大师的教官 厨师比他父亲还大
joinGroup.netAddress.com. GetByName (“播放 IP ”) = 连接该组播放 IP 的方法 。
然而,这个函数首次出现在JDK14..
示例:
MulticastSocketsocket= new MulticastSocket(8888);
socket.joinGroup(InetAddress.getByName("224.1.1.1"));
不过时的方法:
joinGroup(SocketAddress mcastaddr, NetworkInterface netIf);
SocketAddress 是第一个参数, 可以通过下列方式获得 :
new InetSocketAddress(InetAddress.getByName("224.1.1.1"), 8888);
/ 参数2是一个网络段,有指定的接收端,可以接收同一节主机发来的信息。
我们经常使用当前主机所在的默认部分(通常是局域网):
NetworkInterface.getByInetAddress(InetAddress.getLocalHost();
因此,不仅必须编辑发报机的源代码,而且必须编辑接收端的源代码。
发送源代码以重写 IP 分布将会是有效的, 只要发件人步骤转换为广播模式, 并且没有演示文稿 。
接收端代码示例:
import java.net在线网速测试 整理编辑,转载请注明出处。