在做网络通讯方面的程序时,必不可少的是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通讯基础的更多相关文章

  1. TCP Socket 通讯(客户端与服务端)

    /*----------------------------编译环境:VS2015---------------------------------------*/ /*--------------- ...

  2. nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket【转】

    原文地址:https://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-u ...

  3. Java Socket通讯---网络基础

    java socket 通讯 参考慕课网:http://www.imooc.com/learn/161 一.网络基础知识 1.1 通讯示意图 1.2 TCP/IP协议 TCP/IP是世界上应用最为广泛 ...

  4. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  5. c#写个基础的Socket通讯

    晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...

  6. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  7. TCP建立与断开连接、socket通讯模板

    在传输层,有一个重点是TCP传输时建立连接的三次"握手"和四次"挥手",因为socket工作于应用层和传输层之间,故而涉及到建立连接和关闭连接的过程,以下笔记可 ...

  8. socket通讯实例与TCP/UDP的区别

    一.socket代码实例 1.简单的socket通讯: 服务端代码实例: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_ ...

  9. TCP网络编程(Socket通讯)

    TCP 网路编程: 1.TCP 三次握手: 第一次握手,客户端向服务器端发出连接请求,等待服务器确认. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求. 第三次握手,客户端再次向服 ...

随机推荐

  1. Linux grep命令和正则表达式

    介绍 grep是一个功能强大的文本搜索命令,可以用它来搜索某个文件中是否包含指定的搜索内容,它可以利用正则表达式来做复杂的筛选操作,它还可以为其它命令传输给管道的筛选,比如我们常用到的分析单个进程的操 ...

  2. [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法

    在调试一个自己做的手环,每次用keil烧写好程序运行的蓝牙.陀螺仪都是正常的.但是掉电再上电之后蓝牙是好的.陀螺仪可以读出ID但是读出的加速度和角速度数据全为0. 下面是发生问题时main函数的前面部 ...

  3. IOS上架流程

    来个简易版本的.此版本针对用于初次上架的MAC以及在别的本上上架过,但是新换MAC但不换开发者帐号的MAC. 1:首先确认本机没有老旧的开发和distribution证书,有的话,删除: 2:在本机打 ...

  4. 自动更新Chromium

    Chromium 其实就是开发版本的Chrome, 即Chrome dev 版本.一般他的版本要比正式版的Chrome高两个及以上.比如正式版本现在是29,开发者版本已经是32了. 这表示很多新功能你 ...

  5. VC++中开发汇编语言(转)

    汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 ...

  6. IOS UIView 03- 自定义 Collection View 布局

    注:本人是翻译过来,并且加上本人的一点见解. 前言 UICollectionView 在 iOS6 中第一次被引入,也是 UIKit 视图类中的一颗新星.它和 UITableView 共享一套 API ...

  7. IOS 多线程02-pthread 、 NSThread 、GCD 、NSOperationQueue、NSRunLoop

    注:本人是翻译过来,并且加上本人的一点见解. 要点: 1.前言 2.pthread 3.NSThread 4.Grand Central Dispatch(GCD) 5.Operation Queue ...

  8. iOS 常见设计模式

    (一)代理模式/委托模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和 ...

  9. .NetCore~框架版本号不同引起dotnet不能run它

    对于.netCore来说,今年已经推出了正式版,这要求使用vs2015的开发者需要升级到beta3版,而如果使用老版VS开始的.netCore应用程序,它的架构版本将为是测试版"versio ...

  10. 1.安装Redis

    首要条件:安装VMware,在虚拟机中安装CentOS. 安装步骤: 1.打开终端(Terminal) 2.在终端输入:wget http://download.redis.io/releases/r ...