首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#TCP通信有关问题。客户端发送的消息只能收到第一条。客户端必须断开重新连接,服务器才能再次收到信息。为何

2012-07-03 
C#TCP通信问题。客户端发送的消息只能收到第一条。客户端必须断开重新连接,服务器才能再次收到信息。为何?代

C#TCP通信问题。客户端发送的消息只能收到第一条。客户端必须断开重新连接,服务器才能再次收到信息。为何?
代码如下:
  private Socket socketListener = null;
  private Thread thread;
  private bool flag;
  private void button1_Click(object sender, EventArgs e)
  {
  if (btnStart.Text == "开启服务器")
  {

  IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
  this.socketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   
  IPAddress ipAddress = IPAddress.Parse("192.168.1.109");
  int port = Int32.Parse(this.txtPoint.Text);
  //hostEntry.AddressList[2].Address  
  IPEndPoint endPoint = new IPEndPoint(ipAddress, port);
  this.socketListener.Bind(endPoint);
  flag = true;
  this.thread = new Thread(new ThreadStart(this.ReceiveMessage));
  this.thread.Start();
  btnStart.Text = "关闭服务器";
  if (!txtClientMessage.InvokeRequired) 
  {
  txtClientMessage.AppendText("服务器已打开\n\r");
  }
   
  }
  else 
  {
  this.socketListener.Close();
  this.thread.Abort();
  this.flag = false;
  }
   
  }


  #region 接收消息

  public delegate void SetTextHandle(string msg);
  private void SetText(string text) 
  {
  if (txtClientMessage.InvokeRequired)
  {
  SetTextHandle set = new SetTextHandle(SetText);
  txtClientMessage.Invoke(set, new object[] { text });
  }
  else 
  {
  this.txtClientMessage.AppendText(text);
  }
  }



  private void ReceiveMessage() 
  {
  while (this.flag) 
  {
  this.socketListener.Listen(30);
  Socket socket = this.socketListener.Accept();
   
  byte[] bytesReceive = new byte[1024];
  int bytesCount = socket.Receive(bytesReceive);
  bool t = socketListener.Connected;
  if (bytesCount > 0) 
  {
  string message = Encoding.Default.GetString(bytesReceive) + "\n\r";
  SetText(message);  
  }
   
  }
  }
  #endregion

[解决办法]
没注意,原来是个按钮事件,稍微修改下

C# code
private void button1_Click(object sender, EventArgs e){    if (btnStart.Text == "开启服务器")    {        IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());        this.socketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);        IPAddress ipAddress = IPAddress.Parse("192.168.1.109");        int port = Int32.Parse(this.txtPoint.Text);        IPEndPoint endPoint = new IPEndPoint(ipAddress, port);        this.socketListener.Bind(endPoint);        this.socketListener.Listen(30);        ThreadPool.QueueUserWorkItem(p =>        {            while (true)            {                Socket socket = this.socketListener.Accept();                this.thread = new Thread(this.ReceiveMessage);                this.thread.Start(socket);            }        });        btnStart.Text = "关闭服务器";        if (!txtClientMessage.InvokeRequired)        {            txtClientMessage.AppendText("服务器已打开\n\r");        }    }    else    {        this.socketListener.Close();        this.thread.Abort();        this.flag = false;    }} 


[解决办法]
Accept 后会有一个事件,事件参数中有一个Socket 的对像这个对像可以得到你要的功能和内容
[解决办法]
你这样试试,
1.加一个类级变量 bool _IsEnd = false;
2.while (true)这里改成 while(!_IsEnd);记得打开连接之前,_IsEnd=false;
3.this.socketListener.Close();这句话之前,加上_IsEnd =true;
this.socketListener.Shutdown(SocketShutdown.Both);

热点排行