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对象
"+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 = "开启接受客户端连接
" + 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}已连接
{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 = "关闭
" + 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}退出
{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}
{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 }
View Code
原文地址:https://www.cnblogs.com/chenyanbin/p/11069330.html