一些Java数据报套接字问题

| 我最近开始深入研究使用Java进行套接字编程,并且我有一些一般性的问题。 有一个bind()方法,以及一个connect()和disconnect()。没有unbind()。这是因为在断开连接时套接字没有绑定吗?程序退出后,垃圾回收会处理吗?还是这不是一个有效的问题? 另外,在创建DatagramSocket时,如果仅提供端口和地址,会有什么不同?我正在创建一个程序来收集网络外的数据,因为数据会浮动并记录下来。我应该只使用本地地址吗?创建套接字时无法使用该地址导致我无法收集数据包? 我只是想对这些事物的内部机制有更深入的了解。     
已邀请:
        那里大约有15个独立的问题,但我会尽力解决这些问题:   有一个bind()方法,以及一个connect()和disconnect()。没有unbind()。这是因为在断开连接时套接字没有绑定吗?
bind()
connect()
disconnect()
是分开的。绑定用于将套接字绑定到特定端口-有效地连接到“侦听”以进行连接,而“ 1”用于打开与已经在特定端口上侦听的套接字的连接。
unbind()
的等价于
close()
  程序退出后,垃圾回收会处理吗?还是这不是一个有效的问题? 尽管垃圾回收是一种用于内存管理而非套接字/ OS资源管理的技术,但这是一个完全正确的问题。如果您不释放特定端口,它将一直与您的应用程序关联,直到您的应用程序终止,然后操作系统将其回收。这是操作系统级别的功能,而不是JVM功能等。   此外,在创建DatagramSocket时,如果我仅提供端口或提供端口和地址,会有什么不同? 在某些时候,您必须提供您想要连接或绑定的Internet地址和端口或套接字。没有办法解决。   我正在创建一个程序来收集网络外的数据,因为数据会浮动并记录下来。我应该只使用本地地址吗?创建套接字时无法使用该地址导致我无法收集数据包? 我不确定您在这里要问什么,您是在谈论记录网络上的所有数据包,也就是嗅探器吗?这不仅需要简单的数据报编程。实际上,您必须在网络适配器级别注入自己,以截取离线读取的数据包。您正在谈论的内容仅允许您接收发送到您正在侦听的特定端口的数据包。     
        断开连接时,ѭ6仍保持绑定状态,
close()
方法将取消绑定。请注意,对于UDP(数据报)套接字,“ 1”和“ 2”的语义与TCP(或其他面向连接的)套接字相比是不同的。 UDP是无连接协议,绑定的“ 6”可以发送和接收数据包而无需“连接”。 ``1''方法具有纯粹的局部影响,因为它导致套接字只能向指定的主机/端口发送和接收数据包,即充当过滤器。连接到多播或广播地址的“ 6”将只能发送数据包而不能接收它们。 “ 13”用于将套接字连接到本地地址/端口组合,在绑定套接字之前,它不能接收或发送任何数据包。构造函数的默认行为是立即绑定套接字。要创建未绑定的\'DatagramSocket \',请使用
DatagramSocket(SocketAddress)
构造函数,并将
null
作为参数。然后可以将任何自定义配置应用于套接字,然后再将其绑定为“ 0”。 据我所知,超出范围的开放式ѭ6会导致资源泄漏,该对象可能被垃圾回收了,但是我很确定底层UDP套接字将一直由OS分配,直到JVM进程退出。 如果在绑定套接字之前未指定地址,则绑定时它将附加到通配符地址(
INADDR_ANY
),从而使其能够从任何可用的本地地址接收和发送数据包(除非以后将其“连接”到某些地址)主办)。如果未指定端口(或指定为0),则套接字将绑定到OS选择的某个可用端口(临时端口)。 编辑:一个例子
// bind to INADDR_ANY, allowing packets on all IP addresses of host:
DatagramSocket dsock = new DatagramSocket(55555);
DatagramPacket packet = new DatagramPacket(new byte[8192]);

//next packet can be from anywhere including local host (127.0.0.0/8)
dsock.receive(packet);

// restrict communication to a single host/port:
dsock.connect(new InetSocketAddress(\"somehost.net\", 99));

// next packet can only be from somehost.net on port 99:
dsock.receive(packet);
    

要回复问题请先登录注册