我有一个与 Udp 一起使用的套接字程序。
我要管理连接到服务器的客户端。
例如,如果客户端已连接到服务器,则将该客户端添加到列表中。 我已经在 Tcp 中使用以下代码完成了此操作:
static readonly Dictionary <int, TcpClient> list_clients = new Dictionary <int, TcpClient>();
例如,仅列表中的客户,他的消息就会被写入。
我将每个客户与GetStream()
进行了比较。但是在Udp中,我不知道该怎么做。我可以管理客户吗?
编辑
我使用以下代码从客户端接收消息:
private static UdpClient udpServer = new UdpClient(11000);
private static IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 11000);
static void Main(string[] args)
{
var firstData = udpServer.Receive(ref remoteEP);
Console.WriteLine(Encoding.ASCII.GetString(firtsData);
}
预先感谢
答案 0 :(得分:0)
此代码对我来说效果很好!
服务器:
public partial class Server : Form
{
public Server()
{
InitializeComponent();
}
void Print(string message)
{
listBox1.Items.Add(message);
}
private void button1_Click(object sender, EventArgs e)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Loopback, 55555));
byte[] vs = new byte[100];
EndPoint senderRemote = new IPEndPoint(IPAddress.Any, 0);
Dictionary<EndPoint, int> pairs = new Dictionary<EndPoint, int>();
int id = 0;
for (int ii = 0; ii < 5; ii++)
{
socket.ReceiveFrom(vs, ref senderRemote);
if (pairs.ContainsKey(senderRemote))
Print(pairs[senderRemote].ToString() + " says:");
else
{
pairs.Add(senderRemote, id++);
Print("new sender");
}
Print(senderRemote.ToString());
Print(Encoding.Unicode.GetString(vs));
socket.SendTo(vs, senderRemote);
}
}
}
客户端:
public partial class Client : Form
{
public Client()
{
InitializeComponent();
}
Socket socket;
private void button1_Click(object sender, EventArgs e)
{
socket.Send(Encoding.Unicode.GetBytes("Gholamam!"));
byte[] vs = new byte[100];
socket.Receive(vs);
listBox1.Items.Add(Encoding.Unicode.GetString(vs));
}
private void Client_Load(object sender, EventArgs e)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Loopback, new Random().Next(1024,65000)));
socket.Connect(IPAddress.Loopback, 55555);
}
}
不要忘记客户端和服务器正在通信。因此,他们必须使用折衷的方式进行沟通。如果您想存储客户信息,则该信息必须恒定。为此,您必须bind
将其固定为固定的localEndPoint
。
您还可以在问题注释中使用解决方案:您可以在邮件中添加ID。您也可以同时使用。
P.S .:我使用Socket
类而不是TCPClient
或UDPClient
,因为我发现它们有些笨拙且不一致。