TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的;然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多。C#通过提供的Socket API实现了对TCP/IP协议栈的封装,让实现C/S模型变得更加简单,对于入门TCP/IP协议学习十分有帮助。

   Socket通讯实现参考标准的流程如图所示,

·

  服务器工作:

  1.创建Socket套接字,绑定指定host,并监听。

2.线程堵塞等待用户端请求,当客户端请求到达时建立连接。

  3.连接建立完成后,读取请求并处理,然后将处理结果返回给客户端。

  4. 服务器等待客户端关闭连接,连接关闭后,一次Socket通讯结束。

客户端工作:

   1.创建Socket套接字, 建立连接,发送连接请求数据

2. 请求成功后,等待服务器返回响应

3.服务器回应成功后,处理数据,直到主动关闭连接。

  了解了上述Socket通讯的主要过程,在结合C#网络编程的特性,就可以实现如下C/S服务器。客户端的实现比较简单,主要分四个步骤:

  1.建立tcp连接(等同于socket 和 connect),处理连接失败状态

2.对于建立成功的连接,发送数据,并等待服务器返回

3.接收数据,输出到编辑框

4.关闭连接

private void button1_Click(object sender, EventArgs e)
{try{string s_ipaddress0 = textBox1.Text;string s_ipaddress1 = textBox2.Text;string s_ipaddress2 = textBox3.Text;string s_ipaddress3 = textBox4.Text;string s_port = textBox5.Text;//限定port的合法性bool isPort;int port;isPort = Int32.TryParse(s_port, out port);if (!(isPort && port >= 0 && port <= 65536)){OutToClient("Port is Invalid!");return;}//限定ip地址的合法性string host = s_ipaddress0 + "." + s_ipaddress1 + "." + s_ipaddress2 + "." + s_ipaddress3;if (!IsIpAdress(host)){OutToClient("IpAdress is invaild!");return;}IPAddress ip = IPAddress.Parse(host);IPEndPoint ipe = new IPEndPoint(ip, port); //Ip端口绑定 如192.168.1.48:80//发送框不能为空, 不然会导致GetBytes出错if (textBox6.Text == ""){OutToClient("Send Text is empty!");return;}OutToClient("Conneting...");int timeout = 1000;//tcpClient连接到指定端口,并处理超时TcpClient NetworkClient = TimeOutSocket.Connect(ipe, timeout);NetworkStream ntwStream = NetworkClient.GetStream();if (!ntwStream.CanWrite){OutToClient("Data can not be write!");return;}//向绑定地址端口发送数据OutToClient("Client send:" + textBox6.Text);string sendStr = textBox6.Text;byte[] by_send = Encoding.ASCII.GetBytes(sendStr);ntwStream.Write(by_send, 0, by_send.Length);//等待服务器端返回数据string recvStr = "";byte[] recvBytes = new byte[4096];int bytes = ntwStream.Read(recvBytes, 0, recvBytes.Length);//将接收到数据转发输出到Client编辑框recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);OutToClient(recvStr);//关闭连接, 一次发送完成
        ntwStream.Close();                                              NetworkClient.Close();OutToClient("Conneting Close!\r\n");}catch (ArgumentNullException ii){OutToClient("ArgumentNullException: "+ ii);}catch (SocketException ii){OutToClient("Socket failed! ");}catch (Exception ii){OutToClient("Conneting faild!" + ii);}
}

  服务器内的代码涉及到的知识多一些

1.通过按键1开辟监听线程,用于接收

2.监听线程创建Socket套接字,绑定到指定端口并监听

3.监听线程堵塞在等带连接建立

4.连接建立后监听线程读取客户端数据并回送给客户端处理后数据,然后循环堵塞在连接建立

5.通过按键2删除Socket套接字触发异常,结束线程

按照上述的流程,程序如下:

//新建线程 开始监听
private void button1_Click(object sender, EventArgs e)
{try{isConnectExit = false;button1.Enabled = false;button2.Enabled = true;Thread Listen_thread = new Thread(ListenClientConnect);Listen_thread.IsBackground = true;Listen_thread.Start();}catch (Exception ii){OutToServer("Connet faild!" + ii);}
}

//监听线程 主要处理数据接收发送
private void ListenClientConnect(object obj)
{string s_ipaddress0 = textBox1.Text;string s_ipaddress1 = textBox2.Text;string s_ipaddress2 = textBox3.Text;string s_ipaddress3 = textBox4.Text;string s_port = textBox5.Text;//限定port的合法性bool isPort;int port;isPort = Int32.TryParse(s_port, out port);if (!(isPort && port >= 0 && port <= 65536)){OutToServer("Port is Invalid!");return;}//限定ip地址的合法性string host = s_ipaddress0 + "." + s_ipaddress1 + "." + s_ipaddress2 + "." + s_ipaddress3;if (!IsIpAdress(host)){OutToServer("IpAdress is invaild!");return;}IPAddress ip = IPAddress.Parse(host);IPEndPoint ipe = new IPEndPoint(ip, port);//新建socket通讯 绑定指定IP+Port 并监听server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);server_socket.Bind(ipe);server_socket.Listen(10);OutToServer("wait for connect...");while (isConnectExit == false){Socket CurrentSocket;try{//等待连接 完成三次握手CurrentSocket = server_socket.Accept();if(isConnectExit == true){CurrentSocket.Close();                     // 关闭Socket
                server_socket.Close();break;}OutToServer("Get a Connect!");ServerProcess(CurrentSocket);}catch{OutToServer("Connet exti!");}}
}

