是一个通信程序(socket异步传输)一个服务器端两个客户端在XP下的情况是:如果服务器端没有开启`客户端会提示服务器没有打开`因此客户端无法运行但是到了WIN7下情况是:1、服务器不开,客户端照样运行`但是只能开一个客户端`第二个开启的话不成功,
                     但没有反应(估计是端口被占用)
                     2、如果打开服务器的话那么又可以运行很多个客户端了。
                   跟踪调试了一下`没有开客户端的时候 IP地址是127.0.0.1 端口号:9988 连接居然是成功的!而且没有异常!连接代码如下:            
        private AsySocket socket = null;
        /// <summary>
        /// 连接服务器
        /// </summary>
        public bool Connect_Server(string Ip,int port)
        {
            try
            {
                //连接
                socket = new AsySocket(Ip, port);
                socket.OnSended += new AsySocketEventHandler(socket_OnSended);
                socket.OnSendTo += new AsySocketEventHandler(socket_OnSendTo);
                socket.OnStringDataAccept += new StringDataAcceptHandler(socket_OnStringDataAccept);
                socket.OnClosed += new AsySocketClosedEventHandler(socket_OnClosed);
                socket.LinkObject.Connect(Ip, port);
                socket.BeginAcceptData();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }//没有异常
            

解决方案 »

  1.   

    程序编译成x86(而不是缺省的AnyCPU)试试
      

  2.   

    你这写的什么?
    // 这里监听了9988端口
    socket.LinkObject.Connect(Ip, port);连接到本机的9988端口,
    socket = new AsySocket(Ip, port);
    socket.OnSended += new AsySocketEventHandler(socket_OnSended);
    socket.OnSendTo += new AsySocketEventHandler(socket_OnSendTo);
    socket.OnStringDataAccept += new StringDataAcceptHandler(socket_OnStringDataAccept);
    socket.OnClosed += new AsySocketClosedEventHandler(socket_OnClosed);
    // 这里又连接到本机的9988端口
    socket.LinkObject.Connect(Ip, port);
    socket.BeginAcceptData();
    这样虽然不会抛出异常,但一边监听,一边又连接自己,这么做没什么意义。
      

  3.   

    Socket 联接默认情况下 如果服务不在线,会很长时间才返回,  而你用又是异步 Socket 
      

  4.   

    正常,我们的软件在win7下老出问题。
      

  5.   

    你看错了``没有写两次socket.LinkObject.Connect(Ip, port);[C# code]
                try
                {
                    //连接
                    socket = new AsySocket(Ip, port);
                    socket.OnSended += new AsySocketEventHandler(socket_OnSended);
                    socket.OnSendTo += new AsySocketEventHandler(socket_OnSendTo);
                    socket.OnStringDataAccept += new StringDataAcceptHandler(socket_OnStringDataAccept);
                    socket.OnClosed += new AsySocketClosedEventHandler(socket_OnClosed);
                    socket.LinkObject.Connect(Ip, port);
                    socket.BeginAcceptData();
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }[/code]第一个NEW是创建一个异步通信连接 并初使化IP 的端口号
    在最后socket.LinkObject.Connect(Ip, port);进行连接服务器
      

  6.   

    没有看错,是贴错了。在AsySocket构造函数中有下面这行:
      mSocket.Bind(ipe);//绑定要监听的IP跟端口到Socket
    然后再调用:
      socket.LinkObject.Connect(Ip, port);
    就是把自己连接到刚才监听的端口上。
      

  7.   

    mSocket.Bind(ipe)
    //摘要:使 System.Net.Sockets.Socket 与一个本地终结点相关联。
    我把这个去掉试一下!如果是这个原因的话`那就能解释通`为什么第一次能运行`而第二次不能运行了`因为
    第一个客户端运行以后9988端口已经被占用了``所以无法运行`
    我试一下
      

  8.   


    就是这个原因 还有一个问题就是,当我连接上服务器以后 服务器端会收到一个字符串sdfswe-3fde42-wwerwe-0ooiu9 这样的东西
    在运行客户端正时候会让输入一个昵称``怎么样让连上服务器以后把这个字符串变成输入的昵称呢
      

  9.   

    看你的客户端发送程序怎么写的。要发送字符串,调用ASend就可以了:
    socket.ASend("my nick name");
      

  10.   


    嗯 是这样的~ 当我登陆的时候会出送一个信息`比如我用一个固定标识标识出来,服务器收到以后去判断就可以了. 这样可以做到``我的意思是说能不能在连接上去以后就直接显示出来这些信息.服务端收到连接的信息是:
    等待客户端进入
                try
                {
                    _port = R_c.GetPort();
                    listener = new AsySocket(consoip, _port);
                    listener.OnAccept += new AcceptEventHandler(listener_OnAccept);
                    listener.Listen(10);
                    Console.Clear();
                    show_Msg();
                    PD_Msg();
                }
                //事件
              void listener_OnAccept(AsySocket AcceptedSocket)
            {
                
                AcceptedSocket.OnStringDataAccept += new StringDataAcceptHandler(AcceptedSocket_OnStringDataAccept);
                AcceptedSocket.OnClosed += new AsySocketClosedEventHandler(AcceptedSocket_OnClosed);
                AcceptedSocket.BeginAcceptData();
                clients.Add(AcceptedSocket.ID, AcceptedSocket);            Console.Write("[消息]   " + DateTime.Now.ToString() + "\n");
                Console.Write("\n");
                Console.Write("       用户: " + AcceptedSocket.ID + "         登陆服务器成功\n");        }
      
                
    传过来的是一个Socket对像
      

  11.   

    不行,OnAccept只是服务器和客户端连接上了,还没有从客户端收到任何数据,ID是服务端自己生成的Guid分配给客户端。
    客户端必须要把自己的nick name发送给服务端,服务端才能知道并显示出来。