Visual Studio 2017 C#

Visual Studio 2017 C#,c#,sockets,udp,C#,Sockets,Udp,我很难弄明白这一点。 我试图在一台服务器和多个客户端之间进行聊天,但我似乎无法让它正常工作 我正在使用Visual Studio 2017,它是一个Windows窗体应用程序.NET框架项目。现在,它可以工作,但只有两个客户端可以相互连接。如果我尝试将两个用户连接到一个用户,其中一个用户将被阻止在对话之外,无法接收来自服务器的消息 问题的答案是:是否可以创建一个多客户端都可以连接的服务器,并且该服务器可以向所有连接的客户端发送消息 代码: using System; using System.C

我很难弄明白这一点。 我试图在一台服务器和多个客户端之间进行聊天,但我似乎无法让它正常工作

我正在使用Visual Studio 2017,它是一个Windows窗体应用程序.NET框架项目。现在,它可以工作,但只有两个客户端可以相互连接。如果我尝试将两个用户连接到一个用户,其中一个用户将被阻止在对话之外,无法接收来自服务器的消息

问题的答案是:是否可以创建一个多客户端都可以连接的服务器,并且该服务器可以向所有连接的客户端发送消息

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace ChatProgram
{
public partial class Window : Form
{
    Socket sck;
    EndPoint epLocal, epRemote;

    public Window()
    {

        InitializeComponent();

        sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //Starts New Socket In InternNetwork Dgram Protocoltype UDP
        sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

        IPMe.Text = GetLocalIP(); //Sets My IP Bar To My Local IP

    }

    private string GetLocalIP() //Gets Local IP From Computer
    {
        Send.Enabled = false;
        IPHostEntry host;
        host = Dns.GetHostEntry(Dns.GetHostName());

        foreach (IPAddress ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                return ip.ToString();
            }
        }

        return "127.0.0.1";
    }

    private void MessageCallBack(IAsyncResult aResult)
    {
        try
        {
            int size = sck.EndReceiveFrom(aResult, ref epRemote);
            if (size > 0)
            {
                byte[] recivedData = new byte[1464];
                recivedData = (byte[])aResult.AsyncState;
                ASCIIEncoding eEncoding = new ASCIIEncoding();
                string recivedMessage = eEncoding.GetString(recivedData);
                MessageBox.Items.Add("" + recivedMessage); //Paste Messages In MessageBox listMessage.Items.Add(""+recivedMessage);
            }

            byte[] buffer = new byte[1500];
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);

        }
        catch (Exception exp)
        {
            System.Windows.Forms.MessageBox.Show(exp.ToString());
        }
    }

    private void Connect_Click(object sender, EventArgs e)
    {
        try
        {
            epLocal = new IPEndPoint(IPAddress.Parse(IPMe.Text), Convert.ToInt32(PortMe.Text)); //MyPort And MyIP Make Port to Int32
            sck.Bind(epLocal); //Socket Bind To epLocal

            epRemote = new IPEndPoint(IPAddress.Parse(IpConnectingTo.Text), Convert.ToInt32(PortConnectingTo.Text)); //MyPort And MyIP Make Port to Int32
            sck.Connect(epRemote); //Socket Bind To epRemote

            byte[] buffer = new byte[1500];
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);

            Connect.Text = "Connected"; //Set Text To Connected
            Connect.Enabled = false; //Disabled (Gray)
            Send.Enabled = true; //Enable Send Button
            TextBoxSendMessages.Focus(); //Set Focus To This!

        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.ToString());
        }
    }

    private void Send_Click(object sender, EventArgs e)
    {
        try
        {
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            byte[] msg = new byte[1500];
            string nickandtext = NickNameMe.Text + ": " + TextBoxSendMessages.Text;

            msg = enc.GetBytes(nickandtext); //Messages The Sum Of Both
            //msg = enc.GetBytes(NickNameMe.Text + TextBoxSendMessages.Text);

            sck.Send(msg); //Send Message In Bytes
            MessageBox.Items.Add(NickNameMe.Text + ": " + TextBoxSendMessages.Text); //See yourself msg in msgbox
            TextBoxSendMessages.Clear(); //Clear Text Message Box
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.ToString());
        }
    }

    private void IPMe_TextChanged(object sender, EventArgs e)
    {

    }

    private void MessageBox_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    private void label2_Click(object sender, EventArgs e)
    {

    }
}
}

节目图片:


套接字只能有一个源IP和一个目标IP。所以你需要打开两个连接。请参阅msdn:。t示例中的StartListening()将接受多个连接。@jdweng这不起作用,idk why但当我将客户端连接到服务器时,服务器不会显示客户端已连接,当我试图在聊天中说些什么时,会弹出一条错误消息(检查新添加的图片).服务器侦听主套接字上的连接。建立连接时,将使用以下命令创建套接字的新实例:listener.beginacept(新的AsyncCallback(AcceptCallback))。因此,BeginAccept获取套接字的新实例,而StartListening方法继续侦听其他连接。因此,当您获得两个连接时,BeginAccept必须生成套接字数组。因此,当服务器发回消息时,它必须知道数组中要响应的套接字。