一、基本语法
服务器端示例
[code]using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace Socket服务器端{class Program{static void Main(string[] args){Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipaddress = new IPAddress(new byte[]{ 192,168,0,113});EndPoint endPoint = new IPEndPoint(ipaddress, 230);TcpServer.Bind(endPoint);//向操作系统申请一个可用的ip和端口号 用来通信TcpServer.Listen(100);//参数是最大连接数Socket clientSocket = TcpServer.Accept();//暂停当前线程,直到有一个客户端连接进来,之后进行下面的代码//下面使用返回的Socket做通信。Console.WriteLine( clientSocket.RemoteEndPoint.ToString());//输出客户端ip和端口byte[] sendbyte = new byte[1024];byte[] recebyte = new byte[1024];string sendString = \"你好啊\";sendbyte = Encoding.UTF8.GetBytes(sendString);//对字符串做编码,得到一个字符串的字节数组。clientSocket.Send(sendbyte);int length = clientSocket.Receive(recebyte);Console.WriteLine(Encoding.UTF8.GetString(recebyte, 0, length));Console.ReadKey();}}}
客户端示例
[code]using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace Socket客户端{class Program{static void Main(string[] args){Socket TcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddress ipAddress = IPAddress.Parse(\"192.168.0.113\");EndPoint EP = new IPEndPoint(ipAddress, 230);TcpClient.Connect(EP);byte[] data = new byte[1024];int length = TcpClient.Receive(data);string message = Encoding.UTF8.GetString(data, 0, length);Console.WriteLine(message);message = Console.ReadLine();data = Encoding.UTF8.GetBytes(message);TcpClient.Send(data);Console.ReadKey();}}}
二、一主多从,接受多个客户端信息示例
[code] class Program{static List<Client> ClientMange = new List<Client>();public static void BordCastMessage(string message){var UnConntct = new List<Client>();foreach(var i in ClientMange){if(i.isConnect == true){i.SendMassage(message);}else{UnConntct.Add(i);}}foreach(var i in UnConntct){ClientMange.Remove(i);}}static void Main(string[] args){Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);TcpServer.Bind(new IPEndPoint(IPAddress.Parse(\"192.168.0.113\"), 2233));TcpServer.Listen(100);Console.WriteLine(\"连接监听开始\");while (true){Socket Client_Socket = TcpServer.Accept();Console.WriteLine(\"有一个客户端进入\");Client client = new Client(Client_Socket);ClientMange.Add(client);}Console.ReadKey();Console.ReadKey();}}
[code] class Client{Socket Client_Socket;Thread T;byte[] ReceData;byte[] SendData;public bool isConnect;int length;public Client(Socket s){ReceData = new byte[1024];SendData = new byte[1024];Client_Socket = s;isConnect = true;T = new Thread(Message_Dispose);T.Start();}void Message_Dispose(){while (true){try{length = Client_Socket.Receive(ReceData);}catch(System.Net.Sockets.SocketException e){Console.WriteLine(e.ToString());break;}//if (Client_Socket.Poll(10,SelectMode.SelectRead)) break;if (length != 0){Console.WriteLine(\"有消息\" + \"|\" + Encoding.UTF8.GetString(ReceData, 0, length) + \"|\" + length.ToString());Program.BordCastMessage(Encoding.UTF8.GetString(ReceData));}else{isConnect = false;break;}}}public void SendMassage(string message){SendData = Encoding.UTF8.GetBytes(message);Client_Socket.Send(SendData);}}
重点在于死循环接受客户端连接,使用客户端类包装sokect,再用集合管理客户端实列。
将客户端的消息分发给每个客户端,使用交叉调用的方式。(在客户端类的函数中调用->program类的函数,而这个program类的函数本身又调用客户端的函数).
三、TcpListener TcpClient UdpClient
TcpListener
[code] static void Main(string[] args){TcpListener Listener = new TcpListener(new IPEndPoint(IPAddress.Parse(\"192.168.0.113\"), 2333));Listener.Start();TcpClient tcpClient = Listener.AcceptTcpClient();Console.WriteLine(\"有一个客户端连接\");NetworkStream stream = tcpClient.GetStream();byte[] data = new byte[1024];int length;while (true){try{length = stream.Read(data, 0, 1024);}catch{Console.WriteLine(\"客户中断了连接\");break;}Console.WriteLine(Encoding.UTF8.GetString(data,0 ,length));}stream.Close();tcpClient.Close();Listener.Stop();Console.WriteLine(\"资源释放完成\");Console.ReadKey();}}
TcpClient
[code] class Program{static void Main(string[] args){string message;byte[] data = new byte[1024];TcpClient tcpClient = new TcpClient();tcpClient.Connect(new IPEndPoint(IPAddress.Parse(\"192.168.0.113\"), 2333));NetworkStream stream = tcpClient.GetStream();while (true){message = Console.ReadLine();data = Encoding.UTF8.GetBytes(message);stream.Write(data, 0, data.Length);}tcpClient.Close();stream.Close();}}
UdpClient
[code] UdpClient server = new UdpClient(new IPEndPoint(IPAddress.Parse(\"192.168.0.113\"), 2333));IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);byte[] data = server.Receive(ref client);Console.WriteLine(Encoding.UTF8.GetString(data));
[code] UdpClient client = new UdpClient();IPEndPoint server = new IPEndPoint(IPAddress.Parse(\"192.168.0.113\"), 2333);byte[] data = Encoding.UTF8.GetBytes(Console.ReadLine());client.Send(data, data.Length, server);