Пример #1
0
        /// <summary>
        /// 心跳包发送线程
        /// </summary>
        public static void socketSend()
        {
            int i = 0;

            while (true)
            {
                Thread.Sleep(2000);
                try
                {
                    Console.WriteLine("发送心跳包");
                    List <DownloadFile> files = new List <DownloadFile>();
                    foreach (TorrentManager manager in torrents)
                    {
                        DownloadFile downloadFile = new DownloadFile(manager.State.ToString(), manager.Torrent == null ? "MetaDataMode" : manager.Torrent.Name, manager.Monitor.DownloadSpeed / 1024.0, manager.Monitor.UploadSpeed / 1024.0, manager.Progress);
                        files.Add(downloadFile);
                    }
                    PCKeepAlivePacket loginReq = new PCKeepAlivePacket
                    {
                        keepAliveType = PCKeepAlivePacket.KeepAliveType.SUCCESS,
                        data          = JsonConvert.SerializeObject(files),
                    };
                    MemoryStream ms = new MemoryStream();
                    Serializer.Serialize(ms, loginReq);
                    byte[] data = ms.ToArray();
                    byte[] Buff = NetTcpBase.PackMessage((int)ENetworkMessage.PC_KEEP_ALIVE, LittleEndian.GetLittleEndianBytes(1), data);
                    bw.Write(Buff, 0, Buff.Length);
                    bw.Flush();
                }
                catch (SocketException)
                {
                    Thread.CurrentThread.Abort();
                    //throw ex;
                }
            }
        }
Пример #2
0
        /// <summary>
        /// 连接中转服务器
        /// </summary>
        private static void connectServer()
        {
            byte[]     buf = new byte[1024];
            string     input;
            IPAddress  local = IPAddress.Parse("127.0.0.1");
            IPEndPoint iep   = new IPEndPoint(local, 13333);

            try
            {
                tcpClient = new TcpClient();
                tcpClient.Connect("127.0.0.1", 13333);
                Console.WriteLine("开始连接服务器");
                ns = tcpClient.GetStream();
            }
            catch (SocketException)
            {
                Console.WriteLine("无法连接到服务器!");
                return;
            }
            bw = new BinaryWriter(ns);
            br = new BinaryReader(ns);
            //启动心跳发送线程
            Thread sendEcho = new Thread(new ThreadStart(socketSend));

            sendEcho.Start();
            sendEcho.IsBackground = true;
            //启动消息接收线程
            Thread receiveThread = new Thread(new ThreadStart(socketReceive));

            receiveThread.Start();
            receiveThread.IsBackground = true;
            //构造初始化请求报文
            P2PInitReq initReq = new P2PInitReq
            {
                msgFrom  = P2PInitReq.MsgFrom.PC,
                userName = user,
            };
            MemoryStream ms = new MemoryStream();

            Serializer.Serialize(ms, initReq);
            byte[] data = ms.ToArray();
            initBuff = NetTcpBase.PackMessage((int)ENetworkMessage.P2P_INIT_REQ, LittleEndian.GetLittleEndianBytes(1), data);
            Thread.Sleep(5000);
            init(bw, br, initBuff);
        }
Пример #3
0
        /// <summary>
        /// 消息接收线程
        /// </summary>
        private static void socketReceive()
        {
            while (true)
            {
                byte[] data1 = NetTcpBase.ReadFromServer(br);
                int    size  = LittleEndian.LittleEndianToInt32(data1, 0);
                int    type  = LittleEndian.LittleEndianToInt32(data1, 4);
                byte[] data2 = new byte[size - 12];
                Array.Copy(data1, 12, data2, 0, size - 12);
                MemoryStream ms1 = new MemoryStream(data2);
                switch (type)
                {
                case (int)ENetworkMessage.P2P_CONTROL_REQ:
                    P2PControlReq controlReq = Serializer.Deserialize <P2PControlReq>(ms1);
                    switch (controlReq.command)
                    {
                    case P2PControlReq.Command.START:
                        foreach (TorrentManager manager in torrents)
                        {
                            if (manager.Torrent.Name == controlReq.filename)
                            {
                                manager.Start();
                            }
                        }
                        break;

                    case P2PControlReq.Command.STARTALL:
                        engine.StartAll();
                        break;

                    case P2PControlReq.Command.STOP:
                        foreach (TorrentManager manager in torrents)
                        {
                            if (manager.Torrent.Name == controlReq.filename)
                            {
                                manager.Stop();
                            }
                        }
                        break;

                    case P2PControlReq.Command.STOPALL:
                        engine.PauseAll();
                        break;

                    default:
                        break;
                    }
                    break;

                case (int)ENetworkMessage.P2P_INIT_RSP:
                    P2PInitRsp result = Serializer.Deserialize <P2PInitRsp>(ms1);
                    switch (result.status)
                    {
                    case P2PInitRsp.Status.SUCCESS:
                        Console.WriteLine("初始化连接服务器成功!");
                        break;

                    case P2PInitRsp.Status.FAIL:
                        init(bw, br, initBuff);
                        Thread.Sleep(10000);
                        break;
                    }
                    break;
                }
            }
        }