一、网络编程相关概念
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
新闻热点
疑难解答