Ejemplo n.º 1
0
        private void button2_Click(object sender, EventArgs e)//点击"退出登录"按键,执行下线功能
        {
            InfoWindow Confirm = new InfoWindow("确认退出当前账号?", true);

            Confirm.StartPosition = FormStartPosition.CenterParent;
            Confirm.ShowDialog();
            if (Confirm.DialogResult == DialogResult.OK)//确认退出
            {
                Confirm.Close();
                TcpClient client = new TcpClient();
                try
                {
                    client.Connect(BasicInfo.ServerIp, BasicInfo.ServerPort);
                }
                catch
                {
                    InfoWindow Mes = new InfoWindow("服务器正忙\n 请稍等", false);
                    Mes.StartPosition = FormStartPosition.CenterParent;
                    Mes.Show();
                    return;
                }
                if (client.Connected)//连接成功发送下线请求
                {
                    NetworkStream ClientToServer = client.GetStream();
                    string        LoginInfo      = "logout" + BasicInfo.UserName;        //"logout"+学号
                    byte[]        send           = Encoding.Default.GetBytes(LoginInfo); //转化为字节流
                    ClientToServer.Write(send, 0, send.Length);                          //写入NetworkStream

                    byte[] msg      = new byte[1024];                                    //接收
                    int    length   = ClientToServer.Read(msg, 0, msg.Length);
                    string response = Encoding.Default.GetString(msg, 0, length);
                    Console.WriteLine(response);
                    if (response == "loo")//服务器返回成功下线信息
                    {
                        ClientToServer.Close();
                        client.Close();
                        InfoWindow Mes = new InfoWindow("下线成功!", false);
                        Mes.StartPosition = FormStartPosition.CenterParent;
                        Mes.ShowDialog();
                        if (Mes.DialogResult == DialogResult.Cancel)
                        {
                            System.Environment.Exit(0);//关闭所有进程
                        }
                    }
                    else
                    {
                        //InfoWindow Mes = new InfoWindow("服务器状态异常\n    请稍等", false);//提示信息好像会重复,这里不要了
                        //Mes.StartPosition = FormStartPosition.CenterParent;
                        //Mes.Show();
                        return;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        static void Logout()//下线功能,现已移植到ChatWindow中
        {
            InfoWindow Confirm = new InfoWindow("确认退出当前账号?", true);

            Confirm.StartPosition = FormStartPosition.CenterParent;
            Confirm.ShowDialog();
            if (Confirm.DialogResult == DialogResult.OK)
            {
                Confirm.Close();
                TcpClient client = new TcpClient();
                try
                {
                    client.Connect(BasicInfo.ServerIp, BasicInfo.ServerPort);
                }
                catch
                {
                    InfoWindow Mes = new InfoWindow("服务器无响应\n您已强制退出程序", false);
                    Mes.StartPosition = FormStartPosition.CenterParent;
                    Mes.Show();
                }
                if (client.Connected)
                {
                    NetworkStream ClientToServer = client.GetStream();
                    string        LoginInfo      = "logout" + BasicInfo.UserName;        //下线格式:"logout"+学号
                    byte[]        send           = Encoding.Default.GetBytes(LoginInfo); //将输入信息转化为byte字节流
                    ClientToServer.Write(send, 0, send.Length);                          //从networkstream中写入字节流
                    //接收
                    byte[] msg      = new byte[1024];
                    int    length   = ClientToServer.Read(msg, 0, msg.Length);
                    string response = Encoding.Default.GetString(msg, 0, length);
                    Console.WriteLine(response);
                    if (response == "loo")
                    {
                        ClientToServer.Close();
                        client.Close();
                        InfoWindow Mes = new InfoWindow("您已强制退出程序\n  下线成功!", false);
                        Mes.StartPosition = FormStartPosition.CenterParent;
                        Mes.ShowDialog();
                        if (Mes.DialogResult == DialogResult.Cancel)
                        {
                            System.Environment.Exit(0);
                        }                              //关闭所有进程
                    }
                    else
                    {
                        InfoWindow Mes = new InfoWindow("未成功下线!\n您已强制退出程序", false);
                        Mes.StartPosition = FormStartPosition.CenterParent;
                        Mes.Show();
                    }
                }
            }
        }
Ejemplo n.º 3
0
        private void sendfile(object file)//发起P2P连接发送文件
        {
            string FileName   = (string)file;
            string FriendName = FileName.Substring(0, 10);

            FileName = FileName.Substring(10);
            string     truefilename = FileName.Substring(FileName.LastIndexOf('\\') + 1);
            FileStream ReadStream   = new FileStream(FileName, FileMode.Open, FileAccess.Read);

            byte[] buffer       = new byte[1024];
            int    Packet       = 1024;
            int    TotalFileNum = (int)(ReadStream.Length + 1023) / 1024;

            if (TotalFileNum > 0)// 文件不为空
            {
                int pos = -1;
                for (int i = 0; i < MyFriendList.Count; i++)
                {
                    if (MyFriendList[i].Name == FriendName)
                    {
                        pos = i;
                        break;
                    }
                }
                QueryResult query = SearchIP(FriendName); //与发送消息基本相同
                while (true)                              //等待端口空闲
                {
                    pos = -1;
                    for (int i = 0; i < MyFriendList.Count; i++)
                    {
                        if (MyFriendList[i].Name == FriendName)
                        {
                            pos = i;
                            break;
                        }
                    }
                    if (pos > -1 || MyFriendList[pos].IsBusy == false)
                    {
                        break;
                    }
                    else
                    {
                        InfoLabel.Text = "端口正在占用,请稍等";
                    }
                }
                TcpClient NewClient = new TcpClient();
                MyFriendList[pos].IsBusy = true; //正在占用端口

                try                              //先尝试连接服务器
                {
                    int Port = int.Parse(FriendName.Substring(6)) + 10000;
                    NewClient.Connect(query.IP, Port);
                }
                catch//未连接成功
                {
                    Console.WriteLine("发起P2P连接失败");
                    return;
                }
                if (NewClient.Connected)
                {
                    NetworkStream PeerToPeer     = NewClient.GetStream();
                    byte[]        ConfirmMessage = Encoding.Default.GetBytes(BasicInfo.UserName);
                    string        response;
                    try
                    {
                        PeerToPeer.Write(ConfirmMessage, 0, ConfirmMessage.Length);//发送自己的名字,收到ACK时进行对话
                        byte[] ReturnMessage = new byte[20];
                        int    length        = PeerToPeer.Read(ReturnMessage, 0, ReturnMessage.Length);
                        response = Encoding.Default.GetString(ReturnMessage, 0, length);
                        Console.WriteLine(response);
                    }
                    catch
                    {
                        Console.WriteLine("发送P2P认证信息失败");
                        PeerToPeer.Close();
                        NewClient.Close();
                        return;
                    }
                    if (response == "ACK")//对方已经收到发出去的消息并加自己为好友
                    {
                        string temp = "[FileName]" + truefilename + "[Length]" + ReadStream.Length.ToString();
                        byte[] msg  = Encoding.Default.GetBytes(temp);
                        //Console.WriteLine(msg.Length);
                        PeerToPeer.Write(msg, 0, msg.Length);
                        PeerToPeer.WriteTimeout = 20000;
                        int fileLength = 0;
                        try
                        {
                            while (fileLength < ReadStream.Length)
                            {
                                this.Invoke(new EventHandler(delegate
                                {
                                    double percent = Convert.ToInt32(100.0 * fileLength / ReadStream.Length);
                                    InfoLabel.Text = "文件传输中..." + percent + "%";//显示文件传输进度
                                }));
                                Packet = ReadStream.Read(buffer, 0, buffer.Length);
                                PeerToPeer.Write(buffer, 0, Packet);
                                fileLength += Packet;
                            }
                            Console.WriteLine(fileLength.ToString() + "  " + ReadStream.Length.ToString());
                            this.Invoke(new EventHandler(delegate
                            {
                                InfoLabel.Text = "文件传输完成";
                            }));
                            ReadStream.Flush();//ReadStream.Flush();
                            PeerToPeer.Flush();
                            ReadStream.Close();
                        }
                        catch
                        {
                            InfoWindow Mes2 = new InfoWindow("文件传输失败", false);
                            Console.WriteLine("文件传输失败");
                            Mes2.StartPosition = FormStartPosition.CenterParent;
                            Mes2.Show();
                            return;
                        }
                        this.Invoke(new EventHandler(delegate
                        {
                            temp = "[文件][" + truefilename + "]";
                            UpdateChatPanel(BasicInfo.CurrentFriend, temp, DialogueType.MyText);//更新对话框显示
                        }));
                    }
                    PeerToPeer.Close();
                    NewClient.Close();
                }
                MyFriendList[pos].IsBusy = false;//释放端口
            }
            else
            {
                InfoWindow Mes2 = new InfoWindow("传输文件为空或过大", false);
                Mes2.StartPosition = FormStartPosition.CenterParent;
                Mes2.ShowDialog();
                return;
            }
        }
Ejemplo n.º 4
0
        private void ProcessFile(string FriendName, string receivedWords)//处理接收到的文件
        {
            NetworkStream PeerToPeer = client.GetStream();
            int           pos        = -1;

            for (int i = 0; i < MyFriendList.Count; i++)
            {
                if (MyFriendList[i].Name == FriendName)
                {
                    pos = i;
                    break;
                }
            }
            if (pos > -1)
            {
                bool   IsError = false;
                string message = receivedWords;

                int    posTemp  = message.IndexOf("[Length]");
                string FileName = message.Substring("[FileName]".Length, posTemp - "[FileName]".Length);//提取文件名
                Console.WriteLine("接收文件" + FileName);
                int    FileLength = int.Parse(message.Substring(posTemp + "[Length]".Length));
                string path       = ".\\" + BasicInfo.UserName;//存在当前目录下该用户名的文件夹下
                if (!Directory.Exists(path))
                {
                    DirectoryInfo directoryInfo = new DirectoryInfo(path);
                    directoryInfo.Create();
                }
                string FilePath = path + "\\" + FileName;

                FileStream WriteStream;//把接收的文件写到文件里
                try
                {
                    WriteStream = new FileStream(FilePath, FileMode.Create, FileAccess.Write);
                }
                catch
                {
                    Console.WriteLine("写入文件失败");
                    InfoWindow Mes = new InfoWindow("文件写入失败\n文件被占用", false)
                    {
                        StartPosition = FormStartPosition.CenterParent
                    };
                    Mes.Show();
                    return;
                }

                byte[] buffer       = new byte[2048];
                int    ReceiveBytes = 0;
                PeerToPeer.ReadTimeout = 20000;
                Console.WriteLine("正在接收文件");
                int ReceiveLength = 0;
                while (ReceiveLength < FileLength && !IsError)
                {
                    try
                    {
                        ReceiveBytes   = PeerToPeer.Read(buffer, 0, buffer.Length);
                        ReceiveLength += ReceiveBytes;
                        WriteStream.Write(buffer, 0, ReceiveBytes);//将字节写入文件
                    }
                    catch
                    {
                        IsError = true;//似乎提示框会报错,但是一般不会被触发
                        InfoWindow Mes = new InfoWindow("文件接收失败\n请稍后重试", false);
                        Mes.StartPosition = FormStartPosition.CenterParent;
                        Mes.Show();
                        return;
                    }
                }
                PeerToPeer.Flush();
                PeerToPeer.Close();
                if (!IsError)
                {
                    WriteStream.Flush();
                    WriteStream.Close();
                    this.Invoke(new EventHandler(delegate
                    {
                        string temp       = "[文件][" + FileName + "]";//显示在聊天框里
                        Friend TempFriend = UpdateChatPanel(FriendName, temp, DialogueType.PeerText);
                        Refresh(TempFriend);
                        if (Friend.PeopleCount == 1)
                        {
                            BasicInfo.CurrentFriend = FriendName;
                        }
                    }));
                }
            }
            else
            {
                UpdateChatPanel(FriendName, string.Empty);//添加好友对话后再处理文件
                ProcessFile(FriendName, receivedWords);
            }
        }