0

そうですね、私は一般的にプログラミングはあまり得意ではありませんが、ソケットの使用を試してみたいと思っています。まず、Youtubeビデオを見て、それを順を追って見て、ガイドに対して100%動作する完成品を手に入れましたが、サーバーが接続されているすべてのクライアントにメッセージを送信できるように変更したいと考えています。

YouTube ビデオは次のとおりです。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);
        }
    }
}

私はやりたいことに対してかなり哀れな試みをしました:

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);
            foreach(Socket s1 in clientSockets){
            string response = string.Empty;
            if (s.ToLower() == "get time")
            {
                response = DateTime.Now.ToLongTimeString();
            }
            else
            {
                response = "Invalid Request";
            }

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

あまりうまくいくとは思っていませんでしたが、試してみました。

別の二次的な質問:

これは、サーバーがリッスンする IP とポートを決定するコード行ですか?

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

2 に答える 2