c# TCP Socket通讯基础
在做网络通讯方面的程序时,必不可少的是Socket通讯。
那么我们需要有一套既定的,简易的通讯流程。
如下:
- <pre name="code" class="csharp">public class PublicSocket
- {
- public const string DOWNLOAD_STATUS_WAIT = "1";
- public const string DOWNLOAD_STATUS_PAUSE = "2";
- public const string DOWNLOAD_STATUS_DOWNLOADING = "3";
- public const string DOWNLOAD_STATUS_DOWNLOADED = "4";
- public const string DOWNLOAD_STATUS_ERROR = "5";
- //private XmlHelper xmlhelper = new XmlHelper();
- private TcpClient tcpMethod = new TcpClient();
- public static string LoginUserName = "";
- public static Socket HeadClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- private static string iAddress = "192.168.1.1";
- private static int iPort = 7888;
- private static IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(iAddress), iPort);
- public const int LOGIN_NAMEERROR = 100000;
- public const int LOGIN_CODEERROR = 100001;
- public const int LOGIN_ERROR = 100002;
- public const int LOGIN_OK = 100003;
- public static bool AllowUpdate = true;
- public static void SocketConnect()
- {
- try
- {
- if (!HeadClient.Connected)
- {
- HeadClient.Connect(endpoint);
- }
- }
- catch (Exception ex)
- { }
- }
- public static void SocketClose()
- {
- if (HeadClient.Connected)
- {
- HeadClient.Close();
- }
- }
- public static void ThreadGetSingleDownloadedFile(object data) //object参数可以实现界面传入数据进行使用
- {
- string retMD5 = string.Empty;
- try
- {
- HanleListItemClass formInter = data as HanleListItemClass;
- XmlDocument aa = XmlHelper.BuildXmlDoc("CMD", "1", "1",
- new List<HollXmlNode> { new HollXmlNode("ID","2",null),
- new HollXmlNode("STATE","127",null) });
- //主要为了构建XML文件进行Socket的send操作
- //构造后如下 <?xml version='1.0' encoding='utf-8'?><CMD code='1' index='1'>
- // <ID>2</ID>
- // <STATE>127</STATE></CMD>
- byte[] sendaskbyte = Encoding.UTF8.GetBytes(aa.InnerXml.ToString());
- int sendcount = 0;
- try
- {
- sendcount = HeadClient.Send(sendaskbyte, sendaskbyte.Length, 0);
- }
- catch (Exception ex)
- {
- // return LOGIN_ERROR;
- }
- if (sendcount == 0)
- {
- //return LOGIN_ERROR;
- }
- int ret = SingleDownloadedFileWaitBack(formInter);
- }
- catch
- {
- //return LOGIN_ERROR;
- }
- }
- public static int SingleDownloadedFileWaitBack(HanleListItemClass tItemclass)
- {
- byte[] RetData = new byte[36 * 1024];
- Array.Clear(RetData, 0, RetData.Length);
- int datalen = 0;
- try
- {
- datalen = HeadClient.Receive(RetData);
- if (datalen == 0)
- {
- return -1;
- }
- //接收到服务器返回的信息
- string tcpdatastring = Encoding.UTF8.GetString(RetData).Replace("\0", " "); ;
- //此处可以根据自己需求处理返回的信息 http://www.cnblogs.com/sosoft/
- return 0;
- }
- catch (Exception ex)
- {
- return 0;
- }
- }
- }
然后再界面调用的时候,我们只需要在事件中这么使用即可
- private void button1_Click(object sender, EventArgs e)
- { PublicSocket.SocketConnect();
- ThreadPool.QueueUserWorkItem(new WaitCallback(SocketMethod.ThreadGetTotalState), this);
- }
同时也把构建XML的类分享出来,使得编码更加简便
- public class XmlHelper
- {
- private static string xmlinit = "<?xml version='1.0' encoding='utf-8'?><{0} code='{1}' index='{2}'></{0}>";
- public static XmlDocument BuildXmlDoc(string xmltype, string code, string index, List<HollXmlNode> xmlnodes)
- {
- XmlDocument root = new XmlDocument();
- root.LoadXml(string.Format(xmlinit, xmltype, code, index));
- if (xmlnodes != null)
- {
- for (int i = 0; i < xmlnodes.Count; i++)
- {
- XmlElement parentNode = root.CreateElement(xmlnodes[i].NodeName);
- XmlText descText = root.CreateTextNode(xmlnodes[i].NodeValue);
- parentNode.AppendChild(descText);
- if (xmlnodes[i].NodeAtt != null)
- {
- if (xmlnodes[i].NodeAtt.Count > 0)
- {
- for (int j = 0; j < xmlnodes[i].NodeAtt.Count; j++)
- {
- parentNode.SetAttribute(xmlnodes[i].NodeAtt[j].AttName, xmlnodes[i].NodeAtt[j].AttValue);
- }
- }
- }
- root.LastChild.AppendChild(parentNode);
- }
- }
- return root;
- }
- }
- public class HollXmlNode
- {
- private string _nodename;
- private string _nodevalue;
- private List<HollXmlAttribute> _nodeatt;
- public HollXmlNode(string tnodename, string tnodevalue, List<HollXmlAttribute> tnodeatt)
- {
- _nodename = tnodename;
- _nodevalue = tnodevalue;
- _nodeatt = tnodeatt;
- }
- public string NodeName
- {
- get { return _nodename; }
- set { _nodename = value; }
- }
- public string NodeValue
- {
- get { return _nodevalue; }
- set { _nodevalue = value; }
- }
- public List<HollXmlAttribute> NodeAtt
- {
- get { return _nodeatt; }
- set { _nodeatt = value; }
- }
- }
- public class HollXmlAttribute
- {
- private string _attname;
- private string _attvalue;
- public HollXmlAttribute(string tname, string tvalue)
- {
- _attname = tname;
- _attvalue = tvalue;
- }
- public string AttName
- {
- get { return _attname; }
- set { _attname = value; }
- }
- public string AttValue
- {
- get { return _attvalue; }
- set { _attvalue = value; }
- }
- }
c# TCP Socket通讯基础的更多相关文章
- TCP Socket 通讯(客户端与服务端)
/*----------------------------编译环境:VS2015---------------------------------------*/ /*--------------- ...
- nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket【转】
原文地址:https://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-u ...
- Java Socket通讯---网络基础
java socket 通讯 参考慕课网:http://www.imooc.com/learn/161 一.网络基础知识 1.1 通讯示意图 1.2 TCP/IP协议 TCP/IP是世界上应用最为广泛 ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- c#写个基础的Socket通讯
晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- TCP建立与断开连接、socket通讯模板
在传输层,有一个重点是TCP传输时建立连接的三次"握手"和四次"挥手",因为socket工作于应用层和传输层之间,故而涉及到建立连接和关闭连接的过程,以下笔记可 ...
- socket通讯实例与TCP/UDP的区别
一.socket代码实例 1.简单的socket通讯: 服务端代码实例: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_ ...
- TCP网络编程(Socket通讯)
TCP 网路编程: 1.TCP 三次握手: 第一次握手,客户端向服务器端发出连接请求,等待服务器确认. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求. 第三次握手,客户端再次向服 ...
随机推荐
- 团队项目——站立会议DAY9
第九次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:部署总体战略,需求分析,反复运行程序并完善. 2.钟灵毓秀:近一步修改代码,并进行功能性的扩展,不断完善. ...
- WCF Data Service
WCF Data Service:http://www.cnblogs.com/shanyou/category/240225.html
- 【转载】关于sql server 代理(已禁用代理xp)
原文地址:http://blog.sina.com.cn/s/blog_493cafbb0100qy91.html 症状: SQL SERVER2005里面,启动SQL代理服务,启动正常,但是在sql ...
- Gradle与Gatling脚本集成
Gatling作为次时代的性能测试工具,由于其API简洁明了.性能出众,越来越受欢迎.但是运行Gatling脚本却有诸多不便,其提供的默认方式不是很方便.考虑到Gatling脚本本质上是Scala类, ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...
- Android Activity的生命周期简单总结
Android Activity的生命周期简单总结 这里的内容参考官方的文档,这篇文章的目的不是去总结Activity是如何启动,如何创造,以及暂停和销毁的,而是从实际开发中分析在Activity各个 ...
- struts2学习笔记之七:Result类型
一:关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法 他们体现了策略模式,具体Result类型参见:struts-default ...
- VS2012 MVC4 学习笔记-概览
1. 访问请求过程 访问收到后路由(Router)根据路径由分配给对应的控制器(Control),然后由控制器返回页面视图(View) 路由设置一个默认的控制器,类似 主页的样子吧 <未完待续& ...
- 每天一个linux命令(28):tar命令
通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar命令可以为linux ...
- CSS3_02之2D、3D动画
1.转换属性:transform:取值:transform-function(转换函数): 2.转换原点:默认元素的中心处:更改转换原点:transform-origin:取值:数字/百分比/关键字: ...