本帖最后由 wenyu_825 于 2014-01-14 14:59:57 编辑

解决方案 »

  1.   

    http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html
    你可以看下这个 写的不错.有例子 
      

  2.   

    你这都是些什么呀,while (true)//死循环,即不发生异常中断的情况下一直接受消息 
                {
                    this.socket = serverSocket.Accept();//(4)Create a new Socket for a newly created connection  
                    appendtextBoxLog(this.socket.RemoteEndPoint.ToString()+" 连接成功");
                    Thread thread = new Thread(new ThreadStart(start));
                    thread.IsBackground = true;
                    thread.Start();
                }
      

  3.   

    你这里肯定是有问题的 socket服务端的套接字至少有两个  一个是监听是否有客户端连接用的  当有客户端连接的时候  调用开始监听套接字的Accpet方法会返回一个专门负责和客户端通信的套接字  而这个套接字才是负责通信的  而不是用监听套接字和客户端通信。
      

  4.   

    http://bbs.csdn.net/topics/390513919?page=1#post-394999829
    是不是你的原因
      

  5.   

    http://bbs.csdn.net/topics/390597369
    看下里面的那个例子
      

  6.   

    别的乱七八糟的都不值得讨论了,仅说最成问题的:每一次执行 serverSocket.Accept() 都返回了一个新的 socket 对象实例,你怎么能把之前的 this.socket 变量所引用的丢掉、让它引用新的对象呢?如果这样,别的地方使用 this.socket 变量一定会张冠李戴。
      

  7.   


    这位大神,其实我是有2个的,你可能每注意,一个是serverSocket 一个和socket
      

  8.   


    不过这位大婶,刚次看另一位大婶给的启发,突然发现问题所在了,我在循环里每次循环会创建一个新的ServerSocket,就造成这种后果了,应该是第一次创建的serverSocket把之后创建的ServerSocket端口阻塞了,谢谢大婶.
      

  9.   


    这位大神,其实我是有2个的,你可能每注意,一个是serverSocket 一个和socket
    哦哦   是有两个  没注意  那你就打断点调试吧  看看问题出在那里
      

  10.   

    说句题外话:在.net中的程序,不要总是抄袭低级的java代码。在.net中有很多高级得多的机制,例如简洁高效的异步处理,有天然支持IOCP的TcpListener,等等。请学习.net程序设计。如果你的培训班老师只会从java代码移植一些过来,那么请你另外聘请一位真正精通.net的。
      

  11.   


    这位大神,您仔细看看代码,其实,客户端请求的Socket搞到另一个类里以后,所以这个Socket引用也就没用了,但是根据您的启发,我突然发信我把aceept的服务器主ServerSocket放到循环里了,每次都会新创建一个服务器ServerSocket,所以第一次创建的accept的socket就把后面创建的端口给堵塞了.我是这样理解的.谢谢大神的指教
      

  12.   

    后来看来看你的代码  觉得这个大神说的有道理   没一个客户端连接  都会创建一个不同的通信套接字  你应该声明一个集合来存这些通信套接字  而不是来了一个客户端连接  就赋值给this.socket 这样 最后可定会乱的。
      

  13.   


    不过这位大婶,刚次看另一位大婶给的启发,突然发现问题所在了,我在循环里每次循环会创建一个新的ServerSocket,就造成这种后果了,应该是第一次创建的serverSocket把之后创建的ServerSocket端口阻塞了,谢谢大婶.
    其实  你可以把服务端的监听套接字声明为服务端类的一个私有变量而不是把客户端的通信套接字声明为私有变量 
      

  14.   


    不过这位大婶,刚次看另一位大婶给的启发,突然发现问题所在了,我在循环里每次循环会创建一个新的ServerSocket,就造成这种后果了,应该是第一次创建的serverSocket把之后创建的ServerSocket端口阻塞了,谢谢大婶.
    其实  你可以把服务端的监听套接字声明为服务端类的一个私有变量而不是把客户端的通信套接字声明为私有变量 
    那个,刚才理解错了,貌似问题还是没解决,服务器那个Socket的确只创建了一个,客户端的请求进来的Socket还是只能接受第一次发的消息,第二次就不行了....
      

  15.   


    不过这位大婶,刚次看另一位大婶给的启发,突然发现问题所在了,我在循环里每次循环会创建一个新的ServerSocket,就造成这种后果了,应该是第一次创建的serverSocket把之后创建的ServerSocket端口阻塞了,谢谢大婶.
    其实  你可以把服务端的监听套接字声明为服务端类的一个私有变量而不是把客户端的通信套接字声明为私有变量 
    那个,刚才理解错了,貌似问题还是没解决,服务器那个Socket的确只创建了一个,客户端的请求进来的Socket还是只能接受第一次发的消息,第二次就不行了....
    你把你的serverSoeket   放在启动按钮的事件里面创建  不要放在监听线程里面创建 试试
      

  16.   

    肯定不是Socket对象引用丢弃或张冠李戴的问题,这里使用完全是安全的,看这段代码:
    private void start()
    {
        SocketThreadClass stc = new SocketThreadClass(this.socket,this.textBoxLog);
    }即使重用this.socket这个变量,实际数据接收是在一个私有类里面,因此那个外部的变量如何被重用都无关紧要了。
    但是再仔细看这个start方法,存在一个很容易被忽略的错误,那就是对象的作用域范围,这个函数执行完毕后,这个stc 临时对象离开了那个作用域就直接可以被GC回收了,既然对象可以被回收,那么对象内部再执行的数据接收方法自然就没戏了。你通过对象来封装处理,就要保持对象引用以免被GC回收才行。PS:都没解决问题居然结贴了,我要是不负责的话,可以不回复了。
      

  17.   

    你这里离开作用域  应该是start执行完之后吧  而start执行完之后 客户端发送过来的消息已经接收完毕  这个stc确实没啥意义了啊(在楼主上面的代码中) 所以  应该不是这个问题
      

  18.   

    我怎么感觉那个代码的设计思路也存在严重的问题啊,仔细看了下那个SocketThreadClass类,如果正常情况下是永远不会被初始化完毕的,这个本身就是大问题了,因为对象没初始化完,那么就得不到该对象的正常引用,GC就能认为该对象没有引用可以回收。
      

  19.   


    是的  我也觉得 他在初始化的时候 一直在用while循环接受客户端发送过来的消息