/// <summary> /// 连接服务器 /// </summary> /// <param name="_ip">IP地址</param> /// <param name="_port">端口号</param> /// <returns>成功返回true, 否则返回false</returns> public bool ConnectServer(string _IP, int _port) { IP = _IP; PORT = _port; IPAddress ip = IPAddress.Parse(_IP); IPEndPoint ipe = new IPEndPoint(ip, _port); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); if (sock == null) { return(false); } try { sock.Connect(ipe); } catch (Exception se) { JHLog.forMarketLog("连接行情服务器失败!异常code:" + se.Message); return(false); } jhMarket.OnConnectMarket(); return(true); }
/// <summary> /// 登陆行情服务器 /// </summary> /// <param name="_username">用户名称</param> /// <param name="_password">密码</param> /// <param name="_callbackIP">回掉的IP地址</param> /// <returns></returns> public bool Login(string _username, string _password, string _callbackIP) { UserName = _username; Password = _password; CallbackIP = _callbackIP; PDUHead pdh = new PDUHead(); pdh.setCommandId(PDUHead.JH_LOGIN); pdh.setStatus(0); pdh.setSvrTime(0); pdh.setTotalLength(PDUHead.PDU_HEAD_LEN + PDUHead.JH_LOGIN_LEN); byte[] head = pdh.ToByteArray(); byte[] body = pdh.LoginBody(_username, _password, _callbackIP); byte[] login = pdh.HeadAndBody(head, body); try { sock.Send(login); byte[] rspl = new byte[14]; int len = sock.Receive(rspl, PDUHead.PDU_HEAD_LEN, SocketFlags.None); if (len != PDUHead.PDU_HEAD_LEN) { JHLog.forMarketLog("登陆行情服务器失败!"); return(false); } PDUHead pDU = new PDUHead(); pDU.fromString(rspl); if (pDU.status != 0) { JHLog.forMarketLog("登陆行情服务器失败!"); return(false); } //登陆成功后消息推送给客户端 jhMarket.OnLogin(pDU.svrTime + ""); //启动行情接收线程 thread = new Thread(new ParameterizedThreadStart(ReceiveThread)); thread.Start(this); return(true); }catch (Exception ex) { JHLog.forMarketLog("登陆行情服务器失败!" + ex.Message); return(false); } }
public void OnExceptionMessage(EnumStateFlag sf, string _exMsg) { //写入日志 if (sf == EnumStateFlag.行情请求 || sf == EnumStateFlag.行情回报) { JHLog.forMarketLog(_exMsg); } else if (sf == EnumStateFlag.交易请求 || sf == EnumStateFlag.交易回报) { JHLog.forTradeLog(_exMsg); } //打印到控制台 if (printMsg != null) { printMsg.Print(_exMsg); } }
// 启动交易 public void InitInstance() { try { trade_login_ok = false; IsTradeNo = false; if (manageMarket != null) { manageMarket.ForFreeConnectMarket(); } manageMarket = new ManageMarket(this); bool IsConnect = manageMarket.ForConnectMarket(market_addr, int.Parse(market_port)); if (IsConnect == false) { manageMarket.ForMarketFreeConnect(); manageMarket = null; } }catch (Exception ex) { JHLog.forMarketLog("连接行情服务器异常!" + ex.ToString()); throw new JHMarketException("连接行情服务器异常!"); } }
/// <summary> /// 线程处理函数 如果登陆成功后用来接收行情 /// </summary> /// <param name="obj"></param> public static void ReceiveThread(object obj) { SocketWorker sw = ((SocketWorker)obj); Socket sock = sw.getSocket(); byte[] bufferArr = new byte[2 * 1024]; //包体 byte[] PDUHeadArr = new byte[PDUHead.PDU_HEAD_LEN]; //数据长度 int totalLen = 0; //实际数据长度,初始为0 int readLen = 0; //读取的长度 try { for (; sock.Connected;) { //初始化缓存 Array.Clear(PDUHeadArr, 0, PDUHeadArr.Length); Array.Clear(bufferArr, 0, bufferArr.Length); //接收包头数据 int headBuf = PDUHead.PDU_HEAD_LEN; int headLeft = PDUHead.PDU_HEAD_LEN; int headOffset = 0; while (sock.Connected && headLeft > 0) { readLen = sock.Receive(PDUHeadArr, headOffset, headLeft, SocketFlags.None); if (readLen < 0) { throw new MarketException("接收行情包头数据异常!"); } if (readLen == 0) { break; } headOffset += readLen; headLeft -= readLen; } //判断接收的数据长度是否有误 readLen = headBuf - headLeft; //抛出异常 if (readLen != PDUHead.PDU_HEAD_LEN) { throw new MarketException("接收行情包头数据异常!"); } //解析头信息 PDUHead phed = PDUHead.byteToPDUHead(PDUHeadArr); //查看缓存区大小是否够用。 totalLen = phed.totalLength; if (totalLen > bufferArr.Length) { bufferArr = new byte[totalLen]; } //接收包体数据 int bodyBuf = totalLen - PDUHead.PDU_HEAD_LEN; int bodyLeft = totalLen - PDUHead.PDU_HEAD_LEN; int bodyOffset = 0; while (sock.Connected && bodyLeft > 0) { readLen = sock.Receive(bufferArr, bodyOffset, bodyLeft, SocketFlags.None);//读取socket数据 if (readLen < 0) { throw new MarketException("接收行情包体数据异常!"); } if (readLen == 0) { break; } bodyLeft -= readLen; bodyOffset += readLen; } readLen = bodyBuf - bodyLeft; //抛出异常 if (readLen != totalLen - PDUHead.PDU_HEAD_LEN) { throw new MarketException("接收行情包体数据异常!"); } //查看接收数据是否是行情数据 if (phed.commandId == PDUHead.JH_REALTRADEINFO) { Tick tck = Tick.byteToTick(bufferArr); if (tck == null) { throw new MarketException("解析行情数据包异常!"); } sw.GetJHMarket().ReturnTick(tck); sw.GetJHMarket().OnHeartTest(phed.svrTime); continue; } //查看数据是否是心跳数据 if (phed.commandId == PDUHead.JH_ACTIVETEST) { sw.GetJHMarket().OnHeartTest(phed.svrTime); continue; } } //异常 }catch (MarketException me) { sw.GetJHMarket().OnError("error@" + "Socket Worker Thread," + me.Message); JHLog.forMarketLog("Socket Worker Thread," + me.ToString()); return; } catch (Exception ex) { JHLog.forMarketLog("Socket Worker Thread," + ex.ToString()); return; } }