http://365base.com/Soft/sort3/78/
//上面找找
網上很多的!

解决方案 »

  1.   

    http://qingyang.cnblogs.com/archive/2005/07/23/198468.html
      

  2.   

    /********************************ChatServer:*************************************************/using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;using System.Threading;
    using System.Net.Sockets;
    using System.Net;
    namespace Chat_Server
    {
     /// <summary>
     /// Form1 的摘要说明。
     /// </summary>
     public class Form1 : System.Windows.Forms.Form
     {
      /// <summary>
      /// 必需的设计器变量。
      /// </summary>
      private System.ComponentModel.Container components = null;  static int listenport=6666;
      Socket clientsocket;
      private System.Windows.Forms.ListBox lbClients;
      ArrayList clients;
      private System.Windows.Forms.Button button1;
      Thread clientservice;
      private System.Windows.Forms.Label label1;
      Thread threadListen;  public Form1()
      {
       
       InitializeComponent();  }  /// <summary>
      /// 清理所有正在使用的资源。
      /// </summary>
      protected override void Dispose( bool disposing )
      {
       if( disposing )
       {
        
        if(clientservice != null)
        {
         clientservice.Abort();
        }
        if(threadListen != null)
        {
         try
         {
          threadListen.Abort();
         }
         catch(Exception ex)
         {
          threadListen = null;
         }
        }        if (components != null) 
        {
         components.Dispose();
        }
       }
       base.Dispose( disposing );
       
      }  #region Windows 窗体设计器生成的代码
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {
       this.lbClients = new System.Windows.Forms.ListBox();
       this.button1 = new System.Windows.Forms.Button();
       this.label1 = new System.Windows.Forms.Label();
       this.SuspendLayout();
       // 
       // lbClients
       // 
       this.lbClients.ItemHeight = 12;
       this.lbClients.Location = new System.Drawing.Point(16, 24);
       this.lbClients.Name = "lbClients";
       this.lbClients.Size = new System.Drawing.Size(184, 268);
       this.lbClients.TabIndex = 0;
       // 
       // button1
       // 
       this.button1.Location = new System.Drawing.Point(272, 56);
       this.button1.Name = "button1";
       this.button1.TabIndex = 1;
       this.button1.Text = "button1";
       this.button1.Click += new System.EventHandler(this.button1_Click);
       // 
       // label1
       // 
       this.label1.Location = new System.Drawing.Point(240, 136);
       this.label1.Name = "label1";
       this.label1.Size = new System.Drawing.Size(120, 32);
       this.label1.TabIndex = 2;
       this.label1.Text = "label1";
       // 
       // Form1
       // 
       this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
       this.ClientSize = new System.Drawing.Size(368, 309);
       this.Controls.Add(this.label1);
       this.Controls.Add(this.button1);
       this.Controls.Add(this.lbClients);
       this.Name = "Form1";
       this.Text = "Form1";
       this.Load += new System.EventHandler(this.Form1_Load);
       this.ResumeLayout(false);  }
      #endregion  /// <summary>
      /// 应用程序的主入口点。
      /// </summary>
      [STAThread]
      static void Main() 
      {
       Application.Run(new Form1());
      }  private void StartListening() 
      { 
        TcpListener listener = new TcpListener(listenport);
        listener.Start();
       label1.Text = "listening....";
       while (true) 
       {
        try
        {
        
         Socket s = listener.AcceptSocket(); 
         clientsocket = s; 
         clientservice = new Thread(new ThreadStart(ServiceClient)); 
         clientservice.Start(); 
        }
        catch(Exception ex)
        {
         MessageBox.Show("listening Error: "+ex.Message);
        }
       }   
      }
      private void ServiceClient() 
      { 
       Socket client = clientsocket; 
       bool keepalive = true; 
       while (keepalive) 
       { 
        Byte[] buffer = new Byte[1024]; 
        int bufLen = 0;
        try
        {
         bufLen = client.Available ;
         
         client.Receive(buffer,0,bufLen,SocketFlags.None); 
         if(bufLen==0)
          continue;    
        }
        catch(Exception ex)
        {
         MessageBox.Show("Receive Error:"+ex.Message);
         return;
        }
        
        string clientcommand = System.Text.Encoding.ASCII.GetString(buffer).Substring(0,bufLen);     string[] tokens = clientcommand.Split(new Char[]{'|'}); 
        Console.WriteLine(clientcommand);     if (tokens[0] == "CONN") 
        { 
         for(int n=0; n<clients.Count;n++)
         { 
          Client cl = (Client)clients[n]; 
          SendToClient(cl, "JOIN|" + tokens[1]); 
         }
         EndPoint ep = client.RemoteEndPoint; 
         Client c = new Client(tokens[1], ep, clientservice, client); 
         
         string message = "LIST|" + GetChatterList() +"\r\n"; 
         SendToClient(c, message);      clients.Add(c); 
         lbClients.Items.Add(c); 
        }
        if (tokens[0] == "CHAT") 
        { 
         for(int n=0; n<clients.Count;n++)
         { 
          Client cl = (Client)clients[n]; 
          SendToClient(cl, clientcommand); 
         }
        }
        if (tokens[0] == "PRIV") 
        { 
         string destclient = tokens[3]; 
         for(int n=0; n<clients.Count;n++)
         { 
          Client cl = (Client)clients[n]; 
          if(cl.Name.CompareTo(tokens[3]) == 0) 
           SendToClient(cl, clientcommand); 
          if(cl.Name.CompareTo(tokens[1]) == 0) 
           SendToClient(cl, clientcommand); 
         } 
        } 
        if (tokens[0] == "GONE") 
        { 
         int remove = 0; 
         bool found = false; 
         int c = clients.Count; 
         for(int n=0; n<clients.Count;n++)
         { 
          Client cl = (Client)clients[n]; 
          SendToClient(cl, clientcommand); 
          if(cl.Name.CompareTo(tokens[1]) == 0) 
          { 
           remove = n; 
           found = true; 
           lbClients.Items.Remove(cl); 
          } 
         } 
         if(found) 
          clients.RemoveAt(remove); 
         client.Close(); 
         keepalive = false; 
        } 
       } 
      }  private string GetChatterList()
      {
       string result = "";   for(int i=0;i<clients.Count;i++)
       {
        result += ((Client)clients[i]).Name+"|";
       }
       return result;  }  private void SendToClient(Client cl,string clientCommand)
      {
       Byte[] message = System.Text.Encoding.ASCII.GetBytes(clientCommand);
       Socket s = cl.Sock;
       if(s.Connected)
       {
        s.Send(message,message.Length,0);
       }
      }  private void Form1_Load(object sender, System.EventArgs e)
      {
       clients = new ArrayList();
      }  private void button1_Click(object sender, System.EventArgs e)
      {
       threadListen = new Thread(new ThreadStart(StartListening));
       threadListen.Start();  
      } 
     } 
    }/***************************** client类 ********************//************************** 放于 chatServer 项目中 *********/using System; 
    using System.Threading; namespace Chat_Server 

     using System.Net.Sockets; 
     using System.Net;  /// 
     /// Client 的摘要说明。 
     /// 
     public class Client 
     { 
      private Thread clthread; 
      private EndPoint endpoint; 
      private string name; 
      private Socket sock;   public Client(string _name, EndPoint _endpoint, Thread _thread, Socket _sock) 
      { 
       // TODO: 在此处添加构造函数逻辑 
       clthread = _thread; 
       endpoint = _endpoint; 
       name = _name; 
       sock = _sock; 
      }   public override string ToString() 
      { 
       return endpoint.ToString()+ " : " + name; 
      }   public Thread CLThread 
      { 
       get{return clthread;} 
       set{clthread = value;} 
      }   public EndPoint Host 
      { 
       get{return endpoint;} 
       set{endpoint = value;} 
      }   public string Name 
      { 
       get{return name;} 
       set{name = value;} 
      }   public Socket Sock 
      { 
       get{return sock;} 
       set{sock = value;} 
      } 
     } 
    }
      

  3.   

    /***************************** chatClient ************************************/using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;namespace Chat_Client
    {
     /// <summary>
     /// Form1 的摘要说明。
     /// </summary>
     public class Form1 : System.Windows.Forms.Form
     {
      private System.Windows.Forms.CheckBox checkBox1;
      private System.Windows.Forms.StatusBar statusBar1;  NetworkStream ns;
      StreamReader sr;
      TcpClient clientsocket;
      bool connected;
      Thread receive;
      string serveraddress = "219.228.231.85";
      int serverport = 6666;  private System.Windows.Forms.RichTextBox rtbChatIn;
      private System.Windows.Forms.ListBox lbChatters;
      private System.Windows.Forms.TextBox ChatOut;
      private System.Windows.Forms.Button btnDisconnect;
      private System.Windows.Forms.Button btnSend;
      private System.Windows.Forms.TextBox clientName;  string clientname;
      private System.Windows.Forms.Button btnConnect;  private System.ComponentModel.Container components = null;  public Form1()
      {
       
       InitializeComponent();  }  /// <summary>
      /// 清理所有正在使用的资源。
      /// </summary>
      protected override void Dispose( bool disposing )
      {
       if( disposing )
       {
        if(receive != null)
        {
         QuitChat();
        }
        if (components != null) 
        {
         components.Dispose();
        }
       }
       base.Dispose( disposing );
      }  #region Windows 窗体设计器生成的代码
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {
       this.lbChatters = new System.Windows.Forms.ListBox();
       this.rtbChatIn = new System.Windows.Forms.RichTextBox();
       this.checkBox1 = new System.Windows.Forms.CheckBox();
       this.ChatOut = new System.Windows.Forms.TextBox();
       this.btnSend = new System.Windows.Forms.Button();
       this.statusBar1 = new System.Windows.Forms.StatusBar();
       this.btnDisconnect = new System.Windows.Forms.Button();
       this.clientName = new System.Windows.Forms.TextBox();
       this.btnConnect = new System.Windows.Forms.Button();
       this.SuspendLayout();
       // 
       // lbChatters
       // 
       this.lbChatters.ItemHeight = 12;
       this.lbChatters.Location = new System.Drawing.Point(32, 40);
       this.lbChatters.Name = "lbChatters";
       this.lbChatters.Size = new System.Drawing.Size(112, 172);
       this.lbChatters.TabIndex = 0;
       // 
       // rtbChatIn
       // 
       this.rtbChatIn.Location = new System.Drawing.Point(160, 40);
       this.rtbChatIn.Name = "rtbChatIn";
       this.rtbChatIn.Size = new System.Drawing.Size(208, 176);
       this.rtbChatIn.TabIndex = 2;
       this.rtbChatIn.Text = "";
       // 
       // checkBox1
       // 
       this.checkBox1.Location = new System.Drawing.Point(16, 248);
       this.checkBox1.Name = "checkBox1";
       this.checkBox1.TabIndex = 3;
       this.checkBox1.Text = "checkBox1";
       // 
       // ChatOut
       // 
       this.ChatOut.Location = new System.Drawing.Point(136, 248);
       this.ChatOut.Name = "ChatOut";
       this.ChatOut.Size = new System.Drawing.Size(136, 21);
       this.ChatOut.TabIndex = 4;
       this.ChatOut.Text = "message";
       // 
       // btnSend
       // 
       this.btnSend.Location = new System.Drawing.Point(336, 248);
       this.btnSend.Name = "btnSend";
       this.btnSend.TabIndex = 5;
       this.btnSend.Text = "send";
       this.btnSend.Click += new System.EventHandler(this.btnSend_Click);
       // 
       // statusBar1
       // 
       this.statusBar1.Location = new System.Drawing.Point(0, 287);
       this.statusBar1.Name = "statusBar1";
       this.statusBar1.Size = new System.Drawing.Size(464, 22);
       this.statusBar1.TabIndex = 6;
       this.statusBar1.Text = "statusBar1";
       // 
       // btnDisconnect
       // 
       this.btnDisconnect.Enabled = false;
       this.btnDisconnect.Location = new System.Drawing.Point(392, 112);
       this.btnDisconnect.Name = "btnDisconnect";
       this.btnDisconnect.Size = new System.Drawing.Size(64, 32);
       this.btnDisconnect.TabIndex = 7;
       this.btnDisconnect.Text = "断开";
       this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click);
       // 
       // clientName
       // 
       this.clientName.Location = new System.Drawing.Point(96, 8);
       this.clientName.Name = "clientName";
       this.clientName.TabIndex = 8;
       this.clientName.Text = "name";
       // 
       // btnConnect
       // 
       this.btnConnect.Location = new System.Drawing.Point(392, 56);
       this.btnConnect.Name = "btnConnect";
       this.btnConnect.Size = new System.Drawing.Size(64, 32);
       this.btnConnect.TabIndex = 9;
       this.btnConnect.Text = "连接";
       this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
       // 
       // Form1
       // 
       this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
       this.ClientSize = new System.Drawing.Size(464, 309);
       this.Controls.Add(this.btnConnect);
       this.Controls.Add(this.clientName);
       this.Controls.Add(this.btnDisconnect);
       this.Controls.Add(this.statusBar1);
       this.Controls.Add(this.btnSend);
       this.Controls.Add(this.ChatOut);
       this.Controls.Add(this.checkBox1);
       this.Controls.Add(this.rtbChatIn);
       this.Controls.Add(this.lbChatters);
       this.Name = "Form1";
       this.Text = "Form1";
       this.ResumeLayout(false);  }
      #endregion
      

  4.   

    /// <summary>
      /// 应用程序的主入口点。
      /// </summary>
      [STAThread]
      static void Main() 
      {
       Application.Run(new Form1());
      }  private void EstablishConnection() 
      { 
       statusBar1.Text = "正在连接到服务器"; 
       
       try 
       { 
        clientsocket = new TcpClient(serveraddress,serverport); 
        ns = clientsocket.GetStream(); 
        sr = new StreamReader(ns); 
        connected = true; 
       
       } 
       catch (Exception) 
       { 
        MessageBox.Show("不能连接到服务器!","错误", 
         MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
        statusBar1.Text = "已断开连接"; 
       } 
      }   private void RegisterWithServer() 
      { 
       lbChatters.Items.Clear();   clientname = clientName.Text;
       try 
       { 
        string command = "CONN|" + clientname; //+"\r\n"; 
        Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray()); 
        ns.Write(outbytes,0,outbytes.Length); 
        string serverresponse = sr.ReadLine(); 
        serverresponse.Trim(); 
        string[] tokens = serverresponse.Split('|'); 
        if(tokens[0] == "LIST") 
        { 
         statusBar1.Text = "已连接"; 
         btnDisconnect.Enabled = true; 
        }
        if(tokens[1] != "")
        {
         for(int n=1; n<tokens.Length;n++)
          lbChatters.Items.Add(tokens[n].Trim(new char[]{'\r','\n'})); 
        }
        this.Text = clientname + ":已连接到服务器";       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("注册时发生错误!"+ex.Message,"错误", 
         MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
        connected = false;
       } 
      }   private void ReceiveChat() 
      { 
       bool keepalive = true; 
       while (keepalive) 
       { 
        try 
        { 
         Byte[] buffer = new Byte[1024];  // 2048???
         ns.Read(buffer,0,buffer.Length); 
         string chatter = System.Text.Encoding.ASCII.GetString(buffer); 
         string[] tokens = chatter.Split(new Char[]{'|'});      if (tokens[0] == "CHAT") 
         { 
          rtbChatIn.AppendText(tokens[1]); 
    //      if(logging) 
    //       logwriter.WriteLine(tokens[1]); 
         } 
         if (tokens[0] == "PRIV") 
         { 
          rtbChatIn.AppendText("Private from "); 
          rtbChatIn.AppendText(tokens[1].Trim() ); 
          rtbChatIn.AppendText(tokens[2] + "\r\n"); 
    //      if(logging) 
    //      { 
    //       logwriter.Write("Private from "); 
    //       logwriter.Write(tokens[1].Trim() ); 
    //       logwriter.WriteLine(tokens[2] + "\r\n"); 
    //      } 
         } 
         if (tokens[0] == "JOIN") 
         { 
          rtbChatIn.AppendText(tokens[1].Trim() ); 
          rtbChatIn.AppendText(" has joined the Chat\r\n"); 
    //      if(logging) 
    //      { 
    //       logwriter.WriteLine(tokens[1]+" has joined the Chat"); 
    //      } 
          string newguy = tokens[1].Trim(new char[]{'\r','\n'}); 
          lbChatters.Items.Add(newguy); 
         } 
         if (tokens[0] == "GONE") 
         { 
          rtbChatIn.AppendText(tokens[1].Trim() ); 
          rtbChatIn.AppendText(" has left the Chat\r\n"); 
    //      if(logging) 
    //      { 
    //       logwriter.WriteLine(tokens[1]+" has left the Chat"); 
    //      } 
          lbChatters.Items.Remove(tokens[1].Trim(new char[]{'\r','\n'})); 
         } 
         if (tokens[0] == "QUIT") 
         { 
          ns.Close(); 
          clientsocket.Close(); 
          keepalive = false; 
          statusBar1.Text = "服务器端已停止"; 
          connected= false; 
          btnSend.Enabled = false; 
          btnDisconnect.Enabled = false; 
         } 
        } 
        catch(Exception){} 
       } 
      }   private void QuitChat() 
      { 
       if(connected) 
       { 
        try 
        { 
         string command = "GONE|" + clientname; 
         Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray()); 
         ns.Write(outbytes,0,outbytes.Length); 
         clientsocket.Close(); 
        } 
        catch(Exception ex) 
        { 
         MessageBox.Show(ex.Message);
        } 
       } 
    //   if(logging) 
    //    logwriter.Close(); 
       if(receive != null && receive.IsAlive) 
        receive.Abort(); 
       this.Text = "客户端"; 
       
       connected = false;  }  private void btnSend_Click(object sender, System.EventArgs e)
      {
       if(connected) 
       { 
        try 
        { 
         string command = "CHAT|" + clientname+": "+ChatOut.Text+"\r\n"; 
         Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray()); 
         ns.Write(outbytes,0,outbytes.Length); 
         //clientsocket.Close(); 
        } 
        catch(Exception ex) 
        { 
         MessageBox.Show(ex.Message);
        } 
       } 
      }  private void btnConnect_Click(object sender, System.EventArgs e)
      {
       EstablishConnection();
       RegisterWithServer();
       if(connected)
       {   
        receive = new Thread(new ThreadStart(ReceiveChat));
        receive.Start();
       }
      }  private void btnDisconnect_Click(object sender, System.EventArgs e)
      {
       QuitChat();
      }
     }
    }