博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Stocket
阅读量:414 次
发布时间:2019-03-06

本文共 5802 字,大约阅读时间需要 19 分钟。

介绍

  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
ClientProxSocket = new List
(); 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 try107 {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

 

转载地址:http://fwmkz.baihongyu.com/

你可能感兴趣的文章