定义一个类或者结构体,将IP地址和已连接的套接口作为其数据成员,在服务端建立一个可变长度的该类型的数组或者list来保存它们,当一个客户端和服务端建立连接后,就创建一个该结构体并把客户端的IP地址和服务端连接的套接口保存在该结构体中,并将该结构体添加到服务端已建立的数组或list中,这样,服务端就保存了所有与它连接的客户端信息了,当要单独发送信息给一个客户端时,循环查找数组或list中的每个元素,发现IP地址与要发送消息的客户端相同时,就把该结构体中的套接口取出来发送即可.
----------------------------------------------
补充:
例子如下,实际运用中发现服务端保存客户端信息使用字典更方便:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
namespace BaiDuUseThisConsole
{
class ClientInfo
{
public Socket handleSocket { get; set; }
public string ipAddress { get; set; }
public ClientInfo()
{
handleSocket = null;
ipAddress = string.Empty;
}
}
class Program
{
static void Main(string[] args)
{
//用字典对于通过IP地址查找套接口更方便
Dictionary
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
IPEndPoint ep = new IPEndPoint(hostIP, 5000);
listenSocket.Bind(ep);
//启动监听
listenSocket.Listen(10);
while (true)
{
Socket clientSocket = listenSocket.Accept();
IPAddress remote_ip = ((System.Net.IPEndPoint)clientSocket.RemoteEndPoint).Address;
string remote_ip_STR = remote_ip.ToString();
ClientInfo theClientInfo = new ClientInfo();
theClientInfo.ipAddress = remote_ip_STR;
theClientInfo.handleSocket = clientSocket;
if (!IpToSocketMap.ContainsKey(remote_ip_STR))
{
IpToSocketMap.Add(remote_ip_STR, theClientInfo);
}
else
{
Console.WriteLine("从{0}连接了第二个客户端,这个演示程序不处理同一个地址两个连接的情况.", remote_ip_STR);
clientSocket.Close();
}
Console.Write("一个客户端{0}已连接,是否继续监听(y/n) = ",remote_ip_STR);
string rl = Console.ReadLine();
rl = rl.ToLower();
if (rl == "n")
{
break;
}
}
//已退出监听,现在想给192.168.0.1的客户端发送消息
ClientInfo wantClient = IpToSocketMap["192.168.0.1"] ?? null;
if (null != wantClient)
{
string sendTxt = "hello!";
byte[] sendBuf = Encoding.Default.GetBytes(sendTxt);
wantClient.handleSocket.Send(sendBuf);
}
//测试程序中发送完毕,停顿几秒就退出
Thread.Sleep(3000);
//关闭所有套接口
foreach (KeyValuePair
{
if (null != item.Value.handleSocket)
{
item.Value.handleSocket.Close();
}
}
}
}
}