关于C# Socket多次Send的问题 socket服务器通讯c#经验 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从建立socket开始,一直到close为止. /// <summary> /// 服务器返回数据包 /// </summary> /// <returns></returns> public static string GetResponseXml(string sendStr, Socket socket) { if (!string.IsNullOrEmpty(sendStr)) { byte[] bs = Encoding.ASCII.GetBytes(sendStr); Console.WriteLine("Send Message"); socket.Send(bs, bs.Length, 0);//发送客户端请求 string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); return recvStr; } return ""; }以下是三次指令调用//1.登录 SocketHelper.GetResponseXml(SocketHelper._login, socket); //2.读取用户对应的VMS配置 //SocketHelper.GetResponseXml(SocketHelper._vms, c); //3.读取所有显示页 SocketHelper.GetResponseXml(SocketHelper._page, socket); 如果用Socket,你要有分割的约定。比如1、用回车符分割,坏处就是xml数据里面不能有回车。2、先发送一个长度,坏处就是数据流不再是纯粹的xml。最简单的就是直接用Http协议。也容易扩展为WebService(包括Restful Service)。 这个方法:GetResponseXml中的参数Socket 前加上ref 试试如何?,每次调用方法时都变成了一个新的Socket 了,这样你之前的Socket 没有给关闭?不知道我理解的对不对! socket是引用类型,不需要引用传递,值传递就可以除非在方法里又重新new了 这就是全部代码了 参数里面sendStr就是不同的指令XML字符串。 全部,连类都带上来了- - using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;using HurysCommon;using System.Xml;namespace HurysDataConventTools{ class Program { static void Main(string[] args) { //1.Socket Client端接收数据 使用TCP/IP协议 长连接 获取四通诱导平台节目参数信息 即XML数据 //2.建立对象存储熙讯节目XML数据,分析熙讯LED显示内容的XML格式数据,了解相关参数.例如显示内容,间隔时间,背景色等等 //3.获取四通诱导平台数据并且处理为熙讯LED数据格式.将四通诱导平台的参数和熙讯LED中的XML参数关联. //4.初始化熙讯LED //5.将数据制作成XML文件并且使用熙讯协议中的编译函数编译该XML文件,然后调用interface.dll中的通讯API发送显示内容 try { IPAddress ip = IPAddress.Parse(SocketHelper._host); IPEndPoint ipe = new IPEndPoint(ip, SocketHelper._port);//把ip和端口转化为IPEndPoint实例 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(ipe);//连接到诱导平台服务器 //1.登录 SocketHelper.GetResponseXml(SocketHelper._login, socket); //2.读取用户对应的VMS配置 //SocketHelper.GetResponseXml(SocketHelper._vms, c); //3.读取所有显示页 SocketHelper.GetResponseXml(SocketHelper._page, socket); //4.解析四通诱导平台数据,并且赋值熙讯LED信息类 //5.建立熙讯LED所需节目XML字符串并且转换为XML文件 //6.熙讯LED相关API XiXunLedProgram m_led = new XiXunLedProgram(); m_led.Call_CI_InitDLL(); string strPath = System.Environment.CurrentDirectory.Replace(@"\bin\Debug", @"\XiXunXmlFiles\demo.xml"); if (strPath == "") { return; } string strSave = System.IO.Path.GetDirectoryName(strPath); bool b = m_led.Call_CI_CompileProgram(strPath, strSave); } catch (ArgumentNullException e) { Console.WriteLine("ArgumentNullException: {0}", e); } catch (SocketException e) { Console.WriteLine("SocketException: {0}", e); } } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Net.Sockets;namespace HurysCommon{ public class SocketHelper { public const string _host = "127.0.0.1"; public const int _port = 2000; public static string _login = GetRequestXml("Login.xml"); public static string _error = GetRequestXml("Error.xml"); public static string _vms = GetRequestXml("Vms.xml"); public static string _page = GetRequestXml("Page.xml"); /// <summary> /// 客户端请求数据包 /// </summary> /// <returns></returns> public static string GetRequestXml(string fileName) { string path = System.Environment.CurrentDirectory.Replace(@"\bin\Debug", string.Format(@"\SITS_XML\{0}", fileName)); XmlDocument xml = XmlHelper.LoadXmlDocumentFromFile(path); if (!string.IsNullOrEmpty(xml.InnerXml)) { return xml.InnerXml; } return ""; } /// <summary> /// 服务器返回数据包 /// </summary> /// <returns></returns> public static string GetResponseXml(string sendStr, Socket socket) { if (!string.IsNullOrEmpty(sendStr)) { byte[] bs = Encoding.ASCII.GetBytes(sendStr); Console.WriteLine("Send Message"); socket.Send(bs, bs.Length, 0);//发送客户端请求 string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); return recvStr; } return ""; } }} 根本没有获取xml?你不先对第一次的返回做个判断,看第一次成功了没有,就发第二次? 看了你的另一个帖子:http://bbs.csdn.net/topics/390867307朋友们多少都指出了最大的问题。不过看你这个帖子的代码,你应该还不理解你的问题。翻译一下,Length中文为长度 加载地图数据时的效率问题 求助:如何获取msvb_lib_toolbar第n个按钮的状态 怎样加Try Catch语句 高分请教,如何结束线程。(从主线程中结束一个线程),问题解决马上给分。 如何新建Windows service项目 C#实现listview内文件的拖放,并且半透明图标跟随鼠标移动, c#如何实现压缩解压缩文件? 关于成生应用程序连接池的设置问题~ 微信自定义菜单提交中文就错误 Winform窗体设计界面,求知道的指点 c#中Rsa解密的问题 这种情况是不是用委托呢?
/// <summary>
/// 服务器返回数据包
/// </summary>
/// <returns></returns>
public static string GetResponseXml(string sendStr, Socket socket)
{
if (!string.IsNullOrEmpty(sendStr))
{
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
Console.WriteLine("Send Message");
socket.Send(bs, bs.Length, 0);//发送客户端请求
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
return recvStr;
}
return "";
}
以下是三次指令调用
//1.登录
SocketHelper.GetResponseXml(SocketHelper._login, socket); //2.读取用户对应的VMS配置
//SocketHelper.GetResponseXml(SocketHelper._vms, c); //3.读取所有显示页
SocketHelper.GetResponseXml(SocketHelper._page, socket);
1、用回车符分割,坏处就是xml数据里面不能有回车。
2、先发送一个长度,坏处就是数据流不再是纯粹的xml。最简单的就是直接用Http协议。也容易扩展为WebService(包括Restful Service)。
除非在方法里又重新new了
这就是全部代码了 参数里面sendStr就是不同的指令XML字符串。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using HurysCommon;
using System.Xml;namespace HurysDataConventTools
{
class Program
{
static void Main(string[] args)
{
//1.Socket Client端接收数据 使用TCP/IP协议 长连接 获取四通诱导平台节目参数信息 即XML数据
//2.建立对象存储熙讯节目XML数据,分析熙讯LED显示内容的XML格式数据,了解相关参数.例如显示内容,间隔时间,背景色等等
//3.获取四通诱导平台数据并且处理为熙讯LED数据格式.将四通诱导平台的参数和熙讯LED中的XML参数关联.
//4.初始化熙讯LED
//5.将数据制作成XML文件并且使用熙讯协议中的编译函数编译该XML文件,然后调用interface.dll中的通讯API发送显示内容
try
{
IPAddress ip = IPAddress.Parse(SocketHelper._host);
IPEndPoint ipe = new IPEndPoint(ip, SocketHelper._port);//把ip和端口转化为IPEndPoint实例
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipe);//连接到诱导平台服务器 //1.登录
SocketHelper.GetResponseXml(SocketHelper._login, socket); //2.读取用户对应的VMS配置
//SocketHelper.GetResponseXml(SocketHelper._vms, c); //3.读取所有显示页
SocketHelper.GetResponseXml(SocketHelper._page, socket); //4.解析四通诱导平台数据,并且赋值熙讯LED信息类 //5.建立熙讯LED所需节目XML字符串并且转换为XML文件 //6.熙讯LED相关API
XiXunLedProgram m_led = new XiXunLedProgram();
m_led.Call_CI_InitDLL();
string strPath = System.Environment.CurrentDirectory.Replace(@"\bin\Debug", @"\XiXunXmlFiles\demo.xml");
if (strPath == "")
{
return;
}
string strSave = System.IO.Path.GetDirectoryName(strPath);
bool b = m_led.Call_CI_CompileProgram(strPath, strSave);
} catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
} catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Net.Sockets;namespace HurysCommon
{
public class SocketHelper
{
public const string _host = "127.0.0.1";
public const int _port = 2000;
public static string _login = GetRequestXml("Login.xml");
public static string _error = GetRequestXml("Error.xml");
public static string _vms = GetRequestXml("Vms.xml");
public static string _page = GetRequestXml("Page.xml"); /// <summary>
/// 客户端请求数据包
/// </summary>
/// <returns></returns>
public static string GetRequestXml(string fileName)
{
string path = System.Environment.CurrentDirectory.Replace(@"\bin\Debug", string.Format(@"\SITS_XML\{0}", fileName));
XmlDocument xml = XmlHelper.LoadXmlDocumentFromFile(path);
if (!string.IsNullOrEmpty(xml.InnerXml))
{
return xml.InnerXml;
}
return "";
} /// <summary>
/// 服务器返回数据包
/// </summary>
/// <returns></returns>
public static string GetResponseXml(string sendStr, Socket socket)
{
if (!string.IsNullOrEmpty(sendStr))
{
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
Console.WriteLine("Send Message");
socket.Send(bs, bs.Length, 0);//发送客户端请求
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
return recvStr;
}
return "";
}
}
}
你不先对第一次的返回做个判断,看第一次成功了没有,就发第二次?
朋友们多少都指出了最大的问题。
不过看你这个帖子的代码,你应该还不理解你的问题。
翻译一下,Length中文为长度