//断开连接
private void button2_Click(object sender, EventArgs e)
{isConnectExit = true;button2.Enabled = false;button1.Enabled = true;if (server_socket != null){server_socket.Close();}
}

如此就完成了简单的C/S服务器功能。

实际测试界面如下:

具体源码参考:C/S架构客户端-服务器下载

备注:本程序仅用于演示TCP socket通信流程,服务器端能够监听的IP地址只有本机IP或者127.x.x.1(环回地址), 端口不能为80(和本机http端口冲突)。

转载于:https://www.cnblogs.com/zc110747/p/4905035.html

TCP/IP协议学习(五) 基于C# Socket的C/S模型相关推荐

  1. TCP/IP协议学习( 三 ) ---- ping原理 和 ICMP

    TCP/IP协议学习( 三 ) ---- ping原理 和 ICMP 1. 命令ping的用法和解析 1.1 ping 的用法 1.2 TTL 是什么? 1.3 SEQ是什么? 2.ICMP协议 2. ...

  2. tcp ip 协议 学习

    tcp ip 协议学习. linux 内核版本 : 3.18.48 主题: 由于只关心 传输层和网络层这2层 ,所以TCP/IP是重点. 从哪里开始? 从下往上还是从上往下 ?  思考良久 还是从 T ...

  3. TCP/IP协议学习笔记

    TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...

  4. TCP/IP协议学习笔记(二)

    工程建立: 先建Project然后添加module和package,如图所示: 代码编写: 首先代码中会出现中文字符,所以要在代码中添加#coding utf-8,避免出现乱码. 然后明确TCP/IP ...

  5. TCP/IP协议的一个具体实现Socket

    java 中Socket的用法 TCP/IP协议 两个不同的协议,放在一起说.IP协议是用来查找地址的,对应网际互连层:TCP协议是用来规范传输规则的,对应传输层. TCP在传输之前会进行三次沟通(三 ...

  6. TCP/IP协议学习之计算机中的端口

    端口的概念 在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem.集线器.交换机.路由器用于连接其他网络设备的接口,如RJ-45端口.SC端口等等.二是逻辑意 ...

  7. TCP/IP协议学习

    计算机网路学得不好,首先先放个OSI七层网络模型吧 在协议的控制下,上层对下层进行调用,下层对上层进行服务, 上下层间用交换原语交换信息.这样可以提高传输速率,并且保证数据安全,所以说其实每一层都有存 ...

  8. TCP/IP协议学习之TCP、IP篇

    TCP/IP是不同通信协议的大集合 协议族 TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合. 团结就是力量嘛,厉害的人总是倾向于聚集起来,厉害的协议同理,那么这些协议具体包 ...

  9. TCP/IP协议学习笔记(二)TCP与UDP介绍

    TCP/IP中有两个具有代表性的传输层协议,它们分别是TCP和UDP.TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输. IP首部中有一个协议字段,用来标识网络层(IP) ...

最新文章

  1. admin密码对应的MD5值,16位和32位,admin解密自己留着方便.
  2. 报告称中国出境游客移动支付消费首次超现金
  3. Git使用教程之本地仓库的基本操作
  4. [云炬python3玩转机器学习]5-2最小二乘法a和b推导
  5. SAP UI5 Gateway后台ETAG校验逻辑
  6. sap权限激活_SA*P 自定义权限对象
  7. PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案...
  8. Proteus、Keli对C51芯片实现仿真流水灯
  9. Nginx工作原理和优化
  10. Linux中vi命令替换字符串的操作
  11. c1语言实验报告怎么写,c语言程序设计实验报告模板
  12. python小学生入门教程-python 小学生教程|怎么让一个小学生学会Python?
  13. Linux搭建es集群详细教程(最终版)
  14. Pycharm中Python包的下载与使用
  15. 阿里巴巴中台战略--事务与柔性事务
  16. 信息学奥赛研究1:竞赛时间表、学习规划
  17. KMeans聚类算法
  18. 汽车电子设计之SBC芯片简单认识
  19. 指针使用入门与 unsafe.Pointer
  20. 从Palm到Pocket PC(转)

热门文章

  1. 后端自我介绍_新人入职自我介绍
  2. 修改java的jre_applet访问本地资源,需要修改jre的java.policy
  3. python安装后无法打开文本_Python 安装zbar-py时出现 无法打开包括文件: “unistd.h” no such file or directory...
  4. Java锁示例– ReentrantLock
  5. linux中设置环境变量_如何在Linux中设置环境变量
  6. struts2 标签单选框_Struts 2 UI标签–表单,复选框,单选,选择,提交
  7. kotlin set 私有_Kotlin可见性修改器–公共,受保护,内部,私有
  8. java构造函数_Java构造函数
  9. Akka与设备组一起工作《twelve》译
  10. 适配器模式的极简概述