精华内容
下载资源
问答
  • 数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址...

    播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。

    多播组通过 D 类 IP 地址和标准 UDP 端口号指定。

    D 类 IP 地址在 224。0。0。0 和 239。255。255。255 的范围内(包括两者)。地址 224。0。0。0 被保留,不应使用。

    可以通过首先使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组:

    // join a Multicast group and send the group salutations

    。。

    String msg = "Hello";

    InetAddress group = InetAddress。getByName("228。5。6。7");

    MulticastSocket s = new MulticastSocket(6789);

    s。

    joinGroup(group);

    DatagramPacket hi = new DatagramPacket(msg。getBytes(), msg。length(),

    group, 6789);

    s。send(hi);

    // get their responses!

    byte[] buf = new byte[1000];

    DatagramPacket recv = new DatagramPacket(buf, buf。

    length);

    s。receive(recv);

    。。。

    // OK, I'm done talking - leave the group。。。

    s。leaveGroup(group);

    将消息发送到多播组时,该主机和端口的所有预定接收者都将接收到消息(在数据包的生存时间范围内,请参阅下文)。

    套接字不必成为多播组的成员即可向其发送消息。

    当套接字预定多播组/端口时,它将接收由该组/端口的其他主机发送的数据报,像该组和端口的所有其他成员一样。套接字通过 leaveGroup(InetAddress addr) 方法放弃组中的成员资格。

    多个 MulticastSocket 可以同时预定多播组和端口,并且都会接收到组数据报。

    同时,不允许 applet 使用多播套接字。

    编辑特别推荐:

    40个轻量级JavaScript库介绍

    Java网络编程:实现HTTP模拟器

    Flyweight(享元)模式。

    全部

    展开全文
  • Java多播套接字的方法

    2021-03-05 15:12:58
    Java多播套接字的方法播数据报套接字类用于发送和接收 IP 播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他播主机的“组”的附加功能。以下是小编为大家搜索整理的Java多播套接...

    Java多播套接字的方法

    播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。以下是小编为大家搜索整理的Java多播套接字的方法,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!

    多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在 224.0.0.0 和 239.255.255.255 的范围内(包括两者)。地址 224.0.0.0 被保留,不应使用。

    方法

    可以通过首先使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组:

    // join a Multicast group and send the group salutations

    ...

    String msg = "Hello";

    InetAddress group = InetAddress.getByName("228.5.6.7");

    MulticastSocket s = new MulticastSocket(6789);

    s.joinGroup(group);

    DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),

    group, 6789);

    s.send(hi);

    // get their responses!

    byte[] buf = new byte[1000];

    DatagramPacket recv = new DatagramPacket(buf, buf.length);

    s.receive(recv);

    ...

    // OK, I'm done talking - leave the group...

    s.leaveGroup(group);

    将消息发送到多播组时,该主机和端口的所有预定接收者都将接收到消息(在数据包的生存时间范围内,请参阅下文)。套接字不必成为多播组的'成员即可向其发送消息。

    当套接字预定多播组/端口时,它将接收由该组/端口的其他主机发送的数据报,像该组和端口的所有其他成员一样。套接字通过 leaveGroup(InetAddress addr) 方法放弃组中的成员资格。多个 MulticastSocket 可以同时预定多播组和端口,并且都会接收到组数据报。

    同时,不允许 applet 使用多播套接字

    【Java多播套接字的方法】相关文章:

    展开全文
  • 为通信的端点,每个套接字由一个 IP 地址和一个端口号组成。通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个。通常,套接字采用客户机-服务器架构。服务器通过监听指定端口,来等待客户请求。服务器...

    为通信的端点,每个套接字由一个 IP 地址和一个端口号组成。通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个。

    通常,套接字采用客户机-服务器架构。服务器通过监听指定端口,来等待客户请求。服务器在收到请求后,接受来自客户套接字的连接,从而完成连接。

    实现特定服务(如 telnet、ftp 和 http)的服务器监听众所周知的端口(telnet 服务器监听端口 23,ftp 服务器监听端口 21,Web 或 http 服务器监听端口 80)。所有低于 1024 的端口都是众所周知的,我们可以用它们来实现标准服务。

    当客户进程发出连接请求时,它的主机为它分配一个端口。这个端口为大于1024的某个数字。例如,当 IP 地址为 146.86.5.20 的主机 X 的客户希望与 IP 地址为 161.25.19.8 的 Web 服务器(监听端口 80)建立连接时,它所分配的端口可为1625。该连接由一对套接字组成:主机 X 上的(146.86.5.20:1625), Web服务器上的(161.25.19.8:80)。这种情况如图 1 所示。根据目的端口号码,主机之间传输的分组可以发送到适当的进程。

    33ce69e4e44c24caf46a27f0d3a7e5e0.gif

    图 1 采用套接字的通信

    所有连接必须是唯一的。因此,当主机 X 的另一个进程希望与同样的 Web 服务器建立另一个连接时,它会分配到另一个大于 1024 但不等于 1625 的端口号。这确保了所有连接都由唯一的一对套接字组成。

    为了演示套接字,本节我们会用 Java 语言,因为 Java 提供一个更加简单的套接字接口而且提供丰富的网络工具库。

    Java 提供三种不同类型的套接字:

    面向连接的 TCP 套接字是用 Socket 类实现的;

    无连接的 UDP 套接字使用 DatagramSocket 类。

    MulticastSocket 类为 DatagramSocket 类的子类,多播套接字允许数据发送到多个接收者。

    下面的例子,即日期服务器,采用面向连接的 TCP 套接字。这个操作允许客户机向服务器请求当前的日期和时间。服务器监听端口 6013,当然端口号可以是任何大于 1024 的数字。在接收到连接时,服务器将日期和时间返回给客户机。

    import java.net.*;

    import java.io.*;

    public class DateServer

    {

    public static void main(String[] args) {

    try {

    ServerSocket sock = new ServerSocket(6013);

    /* now listen for connections */

    while (true) {

    Socket client = sock.accept();

    PrintWriter pout = new PrintWriter(client.getOutputStream(),true);

    /* write the Date to the socket */

    pout. println (new java.util.Date().toString());

    /* close the socket and resume */

    /* listening for connections */

    client.close();

    }

    }

    catch (IOException ioe) {

    System.err.println(ioe);

    }

    }

    }

    此程序为日期服务器程序。服务器创建一个 ServerSocket,监听端口号 6013,然后调用 accept() 方法,开始监听端口。服务器阻塞在方法 accept() 上,等待客户请求连接。当接收到连接请求时,accept() 返回一个套接字,以供服务器与客户进程进行通信。

    服务器如何与套接字通信的有关细节如下。服务器首先建立 PrintWriter 对象,以便与客户进行通信。PrintWriter 对象允许服务器通过输出方法 print() 和 printin() 写到套接字。服务器通过方法 println() 发送日期到客户机。服务器在将日期写到套接字后,就关闭与客户相连的套接字,并且重新监听更多请求。

    为与服务器通信,客户创建一个套接字,并且连到服务器监听的端口。以下的 Java 程序为客户机的实现。

    import java.net.*;

    import java.io.*;

    public class DateClient {

    public static void main(String[] args) {

    try {

    /* make connection to server socket */

    Socket sock = new Socket("127.0.0.1",6013);

    InputStream in = sock.getInputStreamO ;

    BufferedReader bin = new BufferedReader(new InputStreamReader(in));

    /* read the date from the socket */

    String line;

    while ( (line = bin.readLine()) != null)

    System.out.printIn(line);

    /* close the socket connection*/

    sock.close() ;

    }

    catch (IOException ioe) {

    System.err.printIn(ioe);

    }

    }

    }

    客户创建一个 Socket,并与 IP 地址为 127.0.0.1 的服务器端口 6013 建立连接。连接建立后,客户就通过普通的流 I/O 语句来从套接字进行读取。在收到服务器的日期后,客户就关闭端口,并退出。

    IP 地址 127.0.0.1 为特殊 IP 地址,称为回送。当计算机采用地址 127.0.0.1 时,它引用自己。这一机制允许同一主机的客户机和服务器可以通过 TCP/IP 协议进行通信。IP 地址 127.0.0.1 可以换成运行日期服务器的另一主机的 IP 地址。除 IP 地址外,也可采用如 www.westminstercollege.edu 这样实际的主机名。

    使用套接字的通信,虽然常用和高效,但是属于分布式进程之间的一种低级形式的通信。原因是套接字只允许在通信线程之间交换无结构的字节流。客户机或服务器程序需要自己加上数据结构。

    展开全文
  • 在我的“单元测试”中,我有一个测试套接字,它连接到一个给定的多播组并绑定到127.0.0.1和一个发送器套接字,它也加入了同一个多播组并绑定到127.0.0.1,当然这两个进程都在同一个进程中 .为了确保消息被发送,我有...

    我正在为处理UDP多播通信的类编写一些测试 . 我设计了测试以使用环回接口(127.0.0.1)进行测试,因为我不希望它们干扰网络上的其他程序/设备 .

    在我的“单元测试”中,我有一个测试套接字,它连接到一个给定的多播组并绑定到127.0.0.1和一个发送器套接字,它也加入了同一个多播组并绑定到127.0.0.1,当然这两个进程都在同一个进程中 .

    为了确保消息被发送,我有另一个测试程序(所以另一个进程),它也加入多播组并输出发送给它的所有内容 .

    问题是我测试的套接字永远不会收到发送方发送的内容但是测试程序(因此另一个进程)接收它 .

    组合多个套接字/多播/本地主机是否有一些限制?

    新的消息:

    我的错误是认为localhost上的UDP可能是可靠的 . 下面的测试程序显示我的侦听套接字从未接收过第一个UDP数据包(至少在我的计算机上)(但另一个进程仍然接收它) .

    在我的单元测试中,我发送一个数据包并期望具体答案:我负担不起两次发送消息并且只接收一次答案 .

    如果我在发送第一个数据包之前等待第一个接收超时,它似乎可靠地工作 .

    有谁知道为什么第一个UDP数据包永远不会到来?

    这是我在试验中使用的代码:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Net;

    using System.Net.Sockets;

    using System.Threading;

    using NUnit.Framework;

    namespace MulticastTest

    {

    [TestFixture]

    public class Program

    {

    static void Main(string[] args)

    {

    new Program().Run();

    Console.WriteLine("Press any key to exit...");

    Console.ReadKey();

    }

    [Test]

    public void Run()

    {

    _waitFirstReadTiemout = new AutoResetEvent(false);

    IPAddress lMulticastAddress = new IPAddress(0xFAFFFFEF);

    IPEndPoint lRemoteEndPoint = new IPEndPoint(lMulticastAddress, 1900);

    // Create sender socket

    Socket lSendSocket = new Socket(AddressFamily.InterNetwork,

    SocketType.Dgram,

    ProtocolType.Udp);

    // Allow to share the port 1900 with other applications

    lSendSocket.SetSocketOption(SocketOptionLevel.Socket,

    SocketOptionName.ReuseAddress,

    true);

    // Set TTL for multicast packets: socket needs to be bounded to do this

    lSendSocket.SetSocketOption(SocketOptionLevel.IP,

    SocketOptionName.MulticastTimeToLive,

    2);

    // Bind the socket to the local end point: this MUST be done before joining the multicast group

    lSendSocket.Bind(new IPEndPoint(IPAddress.Loopback, 55236));

    // Join the multicast group

    lSendSocket.SetSocketOption(SocketOptionLevel.IP,

    SocketOptionName.MulticastLoopback,

    true);

    lSendSocket.SetSocketOption(SocketOptionLevel.IP,

    SocketOptionName.AddMembership,

    new MulticastOption(lMulticastAddress));

    // Create receiver and start its thread

    Thread lReceiveThread = new Thread(ReceiveThread);

    lReceiveThread.Start();

    int i = 0;

    while (!fStop)

    {

    if (i == 0)

    _waitFirstReadTiemout.WaitOne(10000);

    byte[] lToSend = Encoding.ASCII.GetBytes(DateTime.Now.ToString("yyyyMMdd HHmmss"));

    lSendSocket.SendTo(lToSend, lRemoteEndPoint);

    Console.WriteLine("Sent #" + (i + 1) + ": " + DateTime.Now.ToString("yyyyMMdd HHmmss"));

    Thread.Sleep(1000);

    try

    {

    if (Console.KeyAvailable || i >= 10)

    fStop = true;

    }

    catch (InvalidOperationException)

    {

    fStop = i >= 10;

    }

    finally

    {

    ++i;

    }

    }

    }

    private AutoResetEvent _waitFirstReadTiemout;

    private bool fStop;

    private void ReceiveThread()

    {

    Socket lSocket = new Socket(AddressFamily.InterNetwork,

    SocketType.Dgram,

    ProtocolType.Udp);

    // Allow to share the port 1900 with other applications

    lSocket.SetSocketOption(SocketOptionLevel.Socket,

    SocketOptionName.ReuseAddress,

    true);

    // TTL not required here: we will only LISTEN on the multicast socket

    // Bind the socket to the local end point: this MUST be done before joining the multicast group

    lSocket.Bind(new IPEndPoint(IPAddress.Loopback, 1900));

    // Join the multicast group

    // If the local IP is a loopback one, enable multicast loopback

    lSocket.SetSocketOption(SocketOptionLevel.IP,

    SocketOptionName.MulticastLoopback,

    true);

    lSocket.SetSocketOption(SocketOptionLevel.IP,

    SocketOptionName.AddMembership,

    new MulticastOption(

    new IPAddress(0xFAFFFFEF)));

    lSocket.ReceiveTimeout = 1000;

    byte[] lBuffer = new byte[65000];

    int i = 0;

    while (!fStop)

    {

    try

    {

    int lReceived = lSocket.Receive(lBuffer);

    ++i;

    Console.WriteLine("Received #" + i + ": " + Encoding.ASCII.GetString(lBuffer, 0, lReceived));

    }

    catch (SocketException se)

    {

    _waitFirstReadTiemout.Set();

    Console.WriteLine(se.ToString());

    }

    }

    }

    }

    }

    展开全文
  • 函数 int getsockopt(int sockfd, int level, int optname, void *optval, ...以上几种消息发送方式均需注册套接字选项,不能直接向诸如"255.255.255.255"的广播地址发送消息。 以组为例,D类IP地址用于多点广播
  • 多播數據報套接字類用於發送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機的「組」的附加功能。1、IP多播地址和多播組IP多播通信必須依賴於IP多播地址。在...
  • 参数: - sockfd: 通信的udp套接字 - level: 加入到多播组 - IPPROTO_IP - optname: 设置组属性 - IP_ADD_MEMBERSHIP - optval: 设置组属性, 类型: ip_mreqn{} - 一个是组地址 - 一个是...
  • 原始套接字

    2021-05-17 18:11:28
    标准套接字不能对IP首部或TCP、UDP首部进行操作,如果开发底层的应用,比如发送一个自定义的IP包、UDP包、TCP包、ICMP包,伪装本机IP地址,捕获所有经过本机的数据包,就要用到原始套接字。一、面向链路层的原始套接...
  • 我在java中使用多播套接字时遇到了接收方法的问题 . 有些主机他们希望使用多播套接字进行群聊 . 每个主机上都启动了两个线程(读写),并且它们都使用连接到组IP的多播套接字 . 问题是,当receive方法执行时,它不会...
  • 我有一个多播套接字,我必须在其中指定网络接口才能接收数据。但是,当我使用网络接口加入组时,Java不会接收到它。我有一个简单的python程序,它在同一个服务器上执行完全相同的操作,并且运行良好。在在为Java中的...
  • UDP套接字编程

    2021-07-11 16:22:47
    参考:《UNIX 网络编程 · 卷1 : 套接字联网API》 UDP 与 TCP 之间传输存在差异,也导致编写应用程序存在很差异。UDP 客户端和服务器不建立连接,而是直接使用 sendto 函数给服务器发送数据报。但必须指定目的地的...
  • // 多播套接字 private static InetAddress group; private static boolean isFirst; // 是否信息记录里的第一条信息 public Multicast() { setTitle("播群聊室"); setSize(450, 400); int width = (int) screen...
  • 目录 1.UDP通信 2.广播 3.组多播) 4.本地套接字通信 1.UDP通信 2.广播 3.组多播) 4.本地套接字通信
  • C++套接字编程

    2021-10-23 10:21:37
    C++套接字编程 Socket简介 80年代初,人们在UNIX操作系统下实现TCP/IP协议。 研究人员为TCP/IP网络通信开发了一个API(应用程序接口)。 这个API称为Socket接口(套接字)。 SOCKET接口是TCP/IP网络最为通用的API,...
  • 网络套接字编程

    2021-04-13 21:30:35
    网络套接字编程 注:本文为学习《C语言从入门到精通》时,对部分章节的总结 1、计算机网络基础 1.1、IP地址 IP地址由IP协议规定的32位的二进制数表示,最新的IPv6协议由128位表示。 32位的IP地址主要分为前缀和...
  • TCP/UDP 套接字总结

    2021-06-15 17:07:34
    套接字可以连接为计算机为了通信准备的一种标准接口,这个接口函数与操作系统联系紧密,是实现计算机之间通信的重要基础。 TCP 编程 根据TCP的协议我们知道TCP通信的服务端与客户端有比较大的差别。服务端需要先启动...
  • 套接字函数详解

    2021-08-09 17:46:10
    文章目录套接字函数详解创建套接字bind: 设定电话号码IPv4 TCP 套接字的例子listen:接上电话线,一切准备就绪accept: 电话铃响起了……connect: 拨打电话著名的 TCP 三次握手: 这一次不用背记为什么tcp建立连接需要...
  • Java套接字编程(下)

    2021-03-06 01:19:19
    自寻址套接字(Datagram Sockets)因为使用流套接字的每个连接均要花费一定...不同的是可以通过自寻址套接字发送IP信息包,自寻址信息包含在自寻址包中,此外自寻址包又包含在IP包内,这就将寻址信息长度限制在6000...
  • (由于涉及很痛苦的原因,我们系统的一些用户想要将同一台机器上的两个NIC连接到同一个子网.我们告诉他们不要,但是他们坚持.我不需要提醒我有难看.)似乎无法检查数据报并直接找出其目标地址或其所在的接口.基于...
  • _ REUSEADDR套接字选项允许套接字强制绑定到另一个套接字使用的端口。第二个套接字调用setsockopt,并将optname参数设置为,并将optval参数设置为布尔值TRUE,然后 _在与原始套接字相同的端口上调用绑定。第二个套接...
  • 传输桥接三、处理错误和ETERM四、处理信号中断五、检测内存泄漏六、用zmq线程七、线程间信令(PAIR套接字)八、节点协调九、零拷贝十、发布-订阅消息封包十一、高水位标记十二、信息丢失的解决方案 一、套接字...
  • 我给你个可用的测试例//Client//设置错误处理error_reporting(E_ALL);//设置处理时间set_time_limit(0);$ip="";//IP地址$port=1000;//端口号$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);...
  • 概念发送方只有一个接收方则称单如果同时发给局域网中的所有主机,成为广播只有用户数据包(使用UDP协议)套接字才能广播广播地址1.以192.168.1.0(255.255.255.0)网段为例,最大的主机地址192.168.1.255代表该网段的...
  • 套接字选项

    千次阅读 2021-11-10 23:24:18
    1.获取及设置套接字选项的方法 1.getsockopt和setsockopt函数; 2.fcntl函数; 3.ioctl函数. 2.getsockopt和setsockopt函数
  • Java套接字 - 如何模拟个客户端(Java sockets - How to simulate multiple clients)我有一个用Java编写的套接字程序。服务器使用DatagramSocket创建具有特定端口号的套接字。 我有一个客户端java程序,它连接到此...
  • 文章目录一、计算机网络基础IP地址OSI七层参考模型地址解析ARP协议解析地址的过程域名系统TCP/IP协议TCP协议IP协议ICMP协议UDP协议端口套接字的引入网络字节顺序二、套接字概述TCP的套接字的socket编程UDP的套接字的...
  • 我正在处理客户端必须将文件上载到服务器的二...使用TCP通过套接字进行二进制文件传输让我们来看看代码:// Client-side code to send file namevoid sendFileName(int sd, /*Socket Descriptor*/char *fname) /*Arr...
  • 1.在网络通讯中,有很函数是阻塞函数,使进程阻塞。例如 accpet recv send recvfrom sendto等等。 2.为了避免进程在阻塞函数处无限制阻塞,可以设定超时时间,当超时后从阻塞函数立即返回,继续运行。 超时检测...
  • java.net的套接字

    2021-03-10 02:04:47
    展开全部套接字是在网络上建62616964757a686964616fe58685e5aeb931333361303130立机器之间的通信链接的方法。java.net 包提供 4 种套接字:Socket 是 TCP客户端API,通常用于将 (java.net.Socket.connect...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,556
精华内容 23,822
关键字:

多播套接字是什么