标题 C#Socket通信
1. 关于C#Socket通信,分为同步和异步通信,本文介绍一下同步通信,使用的是TCP协议,通信两端分为客户端(Client)和服务端(Server);
(1)客户端(Client)
class Program
{
private static byte[] result = new byte[1024];
private static Socket clientSocket;
private static string userName = "DefultName";
static void Main(string[] args)
{
Console.WriteLine("请输入用户名:");
userName = Console.ReadLine();
if (string.IsNullOrEmpty(userName))//检测userName是否为空引用
{
userName = "DefultName";
}
//设定服务器IP地址
IPAddress ip = IPAddress.Parse("192.168.1.120");
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientSocket.Connect(new IPEndPoint(ip, 8888)); //配置服务器IP与端口
Console.WriteLine("连接服务器成功");
clientSocket.Send(Encoding.UTF8.GetBytes(string.Format("{0}${1}", userName, "加入")));
Thread reciveThread = new Thread(ReciveMessage);
reciveThread.Start();
Thread sendThread = new Thread(SendMessage);
sendThread.Start();
}
catch
{
Console.WriteLine("连接服务器失败,请按回车键退出!");
return;
}
/// 测试代码块,可有可无
通过clientSocket接收数据
//int receiveLength = clientSocket.Receive(result);
//Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveLength));
通过 clientSocket 发送数据
//for (int i = 0; i < 10; i++)
//{
// try
// {
// Thread.Sleep(1000); //等待1秒钟
// string sendMessage = "client send Message Hellp" + DateTime.Now;
// clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
// Console.WriteLine("向服务器发送消息:{0}" + sendMessage);
// }
// catch
// {
// clientSocket.Shutdown(SocketShutdown.Both);
// clientSocket.Close();
// break;
// }
//}
//Console.WriteLine("发送完毕,按回车键退出");
//Console.ReadLine();
}
private static void SendMessage()//向服务器发送消息
{
while (true)
{
string message = Console.ReadLine();
clientSocket.Send(Encoding.UTF8.GetBytes(string.Format("{0}${1}", userName, message)));
}
}
private static void ReciveMessage()//接受服务器消息
{
while (true)
{
int receiveNumber = clientSocket.Receive(result);
string resultMessage = Encoding.UTF8.GetString(result, 0, receiveNumber);
Console.WriteLine("接收服务器端消息{0}", resultMessage);
}
}
}
}
服务端(Server)
class Program
{
private static Dictionary<string, Socket> clientSocketDic;//定义字典来存储用户
private static byte[] result = new byte[1024];
public static Socket serverSocket;
private static int port = 8888;
private static string ip = "192.168.1.120";
static void Main(string[] args)
{
clientSocketDic = new Dictionary<string, Socket>();
IPAddress ipAddress = IPAddress.Parse(ip);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//这里使用的是TCP通信协议
serverSocket.Bind(new IPEndPoint(ipAddress, port));
serverSocket.Listen(100);
Thread clientThread = new Thread(ListenClientConnect)
clientThread.Start();//启动线程
Console.WriteLine("*************服务器启动*****************");
}
static void ListenClientConnect()//监听客户端连接
{
while (true)
{
Console.WriteLine("*************等待客户端连接*****************");
Socket clientSocket = serverSocket.Accept();
try
{
int receiveNumber = clientSocket.Receive(result);
string resultMessage = Encoding.UTF8.GetString(result, 0, receiveNumber);
Console.WriteLine(clientSocket.RemoteEndPoint);//打印客户端的IP地址
string name = resultMessage.Split('$')[0];//使用$将用户名与Socket分割
if (!clientSocketDic.ContainsKey(name))//判断客户端是否断开连接
{
clientSocketDic.Add(name, clientSocket);
}
Console.WriteLine(string.Format("{0}:加入成功", name));
}
catch (Exception e)
{
clientSocket.Close();
// Console.WriteLine(e+"异常");
}
Thread receiveThread = new Thread(ReceiveMessage);
receiveThread.Start(clientSocket);
}
}
private static void ReceiveMessage(object clientSocket)//这里实现多人对话服务,当加入的客户端向服务端发送消息时,所有加入服务端的客户端都能收到消息
{
Socket myClientSocket = (Socket)clientSocket;
while (true)
{
try
{
if (myClientSocket.Poll(1000, SelectMode.SelectRead))
{
foreach (KeyValuePair<string, Socket> item in clientSocketDic)
{
if (item.Value == myClientSocket)
{
clientSocketDic.Remove(item.Key);
break;
}
}
myClientSocket.Close();
break;
}
int receiveNumber = myClientSocket.Receive(result);
string resultMessage = Encoding.UTF8.GetString(result, 0, receiveNumber);
Console.WriteLine(resultMessage);
string messageToAllClient = resultMessage.Replace('$', ':');
foreach (KeyValuePair<string, Socket> item in clientSocketDic)
{
if (item.Value.Connected)
if (item.Key != resultMessage.Split('$')[0])
item.Value.Send(Encoding.UTF8.GetBytes(messageToAllClient));
}
}
catch (Exception e)
{
//异常处理
}
}
}
}
}
小小新人一枚,如果那里写的不对,请大佬指点一下,笔芯!