1.C# Socket之TCP服务器
需要引用using System.Net.Sockets; using System.Net;两个命名空间;
namespace TcpServer //服务器 { class Program { public static List<Client> clientList = new List<Client>(); static void Main(string[] args) { Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket对象 tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 8090));//绑定IP和申请端口 tcpServer.Listen(100);//设置客户端最大连接数 Console.WriteLine("服务器已启动,等待连接........."); while (true)//循环等待新客户端的连接 { Socket clientSocket = tcpServer.Accept(); Console.WriteLine((clientSocket.RemoteEndPoint as IPEndPoint).Address+"已连接"); Client client = new Client(clientSocket); clientList.Add(client); } } public static void BroadcastMessage(string message, Client clientSocket)//这个函数用来广播接收到的客户端消息 参数1为消息,参数2为消息来源(客户端) { var onConnectedList = new List<Client>();//用来存储已断开服务器连接的客户端 foreach (var client in clientList)//遍历已经存储的客户端 { if (clientSocket == client)//如果该客户端是消息来源,则不重复发送消息给该客户端 { continue; } if (client.Connected)//判断该客户端的状态 { client.SendMessage(client.ip + ":" + message);// } else//把已断开连接的客户端放到数组中 { onConnectedList.Add(client); } } foreach (var temp in onConnectedList)//广播完之后从存储已连接客户端集合中移除掉已断开连接的客户端 { clientList.Remove(temp); } } } }
namespace TcpServer { class Client { private Socket clientSocket; private Thread t; public string ip = ""; private byte[] data = new byte[1024]; public Client(Socket socket) { clientSocket = socket; ip = (clientSocket.RemoteEndPoint as IPEndPoint).Address.ToString();//获取客户端的ip t = new Thread(ReceiveMessage);//开启线程执行循环接收消息 t.Start(); } private void ReceiveMessage()//接收消息 { int length = 0;//初始化消息的长度 while (true)//循环接收消息 { length = clientSocket.Receive(data);//获取存放消息数据数组的长度 if (clientSocket.Poll(10, SelectMode.SelectRead))//???? { clientSocket.Close(); break; } if (length != 0)//判断是否有数组内是否存放消息数据 { string message = Encoding.UTF8.GetString(data, 0, length);//Byte转为string Program.BroadcastMessage(message, this);//广播给其他客户端 Console.WriteLine("来自" + (clientSocket.RemoteEndPoint as IPEndPoint).Address + ":" + message);//输出到服务器控制台 length = 0;//归0 } } } public void SendMessage(string message)//发送消息 { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); } public bool Connected//获取该客户端的状态 { get { return clientSocket.Connected; } } } }
2.C# Socket之TCP客户端
namespace TcpClient { class Program { private static Thread t; private static Socket clientScoket; private static byte[] data= new byte[1024]; static void Main(string[] args) { ConnectToServer();//创建scoket对象并连接到服务器 while (true) { string message2 = Console.ReadLine(); SendMessage(message2); } Console.ReadKey(); } static void ConnectToServer() { clientScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientScoket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.145"), 8090)); Console.WriteLine("已连接到服务器"); t = new Thread(ReceiveMessage);//开启线程执行循环接收消息 t.Start(); } static void SendMessage(string message)//发送消息 { byte[] data = Encoding.UTF8.GetBytes(message); clientScoket.Send(data); } static void ReceiveMessage()//接收消息 { int length = 0; while (true) { if (clientScoket.Connected==true) { length = clientScoket.Receive(data); if (length != 0) { string message = Encoding.UTF8.GetString(data, 0, length); Console.WriteLine(message); } } } } } }
C# Socket的TCP通讯
Socket的TCP通讯
一、 socket的通讯原理
服务器端的步骤如下。
(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。
(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
(3)当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下。
(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。
(2)发送连接请求到服务器,并等待服务器的回馈信息。
(3)连接成功后,与服务器进行数据的交互。
(4)数据处理完毕后,关闭自身的Socket连接。
二、 socket的通讯方式
socket通讯方式有两种:同步和异步
同步工作方式:
用TCP协议进行编程时程序执行到发送、接收和监听语句的时候,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句。
异步工作方式
程序执行到发送、接收和监听语句的时候,不论工作是否完成,都会继续往下执行。