1

私はソケットが初めてなので、メッセージを交換するサーバーとクライアントを作成しようとしました。C#で作成しましたが、サーバーを起動するとフリーズし、「応答していません」というメッセージが表示されるという奇妙なエラーが発生しました...サーバーに接続するとクライアントでも同じことが起こりますが、問題はそれらのいずれかを閉じたときです。 .他のアプリケーションには更新が表示されているので、何が問題なのかはわかりませんが、Uが使用したコードは次のとおりです

サーバークラス

Socket Soc;
static ushort MaxClients = 1000;
static List<Socket> ClientList = new List<Socket>(MaxClients);
static bool ServerStarted;
public Server()
{
    InitializeComponent();
    button1.Enabled = false;
    button2.Enabled = false;
}

private void button1_Click(object sender, EventArgs e) // Send
{
    string MessageToSend = textBox1.Text;
    byte[] Buffer = Encoding.Default.GetBytes(MessageToSend);
    foreach (var client in ClientList)
    {
        Soc.Send(Buffer, 0, Buffer.Length, SocketFlags.None);
    }
    textBox2.Text += " Message Sent To Clients : " + MessageToSend + Environment.NewLine;
}

private void button3_Click(object sender, EventArgs e) // Start
{
    StartServer("25.21.113.163", 5000);
}

private void button2_Click(object sender, EventArgs e) // Stop
{
    CloseServer();
}

private void button4_Click(object sender, EventArgs e) // Exit
{
    CloseServer();
    Application.Exit();
}

public void StartServer(string Ip, ushort Port)
{
    Soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    Soc.Bind(new IPEndPoint(IPAddress.Parse(Ip), Port));
    textBox2.Text += " Server Is Created On Ip : " + Ip + ", Port : " + Port + Environment.NewLine;
    Soc.Listen(MaxClients);
    textBox2.Text += " Server Is Listening to Clients Now... " + Environment.NewLine;
    ServerStarted = true;
    button1.Enabled = true;
    button2.Enabled = true;
    button3.Enabled = false;
    label3.Text = ClientList.Count.ToString() + "/" + MaxClients;
    ReceiveData();
}

public void ReceiveData()
{
    while (true)
    {
        var Client = Soc.Accept();
        ClientList.Add(Client);
        label3.Text = ClientList.Count.ToString() + "/" + MaxClients;
        textBox2.Text += " Client Located At Ip : " + Client.RemoteEndPoint.ToString().Split(':')[0].ToString() + " Is Now Connected To Server " + Environment.NewLine;
        while (true)
        {
            byte[] ReceivedBytes = new byte[1024];
            int ReceivedDataLength = Client.Receive(ReceivedBytes, 0, ReceivedBytes.Length, SocketFlags.None);
            string MessageFromClient = Encoding.Default.GetString(ReceivedBytes, 0, ReceivedDataLength);
            textBox2.Text += " Message Sent to Server : " + MessageFromClient + Environment.NewLine;
        }
    }
}

public void CloseServer()
{
    Soc.Close();
    ServerStarted = false;
    textBox2.Text += " Server Is Closed Now... " + Environment.NewLine;
    button3.Enabled = true;
    button2.Enabled = false;
    button1.Enabled = false;
}

クライアントクラス

Socket Client;
public Form1()
{
    InitializeComponent();
    button1.Enabled = false;
    button2.Enabled = false;
}

private void button1_Click(object sender, EventArgs e) // Send
{
    string MessageToSend = textBox2.Text;
    byte[] Buffer = Encoding.Default.GetBytes(MessageToSend);
    Client.Send(Buffer, 0, Buffer.Length, SocketFlags.None);
    textBox1.Text += " Sent Message To Server Is : " + MessageToSend + Environment.NewLine;
}

private void button2_Click(object sender, EventArgs e) // LogOut
{
    ClientClose();
}

private void button3_Click(object sender, EventArgs e) // Connect
{
    ConnectToServer("25.21.113.163", 5000);
}

private void button4_Click(object sender, EventArgs e) // Exit
{
    ClientClose();
    Application.Exit();
}

public void ConnectToServer(string Ip, ushort Port)
{
    try
    {
        Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Client.Connect(Ip, Port);
        textBox1.Text += " You Are Now Connected To Server Hosted On Ip : " + Client.RemoteEndPoint + Environment.NewLine;
        button1.Enabled = true;
        button2.Enabled = true;
        button3.Enabled = false;
        ReceiveData();
    }
    catch
    {
        textBox1.Text += " Server In Offline Now " + Environment.NewLine;
    }
}

public void ReceiveData()
{
    while (true)
    {
        byte[] ReceivedBytes = new byte[1024];
        int ReceivedBytesLength = Client.Receive(ReceivedBytes, 0, ReceivedBytes.Length, SocketFlags.None);
        string ReceivedMessage = Encoding.Default.GetString(ReceivedBytes, 0, ReceivedBytesLength);
        textBox1.Text += " Received Message From Server Is : " + ReceivedMessage + Environment.NewLine;
    }
}

public void ClientClose()
{
    button1.Enabled = false;
    button2.Enabled = false;
    button3.Enabled = true;
    Client.Dispose();
    Client.Close();
    textBox1.Text += " You Are Disconnected From Server" + Environment.NewLine;
}

私は何を間違えたのか知りたいですか?そして、どうすれば両方のアプリケーションのばかげた「応答なし」状態を取り除くことができますか?

4

1 に答える 1