110,531
社区成员
发帖
与我相关
我的任务
分享
模拟代码:
ConnectionInfo connInfo = new ConnectionInfo("服务器IP", "服务器端口");
//客户端与服务器进行连接
Connection newTcpConnection = TCPConnection.GetConnection(connInfo);
//客户端与服务器连接成功后,开始监听本地端口,客户端也称为可以监听的服务器
TCPConnection.StartListening(connInfo.LocalEndPoint);
public static Dictionary<string, Connection> UserConnList = new Dictionary<string, Connection>();
public static void AddUserConn(string userID, Connection conn)
{
lock (dictLocker)
{
if (UserConnList.ContainsKey(userID))
{
UserConnList.Remove(userID);
}
UserConnList.Add(userID,conn);
}
}
public static bool ContainsUserConn(string userID)
{
lock (dictLocker)
{
if (UserConnList.ContainsKey(userID))
{
return true;
}
else
{
return false;
}
}
}
public static Connection GetUserConn(string userID)
{
lock(dictLocker)
{
if(UserConnList.ContainsKey(userID))
{
return UserConnList[userID];
}
else
{
return null;
}
}
}
public static void RemoveUserConn(string userID)
{
lock (dictLocker)
{
if (UserConnList.ContainsKey(userID))
{
UserConnList.Remove(userID);
}
}
}
private void GetP2PInfo()
{
//从服务器端,获取所有在线用户的信息 (用户ID,相对应的本地端点,在第一步中,客户端与服务器连接成功后,已经在此端点上开始监听了)
IList<UserIDEndPoint> userInfoList = Common.TcpConn.SendReceiveObject<IList<UserIDEndPoint>>("GetP2PInfo", "ResP2pInfo", 5000, "GetP2P");
//遍历所有的在线用户
foreach (UserIDEndPoint userInfo in userInfoList)
{
try
{
if (userInfo.UserID != Common.UserID)
{
//在根目录下写入日志
LogInfo.LogMessage("准备建立" + userInfo.UserID + ":" + userInfo.IPAddress + ":" + userInfo.Port.ToString(), "P2PInfo");
//创建连接信息类
ConnectionInfo connInfo = new ConnectionInfo(userInfo.IPAddress, userInfo.Port);
//把对方客户端当成服务器对应连接
Connection newTcpConnection = TCPConnection.GetConnection(connInfo);
Common.AddUserConn(userInfo.UserID, newTcpConnection);
SetUpP2PContract contract = new SetUpP2PContract();
contract.UserID = Common.UserID;
//P2p通道打通后,发送一个消息给对方用户,以便于对方用户收到消息后,建立P2P通道
newTcpConnection.SendObject("SetupP2PMessage", contract);
//在根目录下写入日志
LogInfo.LogMessage("已经建立" + userInfo.UserID + ":" + userInfo.IPAddress + ":" + userInfo.Port.ToString(), "P2PInfo");
}
}
catch
{
}
}
}
复制代码
private void chatControl1_BeginToSend(string content)
{
this.chatControl1.ShowMessage(Common.UserName, DateTime.Now, content, true);
//从客户端 Common中获取相应P2P通道
Connection p2pConnection = Common.GetUserConn(this.friendID);
if (p2pConnection != null)
{
ChatContract chatContract = new ChatContract();
chatContract.UserID = Common.UserID;
chatContract.UserName = Common.UserName;
chatContract.DestUserID = this.friendID;
chatContract.DestUserName = this.friendID;
chatContract.Content = content;
chatContract.SendTime = DateTime.Now;
p2pConnection.SendObject("ClientChatMessage", chatContract);
this.chatControl1.Focus();
LogInfo.LogMessage("通过p2p通道发送消息,当前用户ID为"+Common.UserID, "P2PINFO");
}
else
{
ChatContract chatContract = new ChatContract();
chatContract.UserID = Common.UserID;
chatContract.UserName = Common.UserName;
chatContract.DestUserID = this.friendID;
chatContract.DestUserName = this.friendID;
chatContract.Content = content;
chatContract.SendTime = DateTime.Now;
Common.TcpConn.SendObject("ChatMessage", chatContract);
this.chatControl1.Focus();
LogInfo.LogMessage("服务器转发消息", "P2PINFO");
}
}
private void UserStateNotify(string userID, bool onLine)
{
try
{
//用户状态契约类
UserStateContract userState = new UserStateContract();
userState.UserID = userID;
userState.OnLine = onLine;
IList<ShortGuid> allUserID;
lock (syncLocker)
{
//获取所有用户字典中的用户ID
allUserID = new List<ShortGuid>(userManager.Values);
}
//给所有用户发送某用户的在线状态
foreach (ShortGuid netID in allUserID)
{
List<Connection> result = NetworkComms.GetExistingConnection(netID, ConnectionType.TCP);
if (result.Count > 0 && result[0].ConnectionInfo.NetworkIdentifier == netID)
{
result[0].SendObject("UserStateNotify", userState);
}
}
}
catch (Exception ex)
{
LogTools.LogException(ex, "MainForm.UserStateNotify");
}
}
NetworkComms.AppendGlobalIncomingPacketHandler<UserStateContract>("UserStateNotify", IncomingUserStateNotify);
复制代码
private void IncomingUserStateNotify(PacketHeader header, Connection connection, UserStateContract userStateContract)
{
if (userStateContract.OnLine)
{
lock (syncLocker)
{
//此部分,处理用户上线,与P2p通道无关
Common.GetDicUser(userStateContract.UserID).State = OnlineState.Online;
}
}
else
{
lock (syncLocker)
{
Common.GetDicUser(userStateContract.UserID).State = OnlineState.Offline;
//当某用户下线后,删除此用户相关的p2p 通道
Common.RemoveUserConn(userStateContract.UserID);
}
}
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
GotoExit();
}
catch (Exception ex)
{
LogTools.LogException(ex, "退出ToolStripMenuItem_Click");
}
}
private void GotoExit()
{
try
{
if (MessageBox.Show("您确认要退出吗?", "", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
this.toExit = true;
NetworkComms.Shutdown();
this.Close();
}
}
catch (Exception ex)
{
LogTools.LogException(ex, "GotoExit");
}
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
if (!this.toExit)
{
if ((e.CloseReason == CloseReason.ApplicationExitCall) || (e.CloseReason == CloseReason.WindowsShutDown))
{
this.toExit = true;
Environment.Exit(Environment.ExitCode);
}
else
{
this.Visible = false;
e.Cancel = true;
}
}
}
catch (Exception ex)
{
LogTools.LogException(ex, "MainForm_FormClosing");
}
}