WinForm, VS2005,
TCP/IP现在需要做:一个服务端,多个客户端的程序。
现在只会用多线程来实现:在服务器上事先对每一个客户端采用不同的端口,开一个线程,对其侦听和回复。我想肯定有更好的处理方法。从网上查到过:
  “建立一个服务端口,称为控制端口,客户端通过先于这个端口进行信息交换。”
没有看懂。

解决方案 »

  1.   

    你去看看我的Blog:http://wzd24.cnblogs.com,里面有一篇同步Socket实现两例。
      

  2.   

    http://www.cnblogs.com/wzd24/archive/2007/05/21/753709.html就是这篇!
      

  3.   

    没必要开一堆线程的东西,很容易让你的系统资源浪费精光的。.Net的线程稳定度明显不足。呵呵~~
      

  4.   

    建议写一个客户端类(ID,Socket对象等等),在侦听端创建一数组用来保存所有客户端类对象,每次有新的连接则在数组中新增一个客户端类对象,相反也可以删除一个。同时建立一个线程用来循环这个数组,接收和解析所有客户端发来的消息,并针对消息号作出响应即可,如果数据量大的话,可把接收和解析各单开一个线程
      

  5.   

    请问: 
    this.Invoke(new AddListItemHandler(this.AddListItem), new string[] { recString }); AddListItemHandler应该怎么申明?我没有用过delegate,谢谢。
      

  6.   

    回复人:wubrtn() ( 一级(初级)) 信誉:100  2007-06-13 08:43:52  得分:0

    请问:
    this.Invoke(new AddListItemHandler(this.AddListItem), new string[] { recString });AddListItemHandler应该怎么申明?我没有用过delegate,谢谢。-------------------------------------
    呵呵………………
    真不好意思,这句和Socket是无关的。只是我用来将接收到的数据显示到窗体的ListBox里面!
    你可以用你自己的处理函数来替换掉这几行代码!
      

  7.   

    wzd24(牧野):谢谢您耐心的回复。
    不用托管时,出现了跨线程使用控件的异常。还得用托管阿。
    不知您能否提供更详细一点的说明,让我能用起来下面这条语句。非常感谢。
    this.Invoke(new AddListItemHandler(this.AddListItem), new string[] { recString });
      

  8.   

    我给你一个函数的声明,你自己在里面写代码。这个是委托。
    public delegate void AddListItemHandler(string value);-------------------------------------------------------------这个是我要调用的方法!
    priv void AddListItem(string value)
    {
      this.ListBox1.Item.Add(value);
    }
      

  9.   

    非常感谢WZD24,基本都调通了。还有一个疑问:
                        string recString = "来自客户端" + remoEP.Address.ToString() + "的消息:" + Encoding.Default.GetString(buffer, 0, receiveCount);
    执行这条语句时,并没有把buffer的内容转化为string.
    "\02\00\00\07\0-\06\0-\01\03\0 \01\00\0:\03\01\0:\02\09\0S\0y\0s\0t\0e\0m\0.\0W\0i\0n\0d\0o\0w\0s\0.\0F\0o\0r\0m\0s\0.\0R\0i\0c\0h\0T\0e\0x\0t\0B\0o\0x\0,\0 \0T\0e\0x\0t\0:\0 \01\02\03\04\05\06\0\r\0\n"但是,自动返回客户端的信息完全正确。
      

  10.   

    再次感谢 wzd24 。
    终于全调通了。解码用如下的语句就好了:
     string msg = System.Text.Encoding.BigEndianUnicode.GetString(buffer);