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; } } } }
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(); } } } }
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; } }
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); } }