客户端:
namespace client
{
    class Program
    {
        static void Main(string[] args)
        {
            Program fuck = new Program();
            Thread newthread = new Thread(new ThreadStart(fuck.send));
            newthread.Start();        }        public void send()
        {
            Socket client = null;
            byte[] buffer = new byte[1024];
            string input = null;
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint eip = new IPEndPoint(ip, 8888);          try
            {
                client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                Console.WriteLine("ready to connect to the server.........");
               
                client.Connect(eip);
            }
            catch (Exception eX)
            {
                Console.WriteLine("disconnected from the server.....");
                Console.WriteLine(eX.Message);
                Console.ReadLine();
                Thread.CurrentThread.Abort();
            }            while (true)
            {
                Console.WriteLine("waiting sending..................");
                input = Console.ReadLine();
                if (input == "exit")
                {
                    break;
                }
                else
                {
                    Console.WriteLine("now sending ......");
                    client.Send(Encoding.ASCII.GetBytes(input));
                    Thread.Sleep(1000);
                    Console.WriteLine("finished..........");                }            }
            client.Close();
            Console.WriteLine("game over");
            Thread.CurrentThread.Abort();
          
            
        }
    }
}服务器端:
namespace consolesocket
{
    class Program
    {
        static void Main(string[] args)
        {
            server js = new server();
            Thread n = new Thread(new ThreadStart(js.fun));
            n.Start();
        }
    }    class server
    {
        public server()
        {
        }        public void fun()
        {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint eip = new IPEndPoint(ip, 8888);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(eip);
            server.Listen(5);
            Console.WriteLine("start to listening......");            while (true)
            {
                Socket accepted = server.Accept();
                Console.WriteLine("one client conected...........");
                SocketProcess spc = new SocketProcess(accepted);                Thread Data = new Thread(new ParameterizedThreadStart(DataProcess));
                // Thread Line = new Thread(new ThreadStart(LineProcess(accepted)));                Data.Start(accepted);           //object类型参数
                // Line.Start();            }        }
        public void DataProcess(object  s)
        {
            Socket socket = (Socket)s;
            Thread threadDataProcess = new Thread(new ThreadStart(new SocketProcess(socket).DataProce));
            threadDataProcess.Start();
        }
        public void LineProcess(Socket s)
        {
            Thread threadLineProcess = new Thread(new ThreadStart(new SocketProcess(s).LineProce));
            threadLineProcess.Start();
        }    }
 class SocketProcess
    {
        Socket server;
        private static int numOfconnection = 0;
        public SocketProcess(Socket server)
        {
            this.server = server;
            ++numOfconnection;
            Console.Write(string.Format("a new client conected it\'s number : {0}\n", numOfconnection));
        }        public void DataProce()
        {
            int i = 0;
            byte[] buffer = new byte[1024];            Console.WriteLine(" start to receive ........");
            Thread.Sleep(1000);
            while (true)
          {
              // try
                {
                    Console.WriteLine("\nlistening...........\n");
                    if ((i = server.Receive(buffer)) != 0)
                    {
                        string data = Encoding.ASCII.GetString(buffer);
                        if (data.Equals(" ")) data = "cao";
                        Console.WriteLine(data);
                        Console.WriteLine(" ........end");                    }
               }
            //   catch (Exception eX)
               {
             //     Console.WriteLine(eX.Message);
             //     Console.Read();
               }
               
            }
            server.Close();
            Console.Write(string.Format("client {0} disconnected\n", numOfconnection--));
            Console.Write(string.Format("{0} clients remains connected\n", numOfconnection));        }        public void LineProce()
        {        }
    }
}为什么客户端关闭之后服务器也关闭了呢?有什么好的解决方案么?

解决方案 »

  1.   

    你客户端关闭的时候,服务端与客户端相关的那个Socket会抛出异常,从而导致你的服务端也关闭,你要在服务端把那个接收客户端的信息的地方try{}catch{}起来,捕获并处理这个异常,才不会关闭你的服务端,你的结贴率真的很低
      

  2.   

    哈哈!结贴率 多谢提醒,以后注意了
    在服务器端
    try
    {........}
    catch(SocketException)
    {
    }这样虽然可以,但是有没有更好的,比如一个客户端断开连接后服务器端可以显示相关信息
    catch(SocketException)
    {
    console.writeline(".........");      //服务端将不断地显示这条信息,除非再写一句console.read();但总觉得这样不好,而且如果客户端输入exit断开连接的话,console.read()会失效.
    }