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