Java 中的 Java.net.DatagramSocket 类
原文:https://www . geesforgeks . org/Java-net-datagramsocket-class-Java/
数据报套接字是一种网络套接字,它为发送和接收数据包提供无连接点。从数据报套接字发送的每个数据包都是单独路由和传递的。它还可以用于发送和接收广播消息。数据报套接字是 java 通过 UDP 而不是 TCP 提供网络通信的机制。
施工人员:
1。DatagramSocket() : 创建一个 DatagramSocket,并将其绑定到本地机器上的任何可用端口。如果使用这个构造函数,操作系统会将任何端口分配给这个套接字。
Syntax :public DatagramSocket()
throws SocketException
Throws :
SocketException : if the socket could not be opened
2。DatagramSocket(DatagramSocketImpl impl):用给定的 DatagramSocket 创建一个未绑定的数据报套接字。
Syntax :protected DatagramSocket(DatagramSocketImpl impl)
Parameters :
impl : instance of datagramScketImpl
3。数据报套接字(int 端口):创建数据报套接字并将其绑定到指定端口。套接字将绑定到内核选择的通配符地址。
Syntax : public DatagramSocket(int port)
throws SocketException
Parameters :
port : port number to bind this socket to
4。DatagramSocket(int port,InetAddress ladder):构造一个数据报套接字,并将其绑定到指定的端口和 InetAddress。
Syntax : public DatagramSocket(int port,
InetAddress laddr)
throws SocketException
Parameters :
port : local port to bind
laddr : local address to bind
Throws :
SocketException : If the socket could not be opened
5。DatagramSocket(SocketAddress bindaddr):构造一个新的套接字对象,并将其绑定到指定的套接字地址(IP 地址+端口号)。
Syntax :public DatagramSocket(SocketAddress bindaddr)
throws SocketException
Parameters :
bindaddr : socket address to bind to
Throws :
SocketException : If socket could not be opened
方法:
1。bind() : 将此套接字绑定到指定的地址和端口号。
Syntax : public void bind(SocketAddress addr)
Parameters :
addr : socket address to bind to
2。connect() : 连接到指定的地址和端口。连接到远程主机后,该套接字只能发送或接收来自该远程主机的数据包。如果无法与指定的远程主机建立连接,对 send()或 receive()的调用将引发可预测异常。
Syntax :public void connect(InetAddress address,
int port)
Parameters :
address : address of remote host
port : port number of remote host
另一个重载方法将套接字地址作为参数。
Syntax :public void connect(SocketAddress address)
Parameters :
address : socket address of remote host
3。断开():断开插座。如果插座没有连接,那么这个方法没有效果。
Syntax :public void disconnect()
4。isBound() : 返回一个布尔值,指示此套接字是否绑定。
Syntax :public boolean isBound()
isConnected() : 返回一个布尔值,指示此套接字是否已连接。
Syntax :public boolean isConnected()
5。isConnected() : 返回表示套接字连接状态的布尔值。请注意,即使在关闭套接字之后,如果在关闭套接字之前连接了此套接字,此方法也将继续返回 true。
Syntax :public boolean isConnected()
6。getnetaddress():返回这个套接字连接到的地址。
Syntax : public InetAddress getInetAddress()
7。getPort() : 返回该套接字所连接的机器上的端口。
Syntax : public int getPort()
8。getRemoteSocketAddress() : 返回该套接字所连接的套接字地址(IP 地址+端口号)。
Syntax : public SocketAddress getRemoteSocketAddress()
9。getLocalSocketAddress() : 返回该套接字绑定到的机器的地址,即本地机器套接字地址。
public SocketAddress getLocalSocketAddress()
10。send() : 从此套接字发送数据报数据包。应该注意的是,关于要发送的数据的信息、它被发送到的地址等都是由分组本身处理的。
Syntax : public void send(DatagramPacket p)
Parameters :
p : packet to send
11 时。receive() : 用于接收来自发送方的数据包。当一个包被成功接收时,包的缓冲区被接收的消息填满。数据包还包含有价值的信息,如发件人地址和端口号。该方法一直等到收到数据包。
Syntax : public void receive(DatagramPacket p)
Parameters :
p : datagram packet into which incoming data is filled
12 时。getLocalAddress() : 返回此套接字绑定到的本地地址。
Syntax : public InetAddress getLocalAddress()
13。getLocalPort() : 返回套接字绑定到的本地机器上的端口。
Syntax : public int getLocalPort()
14。setSOTimeout() : 用于设置接收数据报包的等待时间。由于对 receive()方法的调用会无限期地阻止程序的执行,直到收到数据包,因此该方法可用于限制该时间。一旦指定的时间过期,就会引发 Java . net . SockettimeOutException。
Syntax : public void setSoTimeout(int timeout)
Parameters :
timeout : time to wait
15。getSoTimeout() : 返回超时参数(如果指定),或者返回 0(表示无限时间)。
Syntax : public int getSoTimeout()
16。setSendBufferSize() : 用于设置可从此套接字发送的数据包的最大大小限制。它设置了 SO_SNDBUF 选项,网络实现使用该选项来设置底层网络缓冲区的大小。当发送速率较高时,增加大小可以允许在发送之前对数据包进行排队。
Syntax : public void setSendBufferSize(int size)
Parameters :
size : size of send buffer to set
Java 实现:
Java 语言(一种计算机语言,尤用于创建网站)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
public class datasocket
{
public static void main(String[] args) throws IOException
{
// Constructor to create a datagram socket
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("localhost");
int port = 5252;
byte buf[] = { 12, 13 };
byte buf1[] = new byte[2];
DatagramPacket dp = new DatagramPacket(buf, 2, address, port);
DatagramPacket dptorec = new DatagramPacket(buf1, 2);
// connect() method
socket.connect(address, port);
// isBound() method
System.out.println("IsBound : " + socket.isBound());
// isConnected() method
System.out.println("isConnected : " + socket.isConnected());
// getInetAddress() method
System.out.println("InetAddress : " + socket.getInetAddress());
// getPort() method
System.out.println("Port : " + socket.getPort());
// getRemoteSocketAddress() method
System.out.println("Remote socket address : " +
socket.getRemoteSocketAddress());
// getLocalSocketAddress() method
System.out.println("Local socket address : " +
socket.getLocalSocketAddress());
// send() method
socket.send(dp);
System.out.println("...packet sent successfully....");
// receive() method
socket.receive(dptorec);
System.out.println("Received packet data : " +
Arrays.toString(dptorec.getData()));
// getLocalPort() method
System.out.println("Local Port : " + socket.getLocalPort());
// getLocalAddress() method
System.out.println("Local Address : " + socket.getLocalAddress());
// setSOTimeout() method
socket.setSoTimeout(50);
// getSOTimeout() method
System.out.println("SO Timeout : " + socket.getSoTimeout());
}
}
为了测试上述程序,需要一个小的服务器程序来接收发送的数据包并实现 receive()方法。其实现如下。
Java 语言(一种计算机语言,尤用于创建网站)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class smallserver {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(5252);
byte buf[] = new byte[2];
byte send[] = { 13, 18 };
DatagramPacket dp = new DatagramPacket(buf, 2);
ds.receive(dp);
DatagramPacket senddp = new DatagramPacket(send, 2,
dp.getAddress(), dp.getPort());
ds.send(senddp);
}
}
输出:在客户端
IsBound : true
isConnected : true
InetAddress : localhost/127.0.0.1
Port : 5252
Remote socket address : localhost/127.0.0.1:5252
Local socket address : /127.0.0.1:59498
packet sent successfully
Received packet data : [13, 18]
Local Port : 59498
Local Address : /127.0.0.1
SO Timeout : 50
17。getSendBufferSize() : 返回这个套接字的 SO_SNDBUF 选项的值。
Syntax : public int getSendBufferSize()
18。setReceiveBufferSize() : 用于设置在此套接字上接收的数据包的最大大小限制。它设置了 SO_RCVBUF 选项,网络实现使用该选项来设置底层网络缓冲区的大小。当数据包发送速度快于消耗速度时,增加大小可以允许在接收端对数据包进行排队。
Syntax : public void setReceiveBufferSize(int size)
Parameters :
size : size of receive buffer to set
19。getReceiveBufferSize() : 返回这个套接字的 SO_RCVBUF 选项的值。
Syntax : public int getReceiveBufferSize()
20。setReuseAddress() : 有时可能需要将多个套接字绑定到同一个地址。启用此选项可使其他套接字绑定到与此相同的地址。必须在调用 bind()之前设置它。它设置 SO_REUSEADDR 套接字选项的值。
Syntax : public void setReuseAddress(boolean on)
Parameters :
on : true for enable, false otherwise
21。getReuseAddress() : 返回指示 SO_REUSEADDR 套接字选项设置的布尔值。
Syntax : public boolean getReuseAddress()
22。setBroadcast() : 设置 SO_BROADCAST 套接字选项的值。
Syntax : public void setBroadcast(boolean on)
Parameters :
on : true to allow broadcast, false otherwise
23。getBroadcast() : 如果启用了广播,则返回 true,否则返回 false。
Syntax : public boolean getBroadcast()
24。setTrafficClass() : 用于设置从这个 DatagramSocket 发送的数据报的 IP 数据报头中的服务类型八位字节。关于流量的更多细节,请参考维基百科
Syntax : public void setTrafficClass(int tc)
Parameters :
tc : int value of bitset, 0<=tc<=255
25。getTrafficClass() : 从这个套接字发送的数据包的 IP 头中获取流量类或服务类型。
Syntax : public int getTrafficClass()
26。close() : 关闭这个数据报套接字。任何挂起的接收调用都会引发 SocketException。
Syntax : public void close()
27。isClosed() : 返回指示套接字是否关闭的布尔值。
Syntax : public boolean isClosed()
28。getChannel() : 返回与此套接字关联的数据通道(如果有)。关于数据报通道的更多细节可以在官方 Java 文档中找到。
Syntax : public DatagramChannel getChannel()
29。setDatagramSocketImplFactory():为应用程序设置数据报套接字实现工厂。
Syntax :public static void setDatagramSocketImplFactory(
DatagramSocketImplFactory fac)
Parameters :
fac - the desired factory.
Throws :
IOException - if an I/O error occurs when setting the datagram socket factory.
SocketException - if the factory is already defined.
Java 实现:
Java 语言(一种计算机语言,尤用于创建网站)
import java.io.IOException;
import java.net.DatagramSocket;
public class datasock2 {
public static void main(String[] args) throws IOException {
// Constructor
DatagramSocket socket = new DatagramSocket(1235);
// setSendBufferSize() method
socket.setSendBufferSize(20);
// getSendBufferSize() method
System.out.println("Send buffer size : " +
socket.getSendBufferSize());
// setReceiveBufferSize() method
socket.setReceiveBufferSize(20);
// getReceiveBufferSize() method
System.out.println("Receive buffer size : " +
socket.getReceiveBufferSize());
// setReuseAddress() method
socket.setReuseAddress(true);
// getReuseAddress() method
System.out.println("SetReuse address : " +
socket.getReuseAddress());
// setBroadcast() method
socket.setBroadcast(false);
// getBroadcast() method
System.out.println("setBroadcast : " +
socket.getBroadcast());
// setTrafficClass() method
socket.setTrafficClass(45);
// getTrafficClass() method
System.out.println("Traffic class : " +
socket.getTrafficClass());
// getChannel() method
System.out.println("Channel : " +
((socket.getChannel()!=null)?socket.getChannel():"null"));
// setSocketImplFactory() method
socket.setDatagramSocketImplFactory(null);
// close() method
socket.close();
// isClosed() method
System.out.println("Is Closed : " + socket.isClosed());
}
}
输出:
Send buffer size : 20
Receive buffer size : 20
SetReuse address : true
setBroadcast : false
Traffic class : 44
Channel : null
Is Closed : true
参考资料: 官方 Java 文档
本文由里沙布·马赫塞供稿。如果你喜欢 GeeksforGeeks 并想投稿,你也可以使用write.geeksforgeeks.org写一篇文章或者把你的文章邮寄到 review-team@geeksforgeeks.org。看到你的文章出现在极客博客主页上,帮助其他极客。 如果你发现任何不正确的地方,或者你想分享更多关于上面讨论的话题的信息,请写评论。
版权属于:月萌API www.moonapi.com,转载请注明出处