• 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
  • 相关阅读:
    5.Makefile的原理及应用
    8.adr与ldr伪指令的区别
    6.反汇编的原理
    9.S5PV210的时钟系统
    1.No MBR错误
    4.交叉编译工具链的安装及使用
    Java角度制向弧度制转化
    Java小题,通过JNI调用本地C++共享库中的对应方法实现杨辉三角的绘制
    编译安装-PHP
    编译安装-MySQL5.5
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/11069330.html
Copyright © 2020-2023  润新知