Socket编程
TCP协议
以下只是进行了一次的收发例子。
客户端和服务器端是两个解决方案。
服务器端 static void main(string[] args){ //1.创建Socket对象 Socket tcpServer=new Socket(AddressFamily.InterNetworl,SocketType.Stream,ProtocolType.Tcp); //2.绑定IP和端口号(软件的端口号唯一) IPAddress ipaddress=new IPAddress(new byte[]{192,168,0,112}); EndPoint point=new EndPoint(ipaddress,7788); tcpServer.Bind(point);//向操作系统申请一个可用的ip和端口号用来做通信 //3.开始监听(等待客户端连接) tcpServer.Listen(100);//最大连接数 Socket clientSocket=tcpServer.Accept();//暂停当前线程,直到有一个客户端连接过来,之后进行下面的代码 //使用返回的Socke跟客户端做通信 string message="hello 欢迎你"; byte[] data=Encodeing.UTF8.GetBytes(message);//对字符串做编码,得到一个字符串的字节数组 clientSocket.Send(data): byte[]data2= new byte[1024];//创建一个字节数组接收客户端发过来的数据 int length=clientSocket.Receive(data2); string message2=Encoding.UTF8.GetString(data2,0,length); Console.WriteLine(message2); } 客户端 static void main(string[] args){ //1.创建Socket对象 Socket tcpClient=new Socket(AddressFamily.InterNetworl,SocketType.Stream,ProtocolType.Tcp); //2.发起建立连接的请求 IPAddress ipaddress=IPAddress.Parse("192.168.0.112")//可以把一个字符串的ip地址转换成一个ipaddress的对象 EndPoint point=new IPEndPoint(ipaddress,7788);//端口号保持一致 tcpClient.Connect();//通过IP和端口号来定位一个要连接到的服务器端 byte[] data = new byte[1024]; int length=tcpClient.Receive(data);//这里传递一个byte数组,实际上这个data数组用来接收数据 //Length表示返回值接收了多少字节的数据 string message=Encoding.UTF8.GetString(data,0,length);//只把接收到的数据做个转化 Console.WriteLine(message); //向服务器端发送消息 string message2=Console.ReadLine();//读取用户的输入,把输入的信息发送到服务器端 tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串变为字节。 }
TCP一直收发
Client完成对服务器端的操作 客户端类似
class Client { private Socket clientSocket; Thread t; private byte[] data = new byte[1024];//字节数据容器 public Client(Socket s) { clientSocket = s; //启动一个线程 处理客户端的数据接收 t = new Thread(ReceiveMessage); t.Start(); } public void ReceiveMessage() { //一直接受客户端的数据 while (true) { //在接收数据之前 判断一下socket连接是否断开 if(clientSocket.Poll(10,SelectMode.SelectRead))//第一个参数响应时间,第二个参数选择模式,返回true 则断开连接 { clientSocket.Close(); break;//终止 } int length= clientSocket.Receive(data); string message = Encoding.UTF8.GetString(data, 0, length); //服务器端接受到数据要把这个数据分发到客户端 Program.BroadcastMessage(message); } } /// <summary> /// 发送消息 /// </summary> /// <param name="message"></param> public void SendMessage(string message) { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); } }
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("10.85.30.167"), 7788));//绑定IP和端口 tcpServer.Listen(100);//监听 Console.WriteLine("server runing..."); while (true) { Socket clientSocket = tcpServer.Accept();//等待客户端连接 Console.WriteLine("a client is connected!!"); Client client = new Client(clientSocket);//把客户端通信逻辑放到class Clinet里面处理 clientlist.Add(client); }} /// <summary> /// 广播消息 /// </summary> /// <param name="message"></param> public static void BroadcastMessage(string message) { foreach (var client in clientlist) { client.SendMessage(message); } }
UDP 协议
//服务器端 //1.创建socket Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建Socket udp //2.绑定IP和端口号 udpServer.Bind(new IPEndPoint(IPAddress.Parse("10.85.30.167"), 7788));//绑定IP和端口 IPEndPoint为包含IP和端口的节点 //3.接受数据 EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] data = new byte[1024]; int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//这个方法把数据来源放在第二个参数上 string message = Encoding.UTF8.GetString(data, 0, length); //客户端 //1.创建socket Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建Socket udp //2.发送数据 EndPoint serverPoint= new IPEndPoint(IPAddress.Parse("10.85.30.167"),7788); string messagesend = Console.ReadLine(); byte[] dataudp = Encoding.UTF8.GetBytes(messagesend); udpClient.SendTo(dataudp, serverPoint); //udp无所谓连接是不是关闭,如果需要一直的接收发,只需要while(true)循环的发送和接收消息 用一个线程执行发送和接收方法
两者区别: UDP不需要建立连接,TCP需要建立连接。
UDP对资源要求少,TCP对资源要求多
UDP程序结构简单
UDP数据报模式,TCP是流模式
TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。