C产品在市场上有哪些独特优势?

更新于
2026-09-30 20:30:30
5阅读来源:SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计943个文字,预计阅读时间需要4分钟。

C产品在市场上有哪些独特优势?

在C语言中,以下是一个简单的例子,展示如何创建一个函数来计算两个整数的和:

C产品在市场上有哪些独特优势?

c#include

int sum(int a, int b) { return a + b;}

int main() { int num1=5; int num2=10; int result=sum(num1, num2); printf(The sum of %d and %d is %d.\n, num1, num2, result); return 0;}

这段代码定义了一个名为 `sum` 的函数,它接受两个整数参数并返回它们的和。在 `main` 函数中,我们创建了两个整数变量 `num1` 和 `num2`,然后调用 `sum` 函数计算它们的和,并将结果存储在 `result` 变量中。最后,我们使用 `printf` 函数输出结果。

  在C#中经常会用到Socket去接收和发送数据,而且也是非常方便的,有时候我们会向服务端去请求数据,如果返回的数据量很大,比如超过10M甚至是更多,那么该怎样去接收数据呢?下面以一个在项目中用到的实例去分析和解释这个问题,先看看下面的这段代码?

/// <summary> /// 返回摄像头信息 /// </summary> private void RcvCameraInfos(object obj) { string sourceIp = System.Configuration.ConfigurationSettings.AppSettings["SourceIP"].ToString(); string sourcePort = System.Configuration.ConfigurationSettings.AppSettings["SourcePort"].ToString(); Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(sourceIp), int.Parse(sourcePort)); mysocket.Connect(ipEndPoint); DateTime start = DateTime.Now; string s = "<?xml version=\"1.0\" ?>"; s += "<info name=\"getcameracodematrixtable\"/>\0"; byte[] buffer = System.Text.ASCIIEncoding.GetEncoding("GB2312").GetBytes(s); mysocket.Send(buffer); Action<string> OnCamraInfoRcvCompleted = obj as Action<string>; int recvsize = 0; int dataSize = 2048 * 1000; int ret = 0; byte[] datas = new byte[dataSize]; SortedList<string, string[]> cameraDictionnary = new SortedList<string, string[]>(); string xmlString = ""; while (recvsize < dataSize) { ret = mysocket.Receive(datas, recvsize, dataSize - recvsize, SocketFlags.None); if (ret <= 0) { break; } recvsize += ret; if (datas[recvsize - 1] == 0) { break; } if (recvsize >= dataSize) { byte[] buff2 = new byte[dataSize + 1024]; datas.CopyTo(buff2,0); datas = buff2; dataSize += 1024; } } xmlString = System.Text.ASCIIEncoding.GetEncoding("GB2312").GetString(datas, 0, recvsize - 1); DateTime end = DateTime.Now; TimeSpan span = end - start; System.Windows.MessageBox.Show("总共花费时间:"+span.TotalSeconds.ToString()+"秒"); this._videoSourceXmlString = xmlString; if (cameraDictionnary != null) { if (OnCamraInfoRcvCompleted != null) OnCamraInfoRcvCompleted(xmlString); } }

  上述这段代码的核心是在While循环里面,我们首先接收的BufferSize,这里我们定义2048*1000个字节的大小,ret = mysocket.Receive(datas, recvsize, dataSize - recvsize, SocketFlags.None);通过Socket的这个同步方法来进行接收,datas是我们接收数据的Byte数组,recvsize是当前接收的字节起点(offset),dataSize-recvsize是接收的缓冲区大小,在这个While循环里面,只要是recvsize < dataSize就会不停的去接收数据,当然如果数据量很大的话总有一个时刻recvsize >= dataSize,这个时候我怎就需要增加dataSize了,这里我们去动态增加1KB的大小,通过这样一个边界控制我们就能够去准确获取所有的数据了......

  当然这种方式接收数据的缺点就是通过同步的方式,如果接收的数据太多的话,那么花费的时间可能就过长了,特别是在更新UI界面的时候,需要采用异步非阻塞的Socket来接收数据了,或者单独来开一个线程来进行数据接收,然后通过Application.Current.Dispatcher.BeginInvoke的方式来更新到UI上面,不然界面就会卡死,这个需要我们去认真分析......

  另外一个当我们这样接收数据然后存入XML文件时,可能XML数据都是连在一起并不能主动换行,这个可以通过下面的方式来解决。

private void SaveCurrentInfoToXML(string recevInfo) { string filePath=System.AppDomain.CurrentDomain.BaseDirectory+"CameraInfo.xml"; XmlDocument xd = new XmlDocument(); if (File.Exists(filePath)) { xd.Load(filePath); } else { XmlDeclaration xmlDec; XmlElement xmlEle; xmlDec = xd.CreateXmlDeclaration("1.0","UTF-8",null); xd.AppendChild(xmlDec); xmlEle = xd.CreateElement("Info"); xd.AppendChild(xmlEle); } xd.LoadXml(recevInfo); XmlTextWriter xtw = new XmlTextWriter(filePath, Encoding.UTF8); xtw.Formatting = Formatting.Indented; xd.Save(xtw); }

  这里我们接收到XML数据后,通过XmlTextWriter写入到XML文件中时,需要设置缩进格式:xtw.Formatting = Formatting.Indented;这样写入数据时数据就会完整,并且处于对齐方式。

以上就是C# 通过Socket读取大量数据的示例的详细内容,更多关于C# 通过Socket读取数据的资料请关注自由互联其它相关文章!

