Socket知识总结

8/3/2015来源:C#应用人气:1406

Socket知识总结

一、网络编程相关概念

1、 互联网通过ip定位电脑

2、 在电脑中通过port定位程序

3、 程序和程序之间通过协议定义通信数据格式

二、Socket相关概念

1、 ip地址

1) 每台联网的电脑都有一个唯一的ip地址。

2) 长度32位,分为4段,每段8位,用十进制表示,每段范围0~255.

3) 特殊ip:127.0.0.1用户本地网卡测试。

2、 端口

1) 网络中有很多电脑,这些电脑一般运行了多个网络程序,每种网络程序都打开一个Socket,并绑定到一个端口上,不同的端口对应不同的网络程序。

2) 常用端口,21 ftp, 25 smtp,110 pop3,80 http,443 https

3、 Socket通俗理解:人和人通过电话来通讯,电话号码就相当于是ip地址,人就是程序,套接字就是程序间的电话,程序和程序之间通讯,需要定义通讯协议,就像两个人打电话要先定义好彼此说的语言,这样才能正常通讯。

4、 Socket流式(服务端和客户端)

1) 服务器welcoming socket开始监听端口(负责监听客户端的连接信息)

2) 客户端client socket连接服务端制定端口(负责接收和发送服务端信息)

3) 服务端welcoming socket监听到客户端连接,创建connection socket(负责和客户端通讯)

Demo1

服务端代码:

委托类DGCloseConn

1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace C03聊天室服务端7 {8     public delegate void DGCloseConn(string endpoint);9 }
View Code

委托类DGShowMsg

1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace C03聊天室服务端7 {8     public delegate void DGShowMsg(string msg);9 }
View Code

MsgConnection类

  1 using System;  2 using System.Collections.Generic;  3 using System.Text;  4   5 using System.Net;  6 using System.Net.Sockets;  7 using System.Threading;  8   9 namespace C03聊天室服务端 10 { 11     /// <summary> 12     /// 通信管理类 - 负责 处理 与某个 客户端通信的过程 13     /// </summary> 14     public class MsgConnection 15     { 16         /// <summary> 17         /// 与某个 客户端通信的套接字 18         /// </summary> 19         Socket sokMsg = null; 20         /// <summary> 21         /// 通信线程 22         /// </summary> 23         Thread thrMsg = null; 24         /// <summary> 25         /// 在窗体显示消息的方法 26         /// </summary> 27         DGShowMsg dgShow = null; 28         /// <summary> 29         /// 关闭 客户端连接 方法 30         /// </summary> 31         DGCloseConn dgCloseConn = null; 32  33         #region 0.0 构造函数 34         public MsgConnection(Socket sokMsg, DGShowMsg dgShow, DGCloseConn dgCloseConn) 35         { 36             this.sokMsg = sokMsg; 37             this.dgShow = dgShow; 38             this.dgCloseConn = dgCloseConn; 39             //创建通信线程 负责 调用 通信套接字 来接受客户端消息 40             thrMsg = new Thread(ReceiveMsg); 41             thrMsg.IsBackground = true; 42             thrMsg.Start(this.sokMsg); 43         }  44         #endregion 45  46         bool isReceive = true; 47         #region 2.0 接收客户端消息 48         void ReceiveMsg(object obj) 49         { 50             Socket sokMsg = obj as Socket; 51             //3.通信套接字 监听 客户端的 消息 52             //3.1创建 消息缓存区 53             byte[] arrMsg = new byte[1024 * 1024 * 1]; 54             try 55             { 56                 while (isReceive) 57                 { 58                     //3.2接收客户端的消息 并存入 缓存区,注意:Receive方法也会阻断当前的线程 59                     //   并 返回 真实 接收到客户端 数据的 字节长度 60                     int realLength = sokMsg.Receive(arrMsg); 61                     //3.3将接收到的消息 转成 字符串 62                     string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 0, realLength); 63                     //3.4将消息 显示到 文本框 64                     dgShow(strMsg); 65                 } 66             } 67             catch (Exception ex) 68             { 69                 //调用 窗体类的 关闭移除方法 70                 dgCloseConn(sokMsg.RemoteEndPoint.ToString()); 71                 //显示消息 72                 dgShow("客户端断开连接~!"); 73             } 74         } 75         #endregion 76  77         #region 3.0 向客户端发送 文本消息 +void SendMsg(string msg) 78         /// <summary> 79         /// 3.0 向客户端发送 文本消息 80         /// </summary> 81         /// <param name="msg"></param> 82         public void SendMsg(string msg) 83         { 84             //使用 指定的 通信套接字 将 字符串 发送到 指定的客户端 85             byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(msg); 86             try 87             { 88                 byte[] newArr = MakeNew("str", arrMsg); 89                 sokMsg.Send(newArr); 90             } 91             catch (Exception ex) 92             { 93                 dgShow("异常:" + ex.Message); 94             } 95         } 96         #endregion 97  98         #region 4.0 向客户端 发送 文本 文件 +void SendFile(string strPath) 99         /// <summary>100         /// 4.0 向客户端 发送 文本 文件101         /// </summary>102         /// <param name="strFilePath"></param>103         public void SendFile(string strFilePath)104         {105             //6.2 读取要发送的文件106             byte[] arrFile = System.IO.File.ReadAllBytes(strFilePath);107             byte[] arrNew = MakeNew("file", arrFile);108             //6.3 向客户端 发送文件109             sokMsg.Send(arrNew);110         } 111         #endregion112 113         #region 5.0 向客户端 发送抖屏命令 +void SendShake()114         /// <summary>115         /// 5.0 向客户端 发送抖屏命令116         /// </summary>117         public void SendShake()118         {119             sokMsg.Send(new byte[1] { 2 });120         } 121         #endregion122 123         #region 5.0 返回带标识的 新数组 +byte[] MakeNew(string type, byte[] oldArr)124         /// <summary>125         /// 返回带标识的 新数组126         /// </summary>127         /// <param name="type"></param>128         /// <param name="oldArr"></param>129         /// <returns></returns>130         public byte[] MakeNew(string type, byte[] oldArr)131         {132             //6.2 创建一个新数组(是原数组长度 + 1)133             byte[] newArrFiel = new byte[oldArr.Length + 1];134             //6.3 将原数组数据 复制到 新数组中(从新数组下标为1的位置放)135             oldArr.CopyTo(newArrFiel, 1);136             //6.4 根据 内容类型, 为新数组第一个元素 设置标识符号137             switch (type.ToLower())138             {139                 case "str":140                     newArrFiel[0] = 0;//只能存 0-255之间的数值, 'a'; //  byte = 8 bit   ,  1bit = 1个 0 或者 1 , 256 141                     break;142                 case "file":143                     newArrFiel[0] = 1;144                     break;145                 default:146                     newArrFiel[0] = 2;147                     break;148             }149             return newArrFiel;150         } 151         #endregion152 153         #region 4.0 关闭通信154         /// <summary>155         /// 关闭通信156         /// </summary>157         public void Close()158         {159             isReceive = false;160             sokMsg.Close();161             sokMsg = null;162         } 163         #endregion164     }165 }
View Code

FormServer