首先要实现不同的客户端之间的通信问题,我选择了使用socket进行通信,因此首先要编写socket服务代码。为了实现socket向多个客户端发送信息,同时不会向信息的发出方发送信息,因此需要一个List来记录连接socket的客户端的信息,在收到客户端发送的消息的时候,通过遍历这个list的同时发送消息,从而实现向不同的客户端发送消息,在发送的时候将自身去掉,socket部分代码:
class Program
{static Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字
static List<Socket> SocketList = new List<Socket>();
static void Main(string[] args)
{
try
{
int port = 2000;
string host = "192.168.10.57";
///创建终结点(EndPoint)
IPAddress ip = IPAddress.Parse(host);//把ip地址字符串转换为IPAddress类型的实例
IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例
///创建socket并开始监听
s.Bind(ipe);//绑定EndPoint对像(2000端口和ip地址)
s.Listen(10);//开始监听
Console.WriteLine("等待客户端连接");
///接受到client连接,为此连接建立新的socket,并接受信息
while (true)
{
Socket temp = s.Accept();//为新建连接创建新的socket
Console.WriteLine("建立连接");
if (SocketList.Contains(temp))
continue;
SocketList.Add(temp);
Thread threadRecevice = new Thread(new ParameterizedThreadStart(ReceviceSendMessage));
threadRecevice.Start(temp);
}
//temp.Close();
//s.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
}
public static void ReceviceSendMessage(object socket)
{
if (!(socket is Socket))
return;
Socket temp = socket as Socket;
try
{
while (true)
{
string recvStr = "";
byte[] recvBytes = new byte[2048];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
///给client端返回信息
foreach (var item in SocketList)
{
if (item == temp)
continue;
Console.WriteLine(item.RemoteEndPoint.ToString() + ":" + recvStr);//把客户端传来的信息显示出来
item.Send(recvBytes, recvBytes.Length, 0);//返回信息给客户端
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
SocketList.Remove(temp);
}
finally
{
Console.ReadLine();
}
}
}