private void ReceiveMessage(IMClassLibrary.SingleChatDataPackage data) { PersonMessage msg; int i = 0; for (; i < list.Count; i++) { msg = (PersonMessage)list[i]; if (msg.Person == data.Sender) { msg.Message += data; break; } } //存在此联系人,增加聊天数据 if (i == list.Count) { msg = new PersonMessage(); msg.Person = data.Sender; msg.Message += data; list.Add(msg); ListBoxItem item = new ListBoxItem(); item.Content = msg.Person; listBox.Items.Add(item); } //未存在此联系人,增加新联系人与聊天数据 }
} //修改FriendListView的方法 private void AddFriendButton_Click(object sender, RoutedEventArgs e) { bool isFind = myfriendIDAndNames.Any <friendIDAndName>(p => p.friendID == addFriendOO.Text); if (isFind) { MessageBox.Show("好友已在列表中"); return; } else { friendIDAndName IDAndName = new friendIDAndName(); IDAndName.friendID = addFriendOO.Text; IDAndName.friendName = addFriendOO.Text; myfriendIDAndNames.Add(IDAndName); return; } //未找到该ip与端口号,需要增加 TcpClient tcpClient; StateObject stateObject; tcpClient = new TcpClient(); //每次发送建立一个TcpClient类对象 stateObject = new StateObject(); ////每次发送建立一个StateObject类对象 stateObject.tcpClient = tcpClient; //stateObject.buffer = SendMsg; //stateObject.friendIDAndName = friendIDAndName.friendID + ":" + friendIDAndName.friendName; //所选好友IP和端口号 IMClassLibrary.SingleChatDataPackage chatData = new IMClassLibrary.SingleChatDataPackage(UserID, IPAndPort, "添加您为好友", UserID, addFriendOO.Text); stateObject.buffer = chatData.DataPackageToBytes(); //buffer为发送的数据包的字节数组 tcpClient.BeginConnect(LoginIP, int.Parse(LoginPort), new AsyncCallback(SentCallBackF), stateObject); //异步连接 //发送添加好友信息 }
//侦听线程执行的方法 private string ListenThreadMethod() { //IPAddress ip = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0); var newClient = tcpListener.AcceptTcpClient(); var receiveByte = ReadFromTcpClient(newClient); var messageClass = new IMClassLibrary.SingleChatDataPackage(receiveByte); newClient.Close(); return(messageClass.Message); }
} //侦听线程执行的方法 public void readRevMsg(TcpClient tcpClient) { byte[] bytes = ReadFromTcpClient(tcpClient); //获取chatData friendIDAndName friendIDAndName = new friendIDAndName(); IMClassLibrary.ChatDataPackage chatData = new IMClassLibrary.ChatDataPackage(bytes); string message = string.Empty; switch (chatData.MessageType) { case 4: //单人聊天数据包 IMClassLibrary.SingleChatDataPackage chatData1 = new IMClassLibrary.SingleChatDataPackage(bytes); friendIDAndName.friendID = chatData1.Receiver.Split(':')[0]; friendIDAndName.friendName = chatData1.Receiver.Split(':')[1]; message = chatData1.Receiver + "(用户ID:" + chatData1.Sender + ")(" + chatData1.sendTime.ToString() + ")说:" + chatData1.Message; break; case 5: //多人聊天数据包 IMClassLibrary.MultiChatDataPackage chatData2 = new IMClassLibrary.MultiChatDataPackage(bytes); friendIDAndName.friendID = chatData2.Receiver.Split(':')[0]; friendIDAndName.friendName = chatData2.Receiver.Split(':')[1]; message = chatData2.Receiver + "(用户ID:" + chatData2.SenderID + ",来自群聊" + chatData2.Sender.ToString() + ")(" + chatData2.sendTime.ToString() + ")说:" + chatData2.Message; break; case 7: //文件传输数据包 IMClassLibrary.FileDataPackage chatData3 = new IMClassLibrary.FileDataPackage(bytes); FileList.Add(chatData3); //加入List中待下载 friendIDAndName.friendID = chatData3.Receiver.Split(':')[0]; friendIDAndName.friendName = chatData3.Receiver.Split(':')[1]; message = chatData3.Receiver + "(用户ID:" + chatData3.Sender + ")(" + chatData3.sendTime.ToString() + ")给你发了一个文件,请接收"; break; default: MessageBox.Show("聊天数据包读取失败"); return; } //UnicodeEncoding ascii = new UnicodeEncoding(); //string s = ascii.GetString(bytes); //int i1 = s.IndexOf(":"); //第一个: //int i2 = s.IndexOf(":", i1 + 1); //第二个: //friendIDAndName.friendID = s.Substring(0, i1); //提取IP字符串 //friendIDAndName.friendName = s.Substring(i1 + 1, i2 - i1 - 2); //提取端口字符串 int k = myfriendIDAndNames.IndexOf(friendIDAndName); if (k == -1) { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetList(SetListViewSource), friendIDAndName); } //未找到该ip与端口号,需要增加 if (message != string.Empty) { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new OneArgDelegate(SetFriendListBox), message); //接受信息在FriendListBox显示 } } //被异步调用的方法
} //修改FriendListView的方法 private void AddFriendButton_Click(object sender, RoutedEventArgs e) { IPAddress myFriendIpAdress; if (IPAddress.TryParse(addFriendIPTextBox.Text, out myFriendIpAdress) == false) { MessageBox.Show("IP地址格式不正确!"); return; } int myFriendPort; if (int.TryParse(addFriendPortTextBox.Text, out myFriendPort) == false) { MessageBox.Show("端口号格式不正确!"); return; } else { if (myFriendPort < 1024 || myFriendPort > 65535) { MessageBox.Show("端口号范围不正确!(1024-65535)"); return; } } FriendIPAndPort friendIPAndPort = new FriendIPAndPort(); friendIPAndPort.friendIP = addFriendIPTextBox.Text; //IP字符串 friendIPAndPort.friendPort = addFriendPortTextBox.Text; //端口字符串 int k = myFriendIPAndPorts.IndexOf(friendIPAndPort); if (k == -1) { myFriendIPAndPorts.Add(friendIPAndPort); } //未找到该ip与端口号,需要增加 else { MessageBox.Show("好友已在列表中"); return; } TcpClient tcpClient; StateObject stateObject; tcpClient = new TcpClient(); //每次发送建立一个TcpClient类对象 stateObject = new StateObject(); ////每次发送建立一个StateObject类对象 stateObject.tcpClient = tcpClient; //stateObject.buffer = SendMsg; stateObject.friendIPAndPort = friendIPAndPort.friendIP + ":" + friendIPAndPort.friendPort; //所选好友IP和端口号 IMClassLibrary.SingleChatDataPackage chatData = new IMClassLibrary.SingleChatDataPackage(UserID, IPAndPort, "添加您为好友"); stateObject.buffer = chatData.DataPackageToBytes(); //buffer为发送的数据包的字节数组 tcpClient.BeginConnect(friendIPAndPort.friendIP, myFriendPort, new AsyncCallback(SentCallBackF), stateObject); //异步连接 //发送添加好友信息 }
public void SendMessageTo(string IP, string port, string message) { TcpClient tcpClient; StateObject stateObject; tcpClient = new TcpClient(); //每次发送建立一个TcpClient类对象 stateObject = new StateObject(); ////每次发送建立一个StateObject类对象 stateObject.tcpClient = tcpClient; //stateObject.buffer = SendMsg; stateObject.friendIPAndPort = IP + ":" + port; //所选好友IP和端口号 var chatData = new IMClassLibrary.SingleChatDataPackage("Server", "Server", message, "Server", "Server"); stateObject.buffer = chatData.DataPackageToBytes(); //buffer为发送的数据包的字节数组 tcpClient.BeginConnect(IP, int.Parse(port), new AsyncCallback(SentCallBackF), stateObject); }
public delegate void ReadDataF(TcpClient tcpClient); //代表无返回值 Tcpclient参数方法 private void SendMessageButton_Click(object sender, RoutedEventArgs e) { if (SendMessageTextBox.Text == "") { MessageBox.Show("发送信息不能为空"); return; } //是否输入了发送信息 if (FriendListView.SelectedItems.Count == 0) { MessageBox.Show("请选择好友OO号"); return; } //是否选择发送好友 friendIDAndName[] myIPAndPorts = new friendIDAndName[FriendListView.SelectedItems.Count]; for (int i = 0; i < myIPAndPorts.Length; i++) { myIPAndPorts[i] = (friendIDAndName)FriendListView.SelectedItems[i]; } //得到所有要发送的好友IP和端口号 //string s = IPAndPort + "说:" + SendMessageTextBox.Text; //要发送的字符串 //UnicodeEncoding ascii = new UnicodeEncoding(); //以下将字符串转换为字节数组 //int n = (ascii.GetBytes(s)).Length; //byte[] SendMsg = new byte[n]; //SendMsg = ascii.GetBytes(s); string ip = null; //记录好友端IP int port = 0; //记录好友端端口号 TcpClient tcpClient; StateObject stateObject; IMClassLibrary.SingleChatDataPackage chatData = null; for (int i = 0; i < myIPAndPorts.Length; i++) { tcpClient = new TcpClient(); //每次发送建立一个TcpClient类对象 stateObject = new StateObject(); ////每次发送建立一个StateObject类对象 stateObject.tcpClient = tcpClient; //stateObject.buffer = SendMsg; //ip = myIPAndPorts[i].friendID; //所选好友IP地址字符串 ip = LoginIP; //port = int.Parse(myIPAndPorts[i].friendName); //所选字符串好友端口号转换为数字 port = int.Parse(LoginPort); stateObject.friendIDAndName = ip + ":" + port.ToString(); //所选好友IP和端口号 chatData = new IMClassLibrary.SingleChatDataPackage(UserID, IPAndPort, SendMessageTextBox.Text, UserID, myIPAndPorts[i].friendID); stateObject.buffer = chatData.DataPackageToBytes(); //buffer为发送的数据包的字节数组 tcpClient.BeginConnect(ip, port, new AsyncCallback(SentCallBackF), stateObject); //异步连接 } //给选定所有好友发信息 FriendListBox.Items.Add(UserID + "(本机)(" + chatData.sendTime.ToString() + ")说:" + SendMessageTextBox.Text); //显示已发送的信息 }
ArrayList list = new ArrayList(); //消息列表 private void button_SendMessage_Click(object sender, RoutedEventArgs e) { IMClassLibrary.SingleChatDataPackage singleChatDataPackage = new IMClassLibrary.SingleChatDataPackage(UserID, "wuxia", ChatBox.Text); //初始化单人聊天数据包 Byte[] sendBytes = singleChatDataPackage.DataPackageToBytes(); //单人聊天数据包转化为字节数组 }
public void GroupPortListener() { //IPAddress ip = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);//服务器端ip IPAddress ip = IPAddress.Parse("127.0.0.1"); var nowEnterPort = 0; bool canTurnPortToInt = int.TryParse(nowTextBoxText, out nowEnterPort); var myListener = new TcpListener(ip, nowEnterPort); //创建TcpListener实例 myListener.Start(); //start var newClient = new TcpClient(); var group = new ArrayList(); while (true) { try { newClient = myListener.AcceptTcpClient(); //等待客户端连接 } catch { if (newClient == null) { return; } } try { byte[] receiveBytes = ReadFromTcpClient(newClient); var userMessage = new IMClassLibrary.SingleChatDataPackage(receiveBytes); bool isNewUser = true; for (int i = 0; i < group.Count; ++i) { var t = (GroupUserStruct)group[i]; if (t.IP == userMessage.Receiver && t.userID == userMessage.Sender) { TcpClient tcpClient; StateObject stateObject; for (int j = 0; j < group.Count; ++j) { if (i == j) { continue; } var send = (GroupUserStruct)group[j]; tcpClient = new TcpClient(); //每次发送建立一个TcpClient类对象 stateObject = new StateObject(); ////每次发送建立一个StateObject类对象 stateObject.tcpClient = tcpClient; //stateObject.buffer = SendMsg; stateObject.friendIPAndPort = send.IP; //所选好友IP和端口号 var chatData = new IMClassLibrary.MultiChatDataPackage(nowEnterPort.ToString(), userMessage.Receiver, userMessage.Message, "Server", "Server"); chatData.SenderID = userMessage.Sender; chatData.MessageType = 5; stateObject.buffer = chatData.DataPackageToBytes(); //buffer为发送的数据包的字节数组 string[] SplitStr = send.IP.Split(':'); tcpClient.BeginConnect(SplitStr[0], int.Parse(SplitStr[1]), new AsyncCallback(SentCallBackF), stateObject); //异步连接 } isNewUser = false; break; } } if (isNewUser == true) { var newGroupuserStruct = new GroupUserStruct(); newGroupuserStruct.userID = userMessage.Sender; newGroupuserStruct.IP = userMessage.Receiver; group.Add(newGroupuserStruct); } } catch { break; } } }
} //不在主线程执行 private void AcceptClientConnect() { //IPAddress ip = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);//服务器端ip IPAddress ip = IPAddress.Parse("127.0.0.1"); try { myListener = new TcpListener(ip, nowEnterPort); //创建TcpListener实例 myListener.Start(); //start } catch { MessageBox.Show("TcpListener创建失败,请更改端口号或检查计算机网络!"); Close(); return; } var newClient = new TcpClient(); while (true) { try { newClient = myListener.AcceptTcpClient(); //等待客户端连接 } catch { if (newClient == null) { return; } } try { var IP = newClient.Client.RemoteEndPoint.ToString(); byte[] receiveBytes = ReadFromTcpClient(newClient); int type = 0; using (MemoryStream ms = new MemoryStream(receiveBytes)) { IFormatter formatter = new BinaryFormatter(); var DataPackage = formatter.Deserialize(ms) as IMClassLibrary.DataPackage; if (DataPackage == null) { MessageBox.Show("接收数据非数据包"); continue; } type = DataPackage.MessageType; } if (type == 0) { MessageBox.Show("数据包非法"); continue; } switch (type) { case 1: { var LogIn = new IMClassLibrary.LoginDataPackage(receiveBytes); if (LogIn.Receiver == "Server_Reg") { var newUser = new UserClass(LogIn.UserID, LogIn.Password); bool CanResiger = true; foreach (UserClass nowUser in user) { if (nowUser.userId == newUser.userId) { CanResiger = false; break; } } if (CanResiger == false) { SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "注册失败"); } else { user.Add(newUser); SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "注册成功"); /////////////////////////// } continue; } bool SuccessLogin = false; for (int i = 0; i < user.Count; ++i) { var nowUser = (UserClass)user[i]; if (LogIn.UserID == nowUser.userId && LogIn.Password == nowUser.password) { SuccessLogin = true; nowUser.isOnline = true; } user[i] = nowUser; } if (SuccessLogin == false) { SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "登录失败"); continue; } else { SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "登录成功"); continue; } } break; case 2: { var LogOut = new IMClassLibrary.LogoutDataPackage(receiveBytes); for (int i = 0; i < user.Count; ++i) { var t = (UserClass)user[i]; if (t.userId == LogOut.UserID) { t.isOnline = false; user[i] = t; break; } } } break; case 3: { MessageBox.Show("发送了父类聊天数据包"); } break; /* * case 4: { * var message = new IMClassLibrary.SingleChatDataPackage(receiveBytes); * var receiver = message.Receiver; * foreach (UserClass nowUser in user) { * if (receiver == nowUser.userId) { * nowUser.message.Add(message); * break; * } * } * } * break; */ case 5: { var message = new IMClassLibrary.SingleChatDataPackage(receiveBytes); var receiver = message.Receiver; foreach (UserClass nowUser in user) { if (receiver == nowUser.userId) { //nowUser.message.Add(message); break; } } } break; /* * case 6: { * var message = new IMClassLibrary.ChangeNameDataPackage(receiveBytes); * var receiver = message.Receiver; * foreach (UserClass nowUser in user) { * if (receiver == nowUser.userId) * nowUser.name = message.Name; * else * nowUser.message.Add(message); * } * } * break; */ } } catch { break; } } }