首页 新闻 会员 周边

c# scoket客户端请求问题

0
悬赏园豆:5 [已解决问题] 解决于 2014-11-19 13:16

最近开始学习和使用c# socket来实现一个功能需求.因为之前一直都从事B/S方向的研发工作,所以socket算是新手.
需求是这样的,我编写一个socket客户端程序,监听服务端。
并且给服务端发送不同的指令获取服务器返回信息进行数据处理.

我目前已经搭建了一个基本框架,但是有一些疑问不太明白.不知道我代码该如何修改.

首先,我必须给服务器发送一段登录指令,返回成功信息以后,发送其他指令。如何确保我的登录只发送一次请求?其他的循环发送,前辈们请看我的代码?该如何修改.

 

说明一下 这个程序是要保持一个长连接状态的。

下面是完整代码,保存即可运行.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using HurysCommon;
using System.Xml;
using System.Configuration;
using HurysModel;

namespace HurysDataConventTools
{
class Program
{
static void Main(string[] args)
{
try
{
//1.建立Socket实例,连接四通诱导平台
IPAddress ip = IPAddress.Parse(SocketHelper._host);
IPEndPoint ipe = new IPEndPoint(ip, SocketHelper._port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine(ip + " Connecting...................");
socket.Connect(ipe);
Console.WriteLine(ip + " Connected...................");


//2.发送登录请求
string sendStr = SocketHelper._login;
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
Console.WriteLine("Send Login Requst...................");
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);
Console.WriteLine("Client Get Message:{0}", recvStr);//显示服务器返回信息

while (true)
{
if (recvStr.Equals("1"))
{
//3.获取VMS信息
SocketHelper.GetResponseXml(socket, SocketHelper._vms, "VMS", bs, ref recvStr, recvBytes, bytes);
if (recvStr.Equals("2"))
{
//4.获取指定VMS合成后的新的显示页信息
SocketHelper.GetResponseXml(socket, SocketHelper._page, "Page", bs, ref recvStr, recvBytes, bytes);

if (recvStr.Equals("3"))
{
//5.解析四通诱导平台数据,并且赋值熙讯LED信息类

//6.建立熙讯LED所需节目XML字符串并且转换为XML文件
//XmlDocument XXXml = SocketHelper.GetXiXunLedXml();
//XmlNodeList nodes = XXXml.SelectNodes("Program");
//foreach (XmlNode node in nodes)
//{
// node.Attributes["IPAddress"].Value = "127.0.0.2";
//}
//XXXml.Save("test.xml");

//IntPtr handle = new IntPtr(1);//获取句柄
//XiXunLedProgram m_led = new XiXunLedProgram();
//InterfaceDll m_interface = new InterfaceDll(handle, "");

//m_led.Call_CI_InitDLL();
//m_interface.Call_DLL_Net_Init();
//m_interface.InitCallBackFunc();

//string strPath = System.Environment.CurrentDirectory.Replace(@"\bin\Debug", @"\XiXunXmlFiles\demo.xml");
//if (strPath == "")
//{
// return;
//}
////7.编译节目参数
//string strSave = System.IO.Path.GetDirectoryName(strPath);
//bool b = m_led.Call_CI_CompileProgram(strPath, strSave);
//if (b)
//{
// //8.发送节目
// //m_interface.Call_DLL_Net_SendProgramToPanel("127.0.0.3", 2000, strPath, new IntPtr(127));
//}
}
else
{
Console.WriteLine("Client Get Message:{0}", recvStr);//显示错误信息
continue;
}

}
else
{
Console.WriteLine("Client Get Message:{0}", recvStr);//显示错误信息
continue;
}
}
else
{
Console.WriteLine("Client Get Message:{0}", recvStr);//显示登陆错误信息
continue;
}
}
}

catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}

catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}

}
}
}

 

-------这个是socketHelper类

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Net.Sockets;
using System.Collections;
using System.Configuration;
using System.Net;
namespace HurysCommon
{
public class SocketHelper
{
public static string _host = ConfigurationManager.AppSettings["host"].ToString();
public static int _port = CommonFun.StrToInt(ConfigurationManager.AppSettings["port"].ToString());
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>
/// 定义熙讯LED XML数据格式
/// </summary>
/// <returns></returns>
public static XmlDocument GetXiXunLedXml()
{
string path = System.Environment.CurrentDirectory.Replace(@"\bin\Debug", string.Format(@"\NewFolder1\XMLFile1.xml"));
XmlDocument xml = XmlHelper.LoadXmlDocumentFromFile(path);
return xml;
}

/// <summary>
/// 获取服务器返回XML
/// </summary>
/// <param name="socket"></param>
/// <param name="sendStr"></param>
/// <param name="type"></param>
/// <param name="bs"></param>
/// <param name="recvStr"></param>
/// <param name="recvBytes"></param>
/// <param name="bytes"></param>
/// <returns></returns>
public static string GetResponseXml(Socket socket, string sendStr, string type, byte[] bs, ref string recvStr, byte[] recvBytes, int bytes)
{
bs = Encoding.ASCII.GetBytes(sendStr);
Console.WriteLine("Send {0} Requst...................", type);
socket.Send(bs, bs.Length, 0);//发送请求
recvStr = "";
recvBytes = new byte[1024];
bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("Client Get Message:{0}", recvStr);//显示服务器返回信息
return recvStr;
}
}
}

何小宝的主页 何小宝 | 初学一级 | 园豆:19
提问于:2014-09-13 11:52
< >
分享
最佳答案
0

登录成功是什么标志?你判断这个标志就行了。

收获园豆:5
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-09-14 13:55
其他回答(1)
0

Server端在Listen后while(true)接收Client端请求

jello chen | 园豆:7306 (大侠五级) | 2014-09-13 12:09

现在服务端已经被编写好了,我使用telnet发送一样的指令 就是一个指令包 服务器返回对应的数据包

 

只不过我请求这里还不是很明白 我只想客户端登录请求一次 成功后  其他的请求指令循环发送

支持(0) 反对(0) 何小宝 | 园豆:19 (初学一级) | 2014-09-13 12:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册