Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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#_Sockets - Fatal编程技术网

C#套接字并向所有客户端发送数据

C#套接字并向所有客户端发送数据,c#,sockets,C#,Sockets,好的,我一般不太擅长编程,但我想尝试一下使用套接字。首先,我观看了一段Youtube视频,然后一步一步地观看,我让成品100%地运行到指南中,但我希望对其进行修改,以便服务器能够向所有连接的客户端发送消息 以下是youtube视频: 这是服务器类的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using

好的,我一般不太擅长编程,但我想尝试一下使用套接字。首先,我观看了一段Youtube视频,然后一步一步地观看,我让成品100%地运行到指南中,但我希望对其进行修改,以便服务器能够向所有连接的客户端发送消息

以下是youtube视频:

这是服务器类的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;

namespace Server
{
    class Program
    {
        private static byte[] buffer = new byte[1024];
        public static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        public static List<Socket> clientSockets = new List<Socket>();
        static void Main(string[] args)
        {
            Console.Title = "Server, " + clientSockets.Count.ToString() + " clients are connected";
            SetupServer();
            Console.ReadLine();

        }

        public static void SetupServer()
        {

            Console.WriteLine("Setting up server...");
            _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));
            _serverSocket.Listen(5);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);

        }

        public static void AcceptCallback(IAsyncResult AR)
        {
            Socket socket = _serverSocket.EndAccept(AR);
            clientSockets.Add(socket);
            Console.WriteLine("Client Connected");
            Console.Title = "Server, " + clientSockets.Count.ToString() + " clients are connected";
            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack), socket);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }

        private static void RecieveCallBack(IAsyncResult AR)
        {
            Socket socket = (Socket)AR.AsyncState;
            int received = socket.EndReceive(AR);
            byte[] databuff = new byte[received];
            Array.Copy(buffer, databuff, received);

            string s = Encoding.ASCII.GetString(databuff);
            Console.WriteLine("Text Received: " + s);
            string response = string.Empty;
            if (s.ToLower() == "get time")
            {
                response = DateTime.Now.ToLongTimeString();
            }
            else
            {
                response = "Invalid Request";
            }

            byte[] data = Encoding.ASCII.GetBytes(response);
            socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(sendCallback), socket);
            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack), socket);
            }




        private static void sendCallback(IAsyncResult AR)
        {
            Socket socket = (Socket)AR.AsyncState;
            socket.EndSend(AR);
        }
    }
}
我真的没料到会有太多工作,但我试了一下

另一个次要问题:

这是确定服务器将侦听的IP和端口的代码行吗

_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));

使用相同的代码,有相同的问题

它无法工作,因为客户端控制台卡在
readLine()
中,因此无法接收响应。发送命令后,不要再次调用控制台.ReadLine

要通过所有客户端循环并发送消息:

private static void sentToAll(string s)
{
    foreach (Socket socket in clientSockets)
    {                
        byte[] data = Encoding.ASCII.GetBytes(s);
        socket.Send(data);
    }
}

UDP可能更适合您所寻找的行为类型。根据我的经验,TCP多播仍然有点笨拙。LeftTechle(制作视频的人)是我的一个朋友,我给他发了这个问题的链接。他可能想帮助你:)M.BabcCK谢谢你的建议,我一定会考虑它,一旦我实际上得到它工作XD。@ ByteBlast非常感谢,如果他可以看看它,我真的很感激:解决它,解决。只是张贴一个代码剪辑通常是不接受的。你能用一句话详细说明一下吗?
     private static IPEndPoint localEndPoint;
    public static String IpAddress = "10.0.0.13";
 public static int port = 3000;
    localEndPoint = new IPEndPoint(IPAddress.Parse(IpAddress), port);
                _serverSocket.Bind(localEndPoint);
private static void sentToAll(string s)
{
    foreach (Socket socket in clientSockets)
    {                
        byte[] data = Encoding.ASCII.GetBytes(s);
        socket.Send(data);
    }
}