Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向网络发送消息(类似于网络发送)_C#_.net_Sockets - Fatal编程技术网

C# 向网络发送消息(类似于网络发送)

C# 向网络发送消息(类似于网络发送),c#,.net,sockets,C#,.net,Sockets,我不确定这个话题是否被讨论过,但我不知道该怎么办。在c#中,我需要向网络中的其他人发送消息。我做了一些研究,都指向套接字方法。使用此方法,逻辑上它将如下工作: 打开插座 对消息进行编码(例如,编码为ascii) 将编码的字节放入数组中 发送阵列 在另一边,也有一个插座打开,然后它是同样的事情,以相反的顺序 所以我找到了这段代码,有人能帮我理解这段代码吗,这段代码与我想要的代码相似: IPEndPoint ip=新IPEndPoint(IPAddress.Any,9999); //第一 Sock

我不确定这个话题是否被讨论过,但我不知道该怎么办。在c#中,我需要向网络中的其他人发送消息。我做了一些研究,都指向套接字方法。使用此方法,逻辑上它将如下工作:

  • 打开插座
  • 对消息进行编码(例如,编码为ascii)
  • 将编码的字节放入数组中
  • 发送阵列
  • 在另一边,也有一个插座打开,然后它是同样的事情,以相反的顺序
  • 所以我找到了这段代码,有人能帮我理解这段代码吗,这段代码与我想要的代码相似:

    
    IPEndPoint ip=新IPEndPoint(IPAddress.Any,9999);
    //第一
    Socket Socket=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
    套接字绑定(ip);
    听(10);
    Console.WriteLine(“等待客户…”);
    Socket client=Socket.Accept();
    IPEndPoint客户端=(IPEndPoint)client.RemoteEndPoint;
    WriteLine(“在端口{1}与{0}连接”,clientep.Address,clientep.port);
    //第2号和第3号
    string welcome=“welcome”;
    字节[]数据=新字节[1024];
    数据=Encoding.ASCII.GetBytes(欢迎使用);
    //4号
    发送(数据,数据,长度,SocketFlags.None);
    while(true)
    {
    数据=新字节[1024];
    int receivedDataLength=客户机.Receive(数据);
    WriteLine(Encoding.ASCII.GetString(数据,0,receivedDataLength));
    发送(数据、接收数据长度、SocketFlags.None);
    }
    WriteLine(“与{0}断开连接”,clientep.Address);
    client.Close();
    socket.Close();
    

    直到第4点,我才理解代码的作用。但是这个代码:
    
    while(true)
       {
         data = new byte[1024];
         int receivedDataLength = client.Receive(data);
         Console.WriteLine(Encoding.ASCII.GetString(data, 0, receivedDataLength));
         client.Send(data, receivedDataLength, SocketFlags.None);
       }
    
    
    while(true)
    {
    数据=新字节[1024];
    int receivedDataLength=客户机.Receive(数据);
    WriteLine(Encoding.ASCII.GetString(数据,0,receivedDataLength));
    发送(数据、接收数据长度、SocketFlags.None);
    }
    

    我不确定上面的代码是做什么的? 关于第五点,有人能告诉我怎么做吗?这是不是意味着我需要另一个程序作为接收器


    ~Thank you ~

    它看起来像是处于一个循环中,接收数据并将其写入控制台,然后回显给发送方。

    您正在查看的代码是针对一个回显服务器的,该服务器读取另一个客户端发送到套接字的一些数据,将其打印到控制台,然后将其发送回它来自的客户端。这就是第5点中的代码所做的。下面是正在发生的事情:

    数据=新字节[1024]
    这只是分配一个缓冲区来保存我们要读取的数据

    int receivedDataLength=客户机.Receive(数据)
    它从套接字接收数据。Receive是一个阻塞调用,因此它不会返回,直到有数据要读取,或者直到套接字断开连接或出现错误,它才会抛出。ReceiveDDataLength变量非常重要,因为它告诉我们实际读取的字节数。读取的字节数可能很容易小于缓冲区的大小,因为我们不知道其他客户端向套接字发送了多少字节。通过检测读取了多少字节,我们可以确定我们知道缓冲区中实际有多少数据。如果返回0,则表示连接已被另一端关闭

    WriteLine(Encoding.ASCII.GetString(数据,0,receivedDataLength))
    这只是将缓冲区从任意字节值转换为ASCII字符串。请注意,receivedDataLength只允许我们为从套接字读取的字节数写出一个字符串。如果我们只写整个缓冲区的内容,你会在控制台上得到随机垃圾,因为在receivedDataLenth之后出现在缓冲区中的任何数据都是未知的

    发送(数据、接收数据长度、SocketFlags.None); 最后,我们通过将数据写入套接字将数据发送回连接的另一端。我们使用receivedDatalength来表示我们只想发送实际读取的字节,而不是整个缓冲区。如果您在此处发送不同的消息,您可能希望使用正在发送的消息的长度(以字节为单位)。您很可能永远不需要设置任何SocketFlags,所以不用担心这些

    现在,这里的代码用于希望接收连接的服务器。要建立连接,代码非常相似,除了在调用Socket.Bind(ip)之后,您将调用Socket.Connect(remotehost),而不是Listen()和Accept()。然后,将数据写入套接字的代码与上面步骤5中的代码相同

    最后一件事:Socket.Accept()方法起初不是直观的,所以我将解释它的作用。调用Listen()告诉套接字允许传入连接,但是为了实际使用这些连接,您必须接受它们。Accept()阻塞,直到建立新连接,然后返回新的套接字对象。此套接字与您正在侦听的套接字类似,只是此套接字表示一对套接字,这意味着在连接的另一端有另一个类似的套接字将与此套接字通信。您应该使用此新套接字与已连接的客户端进行通信

    从Accept()获得新套接字后,您仍然拥有旧套接字,即您最初在其上调用Accept()的套接字。此套接字仍在侦听新的连接,因此,如果要允许更多计算机连接到此套接字,则需要继续调用Accept(),直到您不再愿意接受连接(例如,如果您不希望存在超过任意数量的连接),或者直到您想关闭应用程序。我之前说过Accept()是一个阻塞调用,因此如果您再次调用它,它将不允许您所在的线程执行任何其他操作,直到新连接进入。这意味着
    
    while(true)
       {
         data = new byte[1024];
         int receivedDataLength = client.Receive(data);
         Console.WriteLine(Encoding.ASCII.GetString(data, 0, receivedDataLength));
         client.Send(data, receivedDataLength, SocketFlags.None);
       }