本文共计943个文字,预计阅读时间需要4分钟。

C产品在市场上有哪些独特优势?

在C语言中,以下是一个简单的例子,展示如何创建一个函数来计算两个整数的和:

C产品在市场上有哪些独特优势?

c#include

int sum(int a, int b) { return a + b;}

int main() { int num1=5; int num2=10; int result=sum(num1, num2); printf(The sum of %d and %d is %d.\n, num1, num2, result); return 0;}

这段代码定义了一个名为 `sum` 的函数,它接受两个整数参数并返回它们的和。在 `main` 函数中,我们创建了两个整数变量 `num1` 和 `num2`,然后调用 `sum` 函数计算它们的和,并将结果存储在 `result` 变量中。最后,我们使用 `printf` 函数输出结果。

  在C#中经常会用到Socket去接收和发送数据,而且也是非常方便的,有时候我们会向服务端去请求数据,如果返回的数据量很大,比如超过10M甚至是更多,那么该怎样去接收数据呢?下面以一个在项目中用到的实例去分析和解释这个问题,先看看下面的这段代码?

/// <summary> /// 返回摄像头信息 /// </summary> private void RcvCameraInfos(object obj) { string sourceIp = System.Configuration.ConfigurationSettings.AppSettings["SourceIP"].ToString(); string sourcePort = System.Configuration.ConfigurationSettings.AppSettings["SourcePort"].ToString(); Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(sourceIp), int.Parse(sourcePort)); mysocket.Connect(ipEndPoint); DateTime start = DateTime.Now; string s = "<?xml version=\"1.0\" ?>"; s += "<info name=\"getcameracodematrixtable\"/>\0"; byte[] buffer = System.Text.ASCIIEncoding.GetEncoding("GB2312").GetBytes(s); mysocket.Send(buffer); Action<string> OnCamraInfoRcvCompleted = obj as Action<string>; int recvsize = 0; int dataSize = 2048 * 1000; int ret = 0; byte[] datas = new byte[dataSize]; SortedList<string, string[]> cameraDictionnary = new SortedList<string, string[]>(); string xmlString = ""; while (recvsize < dataSize) { ret = mysocket.Receive(datas, recvsize, dataSize - recvsize, SocketFlags.None); if (ret <= 0) { break; } recvsize += ret; if (datas[recvsize - 1] == 0) { break; } if (recvsize >= dataSize) { byte[] buff2 = new byte[dataSize + 1024]; datas.CopyTo(buff2,0); datas = buff2; dataSize += 1024; } } xmlString = System.Text.ASCIIEncoding.GetEncoding("GB2312").GetString(datas, 0, recvsize - 1); DateTime end = DateTime.Now; TimeSpan span = end - start; System.Windows.MessageBox.Show("总共花费时间:"+span.TotalSeconds.ToString()+"秒"); this._videoSourceXmlString = xmlString; if (cameraDictionnary != null) { if (OnCamraInfoRcvCompleted != null) OnCamraInfoRcvCompleted(xmlString); } }

  上述这段代码的核心是在While循环里面,我们首先接收的BufferSize,这里我们定义2048*1000个字节的大小,ret = mysocket.Receive(datas, recvsize, dataSize - recvsize, SocketFlags.None);通过Socket的这个同步方法来进行接收,datas是我们接收数据的Byte数组,recvsize是当前接收的字节起点(offset),dataSize-recvsize是接收的缓冲区大小,在这个While循环里面,只要是recvsize < dataSize就会不停的去接收数据,当然如果数据量很大的话总有一个时刻recvsize >= dataSize,这个时候我怎就需要增加dataSize了,这里我们去动态增加1KB的大小,通过这样一个边界控制我们就能够去准确获取所有的数据了......

  当然这种方式接收数据的缺点就是通过同步的方式,如果接收的数据太多的话,那么花费的时间可能就过长了,特别是在更新UI界面的时候,需要采用异步非阻塞的Socket来接收数据了,或者单独来开一个线程来进行数据接收,然后通过Application.Current.Dispatcher.BeginInvoke的方式来更新到UI上面,不然界面就会卡死,这个需要我们去认真分析......

  另外一个当我们这样接收数据然后存入XML文件时,可能XML数据都是连在一起并不能主动换行,这个可以通过下面的方式来解决。

private void SaveCurrentInfoToXML(string recevInfo) { string filePath=System.AppDomain.CurrentDomain.BaseDirectory+"CameraInfo.xml"; XmlDocument xd = new XmlDocument(); if (File.Exists(filePath)) { xd.Load(filePath); } else { XmlDeclaration xmlDec; XmlElement xmlEle; xmlDec = xd.CreateXmlDeclaration("1.0","UTF-8",null); xd.AppendChild(xmlDec); xmlEle = xd.CreateElement("Info"); xd.AppendChild(xmlEle); } xd.LoadXml(recevInfo); XmlTextWriter xtw = new XmlTextWriter(filePath, Encoding.UTF8); xtw.Formatting = Formatting.Indented; xd.Save(xtw); }

  这里我们接收到XML数据后,通过XmlTextWriter写入到XML文件中时,需要设置缩进格式:xtw.Formatting = Formatting.Indented;这样写入数据时数据就会完整,并且处于对齐方式。

以上就是C# 通过Socket读取大量数据的示例的详细内容,更多关于C# 通过Socket读取数据的资料请关注自由互联其它相关文章!