服务器端与一个客户端交互没有问题,但再运行一个实例后,第二个实例与服务器没有反应
如果只运行一个实例,把客户端关掉以后再重新运行,服务端也没有反应
server端:public class Server
    {
        static string data = "";
        static void Main(string[] args)
        {
            ThreadStart ts = new ThreadStart(Listen);
            Thread t = new Thread(ts);
            t.Start();
        }
        public static void Listen()
        {
            IPEndPoint localpoint = new IPEndPoint(IPAddress.Any, 90);
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(localpoint);
            listener.Listen(100);
            
            byte[] bytes;
            Socket handler;
            int bytesRec;            while (true)
            {
                Console.WriteLine("waiting for a connection ****");
                handler = listener.Accept();
                data = "";
                while (true)
                {
                    bytes = new byte[1024];                    bytesRec = handler.Receive(bytes);
                    Console.WriteLine("数据是:" + bytesRec.ToString());
                    data = Encoding.Unicode.GetString(bytes, 0, bytesRec);
                    Console.WriteLine(data);
                }
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
        }
    }client端:class Client
    {
        static void Main(string[] args)
        {
            IPAddress address = IPAddress.Parse("127.0.0.1");
            IPEndPoint point = new IPEndPoint(address, 90);
            Socket sc;
            string data;
            int bsent;
            byte[] b;            sc = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.IP);
            sc.Connect(point);
            Console.Write("输入:");
            while (true)
            {
                data = Console.ReadLine();
                if (data == "exit")
                {
                    sc.Shutdown(SocketShutdown.Both);
                    sc.Close();
                    return;
                }
                b = Encoding.Unicode.GetBytes(data);
                bsent = sc.Send(b);
                Console.WriteLine(Encoding.Unicode.GetString(b, 0, b.Length) + " has senden");
                Console.Write("输入:");
            }
            
        }
    }

解决方案 »

  1.   

    我想知道你这代码哪里找来的,好糟糕啊。你应该学会自己看MSDN,使用异步Socket操作是非常容易的,虽然微软提供了同步操作,但是服务器端就不应该使用同步方法来接受新连接,只有用异步方法才是稳中取稳的最可靠做法。
      

  2.   

    不知道要说什么,去MSDN那看例子去吧
    http://www.cnblogs.com/JimmyZhang/category/101698.html
    这个里面写得很清楚
      

  3.   

    http://topic.csdn.net/u/20080623/08/4bbd2475-45f1-42e3-a613-16b094759ade.html
      

  4.   

    我自己写的,呵呵,
    我刚学socket,写的不好,但代码只要能运行就可以了
    与多客户端通信只能用异步吗?同步多线程应该也可以吧
      

  5.   


    有谁学Socket是一上来就异步呢?
      

  6.   

    首先你的线程已经在处理一个客户端,所以无法在处理其他的连接请求了。除非你启动多个侦听线程。不过服务段一般是异步的。同步只适用于对性能要求不高的情况下。因为你不可能弄上几十上百的线程去运行,再牛的服务器也禁不住那样的开销。
    不过,.net的异步有一个缺陷,就是在EndXXX (EndReceive, EndInvoke etc.)在被叫前,给出的缓存区是被钉死的,.net不可以回收那段内存。所以要预定出一块较大的内存用来作为缓存。否则内存很快就被分割成一小条一小条的。系统会在还有许多内存的情况下爆出内促不足的错误来。其次要设立一些机制已使得服务端能够及时释放被钉死缓存。这样才能保障服务健康运行。
    TCP/IP并不是很容易,当然如果你只是写个小东西看似很轻松。但如果真作大家伙,真得把它的潜在机理摸清(简单套用msdn的例子是行不通的,那只不过是抛砖引玉的个小例子),否则出来的服务会漏洞百出的,搞不好一个月的启动好几次。所以如果能用Remoting,WCF等上层技术来解决问题,还是用上层的。毕竟底下的工作人家都给做好了。