贴出部分代码:
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.   

    执行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;
                               //问题在于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及机器名.
      

  2.   

    我也遇到了差不多一样的问题,只是我每次得到的客户端的端口都不同,所以给客户端发送信息时,客户端会接不到一起学习
    msn :[email protected]