贴出部分代码:
1:启动按纽
private void btnStart_Click(object sender, System.EventArgs e)
{
try
{
tcpListener = new TcpListener(IPAddress.Parse(this.dropHost.Text),int.Parse(this.txtPort.Text));
tcpListener.Start();
this.txtContent.Text="服务器已经启动,正在监听"+this.dropHost.Text+":"+this.txtPort.Text+"端口。";
Th=new Thread(new ThreadStart(this.StartListen));
Th.Start();
this.btnStart.Enabled=false;
}
catch(Exception excp)
{
this.txtContent.Text=excp.Message.ToString();
}
}2:开始监听
private void StartListen()
{
while(true)
{
tcpClient = tcpListener.AcceptTcpClient();
if(curUsers>=MaxUsrCount)
{
tcpClient.Close();
}
else
{
Thread EDT=new Thread(new ThreadStart(this.ExchangeData));
EDT.Start();
}
}
}
执行ExchangData方法:
private void ExchangeData()
{
string tempMessage = "";
int Len = 0;
byte[] Buff = new byte[1024];
try
{
netStrm=tcpClient.GetStream();//每当有新的Socket产生的时候,便会执行
while(true)
{
if(!netStrm.CanRead)
break;
Len=netStrm.Read(Buff,0,Buff.Length);
tempMessage=System.Text.UnicodeEncoding.Unicode.GetString(Buff,0,Len);
MessageInfo mess = new MessageInfo();
this.SetMessage(tempMessage,mess);
switch(mess.MessType)
{
case "Add":
#region Add
#endregion
default:
txtContent.Text = "执行了default条件"+"\r\n"+txtContent.Text;
break;
}
}
//netStrms[CurNum].Close();
//tcpClients[CurNum].Close();
}
catch(Exception e)
{
this.txtContent.Text=e.ToString()+"\r\n"+this.txtContent.Text;
}
}
我的思路是:
每当有客户端连接时,都会发生一个netStrm,然后把它放在一个ArrayList数组里面,如:
a客户端连接时,发生一个netStrm_a,b客户连接时,产生一个netStrm_b,然后放在arraylist当中。
当服务器要给a发送消息时,则通过netStrm_a来发送,要给b发送消息时,则通过netStrm_b来发送。bug:
现在,当多客户端启动时,只有最后一个启动的用户能给服务器发送消息,并且服务器也能给相应的客户端转发消息。但先前启动的客户端就不能给服务器关送了(严格来讲,先前启动的客户端也能发,只是服务器不能接收而起)。原因:看我的ExchangeData()方法,while(true)里面的一句代码:
Len=netStrm.Read(Buff,0,Buff.Length);//netStrm很有可能就是最后一次启动的NetworkStream对像。只有它才能读!所以,现在的问题是:如何修改这一句代码。如何让服务器端不同的netStrm来接受相应客户端的消息呢??还有一个问题是:我什么时候关闭服务器的socket?
谢谢各位!
1:启动按纽
private void btnStart_Click(object sender, System.EventArgs e)
{
try
{
tcpListener = new TcpListener(IPAddress.Parse(this.dropHost.Text),int.Parse(this.txtPort.Text));
tcpListener.Start();
this.txtContent.Text="服务器已经启动,正在监听"+this.dropHost.Text+":"+this.txtPort.Text+"端口。";
Th=new Thread(new ThreadStart(this.StartListen));
Th.Start();
this.btnStart.Enabled=false;
}
catch(Exception excp)
{
this.txtContent.Text=excp.Message.ToString();
}
}2:开始监听
private void StartListen()
{
while(true)
{
tcpClient = tcpListener.AcceptTcpClient();
if(curUsers>=MaxUsrCount)
{
tcpClient.Close();
}
else
{
Thread EDT=new Thread(new ThreadStart(this.ExchangeData));
EDT.Start();
}
}
}
执行ExchangData方法:
private void ExchangeData()
{
string tempMessage = "";
int Len = 0;
byte[] Buff = new byte[1024];
try
{
netStrm=tcpClient.GetStream();//每当有新的Socket产生的时候,便会执行
while(true)
{
if(!netStrm.CanRead)
break;
Len=netStrm.Read(Buff,0,Buff.Length);
tempMessage=System.Text.UnicodeEncoding.Unicode.GetString(Buff,0,Len);
MessageInfo mess = new MessageInfo();
this.SetMessage(tempMessage,mess);
switch(mess.MessType)
{
case "Add":
#region Add
#endregion
default:
txtContent.Text = "执行了default条件"+"\r\n"+txtContent.Text;
break;
}
}
//netStrms[CurNum].Close();
//tcpClients[CurNum].Close();
}
catch(Exception e)
{
this.txtContent.Text=e.ToString()+"\r\n"+this.txtContent.Text;
}
}
我的思路是:
每当有客户端连接时,都会发生一个netStrm,然后把它放在一个ArrayList数组里面,如:
a客户端连接时,发生一个netStrm_a,b客户连接时,产生一个netStrm_b,然后放在arraylist当中。
当服务器要给a发送消息时,则通过netStrm_a来发送,要给b发送消息时,则通过netStrm_b来发送。bug:
现在,当多客户端启动时,只有最后一个启动的用户能给服务器发送消息,并且服务器也能给相应的客户端转发消息。但先前启动的客户端就不能给服务器关送了(严格来讲,先前启动的客户端也能发,只是服务器不能接收而起)。原因:看我的ExchangeData()方法,while(true)里面的一句代码:
Len=netStrm.Read(Buff,0,Buff.Length);//netStrm很有可能就是最后一次启动的NetworkStream对像。只有它才能读!所以,现在的问题是:如何修改这一句代码。如何让服务器端不同的netStrm来接受相应客户端的消息呢??还有一个问题是:我什么时候关闭服务器的socket?
谢谢各位!
解决方案 »
- C#Listview和水晶报表
- c#备份sql数据库
- 复杂的触发其他程序事件询问?
- 字符串可以反射成自定义的类的类型吗?
- 选择datagridview 单元格时如何获取单元的坐标?(就是 x,y 的值 我要代码详细的啊)
- 如何把从winfrom窗体上截取的图片复制到剪切板
- 关于winform中事务的问题?不加事务运行很快,但加上事务控制后就说超时?
- 如何在C#程序中使用代码创建.mdb数据库?(在线等......)
- 求助,使用dev的checkedcomboboxedit问题
- 一个小问题,大家帮帮忙~
- 如何解决HttpWebRequest将username和password用post方法提交到有验证码的目标网站?
- vss项目权限如何管理?
private void ExchangeData()
{
string tempMessage = "";
int Len = 0;
byte[] Buff = new byte[1024];
try
{
netStrm=tcpClient.GetStream();//当有新的Socket产生的时候,便会执行
while(true)
{
if(!netStrm.CanRead)
break;
//问题在于netStrm这个NetworkStream很可能是最后一个启动
//的 客户对像。所以,只有最后一个客户端才能发送消息。
//所以,要解决的:不同的客户端,要用相应的netStrm来接收。
Len=netStrm.Read(Buff,0,Buff.Length);
tempMessage=GetString(Buff,0,Len);
MessageInfo mess = new MessageInfo();
this.SetMessage(tempMessage,mess);
switch(mess.MessType)
{
case "Add":
break;
default:
break;
}
}
}
catch(Exception e)
{
this.txtContent.Text=e.ToString()+"\r\n"+this.txtContent.Text;
}
}//用户列表
public ArrayList UserList
{
get
{
return _UserList;
}
set
{
_UserList = value;
}
}
UserList 存放的就是客户端连接时产生的NetworkStream对像netStream,与客户端的ip及机器名.
msn :[email protected]