介绍
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开始。
服务端界面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
来源:oschina
链接:https://my.oschina.net/u/4348132/blog/4503653