http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 2777|回复: 1

[咨询站长] 关于c# socket的一个问题,希望坛主给点意见

[复制链接]
发表于 2014-9-14 11:35:06 | 显示全部楼层 |阅读模式
10金钱
问题描述:我最近刚学习和使用c# socket网络编程这一块.
需求:我需要编写一个socket客户端程序,来实时请求服务端,数据包格式是按照XML格式.即一个客户端指令包,服务端返回对应的XML数据包.

过程:socket这块主要分以下几步:
1.实例化socket
2.发送登录请求,服务器返回1,那么表示登录成功.
3.登录成功后,我发送第2条指令,服务器返回2那么表示获取数据成功.
4.返回2成功后,发送第3条指令,服务器返回最终的信息.

这些步骤都没问题。我想问的是,因为我的这个程序开启以后,是要一直监听并且发送请求包的,首先我想保证我登录成功以后,再第2次请求的时候直接从发送第2条指令开始,不需要重复登录.也就是登录成功后,只循环发送2-3请求。但是我现在在本地模拟这个工程。用一个调试工具模仿服务端.

我现在的代码有点问题。希望坛主能帮我看看,给点意见.我付费都可以的。我尊重他人劳动成果.

以下是完整代码:
首先是程序入口类的代码:
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);
                if (socket.Connected)
                {
                    Console.WriteLine(ip + " Connected...................");
                }
                while (true)
                {
                    //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);//显示服务器返回信息

                    if (recvStr.Equals("1"))
                    {
                        //3.获取VMS信息
                        SocketHelper.GetResponseXml(socket, SocketHelper._vms, "VMS", bs, ref recvStr, recvBytes, bytes);

                        //XmlDocument xml = XmlHelper.CreateXmlDocument(vmsInfoStr);
                        //XmlNode xnRoot = xml.SelectSingleNode(@"RESPONSE");
                        //XmlNodeList nodelist = xnRoot.ChildNodes;
                        //List<VMSInfo> vmsInfo = new List<VMSInfo>();
                        //foreach (XmlNode node in nodelist)
                        //{
                        //    if (node.LocalName.StartsWith("VMS"))
                        //    {
                        //        VMSInfo vmsItem = new VMSInfo();
                        //        vmsItem.Id = Convert.ToInt32(node.SelectSingleNode("ID").InnerXml);
                        //        vmsItem.NAME = node.SelectSingleNode("NAME").InnerXml;
                        //        vmsItem.VmsType = Convert.ToInt32(node.SelectSingleNode("VMSTYPE").InnerXml);
                        //        vmsItem.XPos = node.SelectSingleNode("XPOS").InnerXml;
                        //        vmsItem.YPos = node.SelectSingleNode("YPOS").InnerXml;
                        //        vmsInfo.Add(vmsItem);
                        //    }
                        //}

                        if (recvStr.Equals("2"))
                        {
                            //4.获取指定VMS合成后的新的显示页信息
                            //foreach (VMSInfo item in vmsInfo)
                            //{
                            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;
        }
    }
}



我已经加过坛主QQ  我QQ是331768317



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-9-15 09:51:24 | 显示全部楼层
思路:
1.客户端发起登录
2.服务器验证客户端发送的登录数据
3.服务器记录成功通过验证的客户端标识并返回标识该客户端已经登录的回执(Token之类的)
4.客户端接受并保存服务器返回的回执
5.客户端再发起其他操作的时候判断是否已经获取到回执,如果获取到回执则不执行登录请求,如果没有得到回执则需要执行登录请求

也就是说在你的发送登录请求的代码外侧包裹一个if条件判断是否已经登录过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-11 20:44

© 2014-2021

快速回复 返回顶部 返回列表