Socket客户端与服务器端进行TCP协议通信
基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息。
使用TCP协议通讯需满足以下条件:
- 建立一个套接字(Socket)
- 绑定服务器端IP地址及端口号–服务器端
- 利用Listen()方法开启监听–服务器端
- 利用Accept()方法尝试与客户端建立一个连接–服务器端
- 利用Connect()方法与服务器建立连接–客户端
- 利用Send()方法向建立连接的主机发送消息
- 利用Recive()方法接受来自建立连接的主机的消息(可靠连接)
TCP-服务器端Socket
- 代码:
//创建socket Socket server = new Socket(AddressFamily.InterNetwork,SocketTyp.Stream,ProtocolType.Tcp); //绑定IP和端口号 IPAddress ipaddress = new IPAddress(new byte[]{192.168.1,1}); EndPoint point = new IPEndPoint(ipaddress,9999); server.Bind(point); //开始监听,等待客户端连接 server.Listen(100);//参数是最大连接数 //暂停当前线程,直到有一个客户端连接再执行 Socket client = server.Accept(); //使用返回的socket跟客户端通信 string msg = "hello world" byte[] data = Encoding.UTF8.GetBytes(msg);//将字符串编码成字节数组 client.Send(data);
TCP-客户端Socket
- 代码:
//创建socket Socket client = new Socket(AddressFamily.InterNetwork,SocketTyp.Stream,ProtocolType.Tcp); //绑定IP和端口号 IPAddress ipaddress = IPAddres.Parse("192.168.1.1") EndPoint point = new IPEndPoint(ipaddress,9999); //发起建立连接的请求 client.Connect(point); //接受数据 byte[] data = new byte[1024];//用来存接收的数据 int length = client.Receive(data); string msg = Encoding.UTF8.GetString(data,0,length); //判断socket连接是否断开 client.Poll(10,SelectMode.SelectRead);//如果连接已关闭,重置或终止返回true;否则返回false
Socket客户端与服务器端进行UDP协议通信
基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低。至于可靠性,可通过应用层的控制来满足。(不可靠连接)
使用UDP协议通讯需满足以下条件:
- 建立一个套接字(Socket)
- 绑定服务器端IP地址及端口号–服务器端
- 通过SendTo()方法向指定主机发送消息(需提供主机IP地址及端口)
- 通过ReciveFrom()方法接收指定主机发送的消息(需提供主机IP地址及端口)
UDP-服务器端Socket
- 代码:
//创建socket Socket server = new Socket(AddressFamily.InterNetwork,SocketTyp.Dgram,ProtocolType.Udp); //绑定IP和端口号 server.Bind(new IPEndPoint(IPAdress.Parse("192.168.1.1"),9999)); //接收数据 EndPoint point = new IPEndPoint(IPAdress.Any,0); byte[] data = new byte[1024]; int length = server.ReceiveFrom(data,ref point);//该方法会把数据的来源(IP,port)放到第二个参数上。 string msg = Encoding.UTF8.GetString(data,0,length);
UDP-客户端Socket
- 代码:
//创建socket Socket client = new Socket(AddressFamily.InterNetwork,SocketTyp.Dgram,ProtocolType.Udp); //发送数据 EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("192.168.1.1"),999900;) string msg = "hello world"; byte[] data = Encoding.UTF8.GetBytes(msg); client.SendTo(data,serverPoint);
TCP和UDP协议的区别
- TCP是有连接的可靠的,而UDP无连接不可靠的。
- TCP占用资源多,而UDP较少。
- TCP是流模式,而UDP是数据报模式。
- TCP保证数据的正确性,而UDP可能丢包。
使用TcpClient,TcpListener,UdpClient简化socket实现网络通讯
这些协议建立在System.NetSockets.Socket类的基础之上,负责数据传送的细节。TcpClient和TcpListener使用NetworkStream类表示网络。使用GetStream方法返回网络流,然后调用该流的Read和Write方法。NetworkStream不拥有协议类的基础套接字,因此关闭并不影响套接字。UdpClient类使用字节数组保存UDP数据文报,使用Send方法向网络发送数据,使用Receive方法接收传入的数据文报。
TcpListener
- 代码:
//TcpListener对socket进行了一层封装,这个类会自己去创建socket对象。 TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.1"),9999); //监听 listener.Start(); //等待客户端连接 TcpClient client = listener.AcceptTcpClient(); //取得客户端发送过来的数据 NetworkStream stream = client.GetStream();//得到一个网络流 byte[] data = new byte[1024]; int length = stream.Read(data,0,1024); string msg = Encoding.UTF8.GetString(data,0,length);
TcpClient
- 代码:
//当创建tcpclient对象时,就会跟server建立连接 TcpClient client = new TcpClient("192.168.1.1",9999); //通过网络流进行数据的交换 NetworkStream stream = client.GetStream(); string msg = "hello world"; byte[] data = Encoding.UTF8.GetBytes(msg); stream.Write(data,0,data.Length); //关闭 stream.Close(); client.Close();
UdpClient
- 服务器端
- 代码:
//创建udpclient对象 UdpClient udpclient = new UdpClient(new IPEndPoint(IPAddress.Parse("192.168.1.1"),9999)); //接收数据 IPEndPoint point = new IPEndPoint(IPAddress.Any,0); byte[] data = udpclient.Receive(ref point); string msg = Endcoding.UTF8.GetString(data); //关闭 udpclient.Close();
- 代码:
2.客户端
- 代码:
//创建udpclient对象 UdpClient client = new UdpClient(); //发送数据 string msg= "hello world"; byte[] data = Encoding.UTF8.GetBytes(msg); client.Send(data.data.Length,new IPEndPoint(IPAddress.Parse("192.168.1.1"),9999)); //关闭 client.Close();
Comments