C# Stocket
介绍
1、TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
2、UDP(User Data Protocol,用户数据包协议)是与TCP相对应的协议。它属于TCP/IP协议族中的一种。
3、应用层(Application):应用层是一个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业商业应用和互联网应用。
4、传输层(Transport):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而TCP提供传输保证。
5、网络层(NetWork):网络层协议由一系列协议组成,包括ICMP、IGMP、RIP、OSPF、IP(v4、v6)等。
6、链路层(Link):又称为物理数据网络接口层,负责报文传输。
网络4层协议
原理图
端口的分类
1、公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯,明确了某种服务的协议。例如:80端口实际上总是HTTP通讯。
2、注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说许多服务绑定于这些端口,这些端口同样用于许多其他目的。例如:许多系统处理动态端口从1024左右开始。
3、动态和私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口,但也有例外:SUN的RPC端口从32768开始。
服务端界面
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Net.Sockets; 10 using System.Net; 11 using System.Threading; 12 13 14 namespace socket网络编程 15 { 16 public partial class frmServer : Form 17 { 18 public frmServer() 19 { 20 InitializeComponent(); 21 Control.CheckForIllegalCrossThreadCalls = false; 22 } 23 24 private void BtnStart_Click(object sender, EventArgs e) 25 { 26 try 27 { 28 //Socket服务器端 29 //引入命名空间:using System.Net; 30 //引入命名空间:using System.Net.Sockets; 31 //1、创建Socket 32 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //第一个参数:设置网络寻址协议;第二个参数:设置数据传输方式;第三个参数:设置通信协议 33 //2、绑定IP和端口 34 this.txtLog.Text = "创建服务端Socket对象\r\n"+this.txtLog.Text; 35 IPAddress ip = IPAddress.Parse(txtIp.Text.Trim()); //IP地址 36 int port = Convert.ToInt32(txtPort.Text.Trim()); //端口 37 IPEndPoint ipEndpoint = new IPEndPoint(ip, port); 38 serverSocket.Bind(ipEndpoint); 39 //3、开启侦听 40 serverSocket.Listen(10); //挂起连接队列的最大长度。 41 //4、开始接收客户端连接 42 this.txtLog.Text = "开启接受客户端连接\r\n" + this.txtLog.Text; 43 ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartAcceptClient), serverSocket); 44 } 45 catch (Exception ex) 46 { 47 throw ex; 48 } 49 } 50 List<Socket> ClientProxSocket = new List<Socket>(); 51 public void StartAcceptClient(object state) 52 { 53 try 54 { 55 var serverSocket = (Socket)state; 56 while (true) 57 { 58 Socket proxSocket = serverSocket.Accept(); //为新建连接创建新的Socket对象 59 this.txtLog.Text = string.Format("客户端:{0}已连接\r\n{1}", proxSocket.RemoteEndPoint.ToString(), this.txtLog.Text); //proxSocket.RemoteEndPoint:获取连接信息 60 ClientProxSocket.Add(proxSocket); 61 //服务端接受客户端的消息 62 ThreadPool.QueueUserWorkItem(new WaitCallback(RecieveData),proxSocket); 63 //string str = DateTime.Now.ToString(); 64 //byte[] data = Encoding.UTF8.GetBytes(str); //待发送字节数组 65 //proxSocket.Send(data, 0, data.Length, SocketFlags.None); //发送消息,发送的消息必须大于0个字节 66 //proxSocket.Shutdown(SocketShutdown.Both); 67 //this.txtLog.Text = "关闭\r\n" + this.txtLog.Text; 68 //proxSocket.Close(); //关闭 69 } 70 } 71 catch (Exception ex) 72 { 73 throw ex; 74 } 75 } 76 public void RecieveData(object obj) 77 { 78 var proxSocket = (Socket)obj; 79 byte[] data = new byte[1024 * 1024]; 80 //方法返回值,实际接受的数据的长度(字节数) 81 while (true) 82 { 83 try //处理客户端异常退出 84 { 85 int reallen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None); 86 if (reallen == 0) 87 { 88 this.txtLog.Text = string.Format("客户端:{0}退出\r\n{1}", proxSocket.RemoteEndPoint.ToString(), this.txtLog.Text); 89 //客户端退出 90 proxSocket.Shutdown(SocketShutdown.Both); 91 proxSocket.Close(); 92 ClientProxSocket.Remove(proxSocket); 93 return; 94 } 95 string formClientMsg = Encoding.UTF8.GetString(data, 0, reallen); 96 this.txtLog.Text = string.Format("接受客户端{0}的消息:{1}\r\n{2}", proxSocket.RemoteEndPoint.ToString(), formClientMsg, this.txtLog.Text); 97 } 98 catch (Exception ex) 99 { 100 101 } 102 } 103 } 104 private void BtnSend_Click(object sender, EventArgs e) 105 { 106 try 107 { 108 foreach (var socket in ClientProxSocket) 109 { 110 if (socket.Connected) 111 { 112 string str = this.txtMsg.Text.Trim(); 113 byte[] data = Encoding.UTF8.GetBytes(str); 114 socket.Send(data, 0, data.Length, SocketFlags.None); 115 } 116 } 117 } 118 catch (Exception ex) 119 { 120 throw ex; 121 } 122 } 123 } 124 }