本人写的是关于聊天这方面的,就是自己封装了个Client,此类里有通信的对象,以及各个需要的功能函数,还有线程,线程的入口函数如下:
private void clientRun()
{
byte[] buffer = null;
while(true)
{
MessageBox.Show("新的一轮循环开始...");
buffer = client.Receive(ref remotePoint);
MessageBox.Show(remotePoint.Port.ToString());
try
{
object msgObj = P2P.FormatterHelper.DeserializeObj(buffer);
System.Type msgType = msgObj.GetType();
if(msgType == typeof(P2P.GetUsersResponseMessage))
{
//转换消息
P2P.GetUsersResponseMessage usersMsg = (P2P.GetUsersResponseMessage)msgObj; //更新用户列表
userList.Clear();
foreach(User user in usersMsg.UserList)
{
userList.Add(user);
}
//显示在 treeView 上
ClientApp.formClient.trwShow.Invoke(DrawTreeView,new object[]{userList});
}
else if(msgType == typeof(P2P.GetUsersIsExistMessage))
{
//服务器发送的测试客户是否在线的消息
P2P.GetUsersIsExistResponseMessage userIsExistResponseMsg = new GetUsersIsExistResponseMessage(this.myName);
buffer = null;
buffer = P2P.FormatterHelper.SerializeObj(userIsExistResponseMsg);
client.Send(buffer,buffer.Length,hostPoint);
}
else if(msgType == typeof(P2P.SomeOneCallYouMessage))
{
//转换消息
P2P.SomeOneCallYouMessage purchReqMsg = (P2P.SomeOneCallYouMessage)msgObj;
//发送打洞消息到远程主机
P2P.TrashMessage trashMsg = new TrashMessage();
buffer = null;
buffer = P2P.FormatterHelper.SerializeObj(trashMsg);
client.Send(buffer,buffer.Length,purchReqMsg.RemotePoint);
}
else if(msgType == typeof(P2P.WorkMessage))
{
//转换消息
P2P.WorkMessage workMsg = (P2P.WorkMessage)msgObj;
// MessageBox.Show("外围的socket:"+ workMsg.Message);
//发送应答消息
P2P.ACKMessage ackMsg = new ACKMessage(); buffer = null;
buffer = P2P.FormatterHelper.SerializeObj(ackMsg); client.Send(buffer,buffer.Length,remotePoint);
MessageBox.Show(remotePoint.Port.ToString());
//显示message在 CreatForm 中的 richTextBox1中
CreateTalkDelegate(workMsg);
}
else if(msgType == typeof(P2P.ACKMessage))
{
this.ReceivedACK = true;
}
else if(msgType == typeof(P2P.TrashMessage))
{
MessageBox.Show("Received a trashMessage!");
}
// Thread.Sleep(100);
}
catch
{
MessageBox.Show("客户端运行出错!");
}
}
}有2个客户端A ,B,当A向B发送个WorkMessage时,B接受到A的WorkMessage后,就发个回复响应消息给A,此消息是ACKMessage,结果A就是收不到B的回复消息,调试发现,B也确实把ACKMessage发给A了,但是A的Client里的线程里的 入口函数的死循环就是受不到,大家看看撒,在线等...
private void clientRun()
{
byte[] buffer = null;
while(true)
{
MessageBox.Show("新的一轮循环开始...");
buffer = client.Receive(ref remotePoint);
MessageBox.Show(remotePoint.Port.ToString());
try
{
object msgObj = P2P.FormatterHelper.DeserializeObj(buffer);
System.Type msgType = msgObj.GetType();
if(msgType == typeof(P2P.GetUsersResponseMessage))
{
//转换消息
P2P.GetUsersResponseMessage usersMsg = (P2P.GetUsersResponseMessage)msgObj; //更新用户列表
userList.Clear();
foreach(User user in usersMsg.UserList)
{
userList.Add(user);
}
//显示在 treeView 上
ClientApp.formClient.trwShow.Invoke(DrawTreeView,new object[]{userList});
}
else if(msgType == typeof(P2P.GetUsersIsExistMessage))
{
//服务器发送的测试客户是否在线的消息
P2P.GetUsersIsExistResponseMessage userIsExistResponseMsg = new GetUsersIsExistResponseMessage(this.myName);
buffer = null;
buffer = P2P.FormatterHelper.SerializeObj(userIsExistResponseMsg);
client.Send(buffer,buffer.Length,hostPoint);
}
else if(msgType == typeof(P2P.SomeOneCallYouMessage))
{
//转换消息
P2P.SomeOneCallYouMessage purchReqMsg = (P2P.SomeOneCallYouMessage)msgObj;
//发送打洞消息到远程主机
P2P.TrashMessage trashMsg = new TrashMessage();
buffer = null;
buffer = P2P.FormatterHelper.SerializeObj(trashMsg);
client.Send(buffer,buffer.Length,purchReqMsg.RemotePoint);
}
else if(msgType == typeof(P2P.WorkMessage))
{
//转换消息
P2P.WorkMessage workMsg = (P2P.WorkMessage)msgObj;
// MessageBox.Show("外围的socket:"+ workMsg.Message);
//发送应答消息
P2P.ACKMessage ackMsg = new ACKMessage(); buffer = null;
buffer = P2P.FormatterHelper.SerializeObj(ackMsg); client.Send(buffer,buffer.Length,remotePoint);
MessageBox.Show(remotePoint.Port.ToString());
//显示message在 CreatForm 中的 richTextBox1中
CreateTalkDelegate(workMsg);
}
else if(msgType == typeof(P2P.ACKMessage))
{
this.ReceivedACK = true;
}
else if(msgType == typeof(P2P.TrashMessage))
{
MessageBox.Show("Received a trashMessage!");
}
// Thread.Sleep(100);
}
catch
{
MessageBox.Show("客户端运行出错!");
}
}
}有2个客户端A ,B,当A向B发送个WorkMessage时,B接受到A的WorkMessage后,就发个回复响应消息给A,此消息是ACKMessage,结果A就是收不到B的回复消息,调试发现,B也确实把ACKMessage发给A了,但是A的Client里的线程里的 入口函数的死循环就是受不到,大家看看撒,在线等...
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货