C#建立TCP/IP连接
C#建立TCP/IP连接
在C/S模式下做网络信号传输,使用TCP/IP协议是首选。
其传输机制:
首先服务端与客户端建立套接字(socket)连接,建立完套接字后,服务端与客户端通过套接字进行数据传输。通常服务端和客户端需要各开启一个线程进行数据的接收。
1.构建连接
首先服务端开启套接字监听服务,然后客户端根据服务器的IP、端口进行连接。
1.1服务端开启套接字
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口
serverSocket.Listen(10);//设定最多10个排队连接请求
注意在绑定IP时serverSocket.Bind(new IPEndPoint(ip, myProt));
如果使用127.0.0.1时,客户端连接服务端的IP也必须是127.0.0.1,即要求服务端、客户端都在本地才可以通联。因此,需要将服务器套接字绑定的IP改为对外的IP,如192.168.0.1;
获取对外IP的方法为
/// <summary>/// 获取本地IP/// </summary>/// <returns></returns>private string GetAddressIP(){string AddressIP = string.Empty;foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList){if (_IPAddress.AddressFamily.ToString() == "InterNetwork"){AddressIP = _IPAddress.ToString();}}return AddressIP;}
1.2开启监听客户端连接的线程
new Thread(ListenClientConnect).Start(this);
/// <summary>
/// 监听客户端连接
/// </summary>
private static void ListenClientConnect(object server)
{Server myServer = (Server)server;myServer.clientSocket = serverSocket.Accept();//线程在此等待,直到有客户端连接后方继续执行myServer.clientSocket.Send(Encoding.UTF8.GetBytes("连接成功"));Thread receiveThread = new Thread(ReceiveMessage);//启动接收信息线程receiveThread.Start(server);
}
当serverSocket.Accept()执行后就完成了套接字的建立,就可以发送消息了。
1.3客户端建立与服务端的连接
客户端也定义一个套接字 clientSocket,再调用其connect方法与服务端连接。
public bool createConn(){ try{IPAddress ip = IPAddress.Parse(textBox_serverIp.Text);clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);int connPort = Int16.Parse(textBox_serverPort.Text);clientSocket.Connect(new IPEndPoint(ip, connPort)); //配置服务器IP与端口 writeLog("连接服务器成功");button_createConn.Text = "断开连接";//开启监听线程receiveThread = new Thread(receiveMsg);receiveThread.Start(this);}catch (Exception e){writeLog("连接服务器失败" + e.ToString());return false;}return true;}
2.数据传输
2.1数据发送
服务端与客户端数据发送均是调用Socket进行传输。注意传输的数据需要进行编码Encoding.UTF8.GetBytes()
/// <summary>/// 发送消息/// </summary>/// <param name="signal"></param>/// <returns></returns>private bool sendSignal(string signal){if (clientSocket == null){writeLog("发送失败,未连接客户端");return false;}try{clientSocket.Send(Encoding.UTF8.GetBytes(signal + "。"));return true;}catch (Exception e){writeLog("发送失败" + e.ToString());clientSocket = null;}return false;}
2.2数据接收
数据的接收建议开启一个新的线程进行接收,接收是通过调用socket的Receive方法实现的。
new Thread(receiveMsg).Start(this);/// <summary>/// 接受消息处理线程/// </summary>/// <param name="clientForm"></param>public static void receiveMsg(object clientForm){Client myClient = (Client)clientForm;byte[] result = new byte[1024];while (true){try{//通过clientSocket接收数据 int receiveLength = myClient.clientSocket.Receive(result);string resultStr = Encoding.UTF8.GetString(result, 0, receiveLength);myClient.writeLog(string.Format("接收服务器消息:{0}", resultStr)); }catch (Exception e){myClient.writeLog("读取数据失败,服务器可能已经断开" + e.ToString());Thread.Sleep(300);myClient.closeConn(); } } }
3.关闭连接
想套接字发送关闭的信号后,将本地套接字关闭
clientSocket.Shutdown(SocketShutdown.Both);myServer.clientSocket.Close();
4.点击下载例程
C#建立TCP/IP连接相关推荐
- SIM7600X 获取GPS信号 TCP/IP连接与PPP拨号上网 4G上网
如果设备是基于Ubuntu.树莓派等,参考:https://www.cnblogs.com/little-kwy/p/11296426.html 用户在使用模块前除了micro USB线.LTE天线. ...
- SYN(用于TCP/IP连接,即建立连接时的第一个包)
SYN用于建立TCP/IP时的握手连接,由客户端想服务端发送SYN,服务端向客户端发送SYN+ACK响应报文,客户端向服务端发送一个ACK响应报文,然后建立一个完整的连接,即三次握手 SYN攻击属于D ...
- Cisco测试命令和TCP/IP连接故障处理
Cisco测试命令和TCP/IP连接故障处理 一.故障处理命令 1.show命令: 1) 全局命令: show version :显示系统硬件和软件版本.DRAM.Flash show startup ...
- mysql服务器是否支持tcp/ip连接,(3)MySQL客户端与服务端的TCP/IP及socket连接方式-Go语言中文社区...
MySQL客户端与服务端的TCP/IP及socket连接方式 客户端与服务器模型 客户端与服务端模型 TCP/IP方式连接 解释说明 TCP/IP套接字方式是MySQL在任何平台下都提供的连接方式,也 ...
- Cisco测试命令和TCP/IP连接故障处理整理集合
Cisco测试命令和TCP/IP连接故障处理 一.故障处理命令 1.show命令: 1) 全局命令: show version :显示系统硬件和软件版本.DRAM.Flash show startup ...
- 基于软件定义无线电的实时频谱分析仪设备连接方法(一)简单2端口TCP/IP连接
TCP/IP传输协议 TCP/IP传输协议,即传输控制/网络协议,也称为网络通讯协议,是在网络使用中的最基本的通信协议.TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定,并且它是保证 ...
- Python攻防-Socket通信建立TCP反向连接
文章目录 前言 远程控制 脚本编写 效果演示 脚本优化 getopt () 完整代码 效果演示 前言 本文将记录学习基于 Socket 通信机制建立 TCP 反向连接,借助 Python 脚本实现主机 ...
- Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败...
2019独角兽企业重金招聘Python工程师标准>>> 错误原因如下: Exception in thread "main" org.hibernate.exce ...
- jdbc连接数据库失败,com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。
创建数据库连接失败! com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败. java.net.ConnectExce ...
最新文章
- hugo采用gitalk添加留言功能
- python的列表的remove()方法、判断if xxx in xx条件比较耗时问题
- 如何设计区块链项目的通证(token)模型
- 查看Redis集群所有节点内存工具
- SAP License:ERP横向集中部署还是纵向集中部署
- 【报告分享】2020年上半年中国直播电商行业发展分析报告.pdf(附下载链接)...
- 如何查看 Windows10 版本号
- 3Dmax和SketchUp有什么区别
- 2018 华为软件精英挑战赛
- 国内主流的大数据平台厂商有哪些?
- Excel 2010同时打开2个或多个独立窗口
- 调用摄像头接口方法合集
- 保姆级教程:手把手教你搭建个人网站
- msysgit - Windows Git安装配置
- 科大讯飞语音离线命令识别
- steam网络游戏加速技术,针对任何联网进程或者游戏代理加速都行。
- WHU 1572 Cyy and Fzz (AC自动机 dp )
- 计算机维修套装推荐,工欲善其事,必先利其器---iFixit 54 Bit Driver Kit 维修工具套装...
- Problem1: Magic Square
- 影视列表(20211117更新)
热门文章
- 多线程和单线程执行效率比较
- 服务器自定义怪,饥荒联机服务器-自定义世界设置
- lxd linux系统视频教程,如何在 Linux 启动时自动启动 LXD 容器
- java判断是否能组成三角形
- PCL学习记录---pcd_wirte
- 生信入门(六)——单细胞分析(Seurat)
- java8 stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()的
- C++基础算法教程|文件操作
- 杨桃的Python基础教程——第1章:Python简介
- web 阿里矢量图标