private async void Run() { byte[] buffer; while (true) { buffer = await client.Receive(remotePoint); object msgObj = FormatterHelper.Deserialize(buffer); Type msgType = msgObj.GetType(); if (msgType == typeof(ListUserResponseMessage)) { // 转换消息 ListUserResponseMessage usersMsg = (ListUserResponseMessage)msgObj; // 更新用户列表 userList.Clear(); foreach (User user in usersMsg.UserList) { userList.Add(user); } this.DisplayUsers(userList); } else if (msgType == typeof(PingMessage)) { // 转换消息 PingMessage purchReqMsg = (PingMessage)msgObj; // 发送打洞消息到远程主机 TrashMessage trashMsg = new TrashMessage(); buffer = FormatterHelper.Serialize(trashMsg); client.Send(buffer, buffer.Length, purchReqMsg.RemotePoint); } else if (msgType == typeof(P2PTextMessage)) { // 转换消息 P2PTextMessage workMsg = (P2PTextMessage)msgObj; Console.WriteLine("Receive a message: {0}", workMsg.Message); // 发送应答消息 P2PAckMessage ackMsg = new P2PAckMessage(); buffer = FormatterHelper.Serialize(ackMsg); client.Send(buffer, buffer.Length, remotePoint); } else if (msgType == typeof(P2PAckMessage)) { this.ReceivedACK = true; } else if (msgType == typeof(TrashMessage)) { Console.WriteLine("Recieve a trash message"); } Thread.Sleep(100); } }
public void ConnectToServer(string userName, string password) { myName = userName; // 发送登录消息到服务器 LoginMessage lginMsg = new LoginMessage(userName, password); byte[] buffer = FormatterHelper.Serialize(lginMsg); client.Send(buffer, buffer.Length, hostPoint); // 接受服务器的登录应答消息 buffer = client.Receive(ref remotePoint); ListUserResponseMessage srvResMsg = (ListUserResponseMessage)FormatterHelper.Deserialize(buffer); // 更新用户列表 userList.Clear(); foreach (User user in srvResMsg.UserList) { userList.Add(user); } this.DisplayUsers(userList); }
private async void Run() { byte[] buffer = null; while (true) { byte[] msgBuffer = await server.Receive(remotePoint); try { object msgObj = FormatterHelper.Deserialize(msgBuffer); Type msgType = msgObj.GetType(); if (msgType == typeof(LoginMessage)) { // 转换接受的消息 LoginMessage lginMsg = (LoginMessage)msgObj; Console.WriteLine("{0}: user {1} sign in.", System.DateTime.Now.ToString(), lginMsg.UserName); // 添加用户到列表 IPEndPoint userEndPoint = new IPEndPoint(remotePoint.Address, remotePoint.Port); User user = new User(lginMsg.UserName, userEndPoint); userList.Add(user); // 发送应答消息 ListUserResponseMessage usersMsg = new ListUserResponseMessage(userList); buffer = FormatterHelper.Serialize(usersMsg); server.Send(buffer, buffer.Length, remotePoint); Console.WriteLine("Send:" + usersMsg); } else if (msgType == typeof(LogoutMessage)) { // 转换接受的消息 LogoutMessage lgoutMsg = (LogoutMessage)msgObj; Console.WriteLine("{0}: {1} sign out", System.DateTime.Now.ToString(), lgoutMsg.UserName); // 从列表中删除用户 User lgoutUser = userList.Find(lgoutMsg.UserName); if (lgoutUser != null) { userList.Remove(lgoutUser); } } else if (msgType == typeof(TranslateMessage)) { // 转换接受的消息 TranslateMessage transMsg = (TranslateMessage)msgObj; Console.WriteLine("{0}(1) wants to p2p {2}", remotePoint.Address.ToString(), transMsg.UserName, transMsg.ToUserName); // 获取目标用户 User toUser = userList.Find(transMsg.ToUserName); // 转发Purch Hole请求消息 if (toUser == null) { Console.WriteLine("Remote host {0} cannot be found at index server", transMsg.ToUserName); } else { PingMessage transMsg2 = new PingMessage(remotePoint); buffer = FormatterHelper.Serialize(transMsg); server.Send(buffer, buffer.Length, toUser.NetPoint); Console.WriteLine("Send:" + transMsg2); } } else if (msgType == typeof(ListUserMessage)) { // 发送当前用户信息到所有登录客户 ListUserResponseMessage srvResMsg = new ListUserResponseMessage(userList); buffer = FormatterHelper.Serialize(srvResMsg); foreach (User user in userList.InnerList) { server.Send(buffer, buffer.Length, user.NetPoint); Console.WriteLine("Send:" + srvResMsg); } } Thread.Sleep(500); } catch (Exception e) { System.Console.WriteLine(e.Message); System.Console.WriteLine(e.StackTrace); } } }