Csharp/C Sharp/Network/Chat

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Chat Application

<source lang="csharp"> /* Professional Windows GUI Programming Using C# by Jay Glynn, Csaba Torok, Richard Conway, Wahid Choudhury,

  Zach Greenvoss, Shripad Kulkarni, Neil Whitlow

Publisher: Peer Information ISBN: 1861007663

  • /

using System; using System.Drawing; using System.Collections; using System.ruponentModel; using System.Windows.Forms; using System.Data; using System.Net; using System.IO; using System.Net.Sockets; using System.Threading; namespace Wrox.WindowsGUIProgramming.Chapter9 {

   /// <summary>
   /// Summary description for Form1.
   /// </summary>
   public class ChatApplication : System.Windows.Forms.Form
   {
       internal System.Windows.Forms.ListBox listBox1;
       private System.Windows.Forms.TextBox txtMessage;
       private System.Windows.Forms.Button btSend;
       /// <summary>
       /// Required designer variable.
       /// </summary>
       private System.ruponentModel.Container components = null;
       private System.Windows.Forms.ruboBox cmdHost;
       private System.Windows.Forms.CheckBox chkSuspendClient;
       private PeerConnection p = null;
       public ChatApplication()
       {
           //
           // Required for Windows Form Designer support
           //
           InitializeComponent();
           //
           // TODO: Add any constructor code after InitializeComponent call
           //
           p = new PeerConnection(4048, listBox1, cmdHost);
       }
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       protected override void Dispose( bool disposing )
       {
           if( disposing )
           {
               if (components != null) 
               {
                   components.Dispose();
               }
           }
           base.Dispose( disposing );
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           this.listBox1 = new System.Windows.Forms.ListBox();
           this.txtMessage = new System.Windows.Forms.TextBox();
           this.btSend = new System.Windows.Forms.Button();
           this.cmdHost = new System.Windows.Forms.ruboBox();
           this.chkSuspendClient = new System.Windows.Forms.CheckBox();
           this.SuspendLayout();
           // 
           // listBox1
           // 
           this.listBox1.Name = "listBox1";
           this.listBox1.Size = new System.Drawing.Size(688, 394);
           this.listBox1.TabIndex = 0;
           // 
           // txtMessage
           // 
           this.txtMessage.Location = new System.Drawing.Point(8, 408);
           this.txtMessage.Name = "txtMessage";
           this.txtMessage.Size = new System.Drawing.Size(576, 20);
           this.txtMessage.TabIndex = 1;
           this.txtMessage.Text = "";
           // 
           // btSend
           // 
           this.btSend.Location = new System.Drawing.Point(608, 408);
           this.btSend.Name = "btSend";
           this.btSend.TabIndex = 2;
           this.btSend.Text = "Send";
           this.btSend.Click += new System.EventHandler(this.btSend_Click);
           // 
           // cmdHost
           // 
           this.cmdHost.Location = new System.Drawing.Point(8, 432);
           this.cmdHost.Name = "cmdHost";
           this.cmdHost.Size = new System.Drawing.Size(520, 21);
           this.cmdHost.TabIndex = 3;
           this.cmdHost.Text = "localhost";
           // 
           // chkSuspendClient
           // 
           this.chkSuspendClient.Location = new System.Drawing.Point(544, 432);
           this.chkSuspendClient.Name = "chkSuspendClient";
           this.chkSuspendClient.Size = new System.Drawing.Size(152, 24);
           this.chkSuspendClient.TabIndex = 4;
           this.chkSuspendClient.Text = "Suspend Client";
           this.chkSuspendClient.CheckedChanged += new System.EventHandler(this.chkSuspendClient_CheckedChanged);
           // 
           // ChatApplication
           // 
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(688, 462);
           this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                         this.chkSuspendClient,
                                                                         this.cmdHost,
                                                                         this.btSend,
                                                                         this.txtMessage,
                                                                         this.listBox1});
           this.MaximizeBox = false;
           this.Name = "ChatApplication";
           this.Text = "Chat!";
           this.ResumeLayout(false);
       }
       #endregion
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
       static void Main() 
       {
           Application.Run(new ChatApplication());
       }
       private void btSend_Click(object sender, System.EventArgs e)
       {
           p.Write(txtMessage.Text);
       }
       private void chkSuspendClient_CheckedChanged(object sender, System.EventArgs e)
       {
           if(chkSuspendClient.Checked==true)
           {
               p.Enabled = true;
           }
           else
           {
               p.Enabled = false;
           }
       }
   }
   public class PeerConnection
   {
       private System.Net.Sockets.TcpListener peerListener = null;
       private System.Net.Sockets.TcpClient peerClient = null;
       private System.Net.Sockets.NetworkStream netStream = null;
       private Thread t1 = null;
       private IntPtr formHandle;
       private int port = 0;
       private bool clientEnabled = true;
       private ListBox lb;
       private ComboBox cmb;
       public PeerConnection(int port, ListBox formHandle, ComboBox cmdHost)
       {
           this.port = port;
           this.lb = formHandle;
           this.cmb = cmdHost;
           t1 = new Thread(new ThreadStart(CreateListener));
           t1.Name = "Listener Thread";
           t1.Priority = ThreadPriority.AboveNormal;
           t1.Start();
       }
       delegate void CallbackListbox(string message);
       void SetListboxString(string item)
       {
           lb.Items.Add(item);
       }
       private void CreateListener()
       {
           Socket tc = null;
           peerListener = new TcpListener(port);
           peerListener.Start();
           CallbackListbox clb = new CallbackListbox(SetListboxString);
           while(true)
           {
               tc = peerListener.AcceptSocket();
               byte[] byMessage = new byte[256];
               Thread.Sleep(500);
               int iLength = tc.Receive(byMessage, 0, byMessage.Length, SocketFlags.None); 
               if(iLength>0)
               {
                   string message = System.Text.Encoding.Default.GetString(byMessage);
                   try
                   {
                       if(lb.InvokeRequired) lb.Invoke(clb, new object[]{message});
                   }
                   catch(Exception e)
                   {
                       message = e.Message;
                   }
                   finally
                   {
                       System.Diagnostics.Debug.WriteLine(message);
                   }
               }
           }
       }
       private void CreateClient(object message)
       {
           peerClient = new TcpClient();
           peerClient.Connect(cmb.SelectedText, port);
           netStream = peerClient.GetStream();
           StreamWriter sw = new StreamWriter(netStream);
           sw.Write((string)message);
           sw.Flush();
           peerClient.Close();
       }
       internal void Write(string message)
       {
           ThreadPool.QueueUserWorkItem(new WaitCallback(CreateClient), message);
       }
       internal bool Enabled
       {
           set
           {
               if(t1.ThreadState==ThreadState.Suspended&&value==true)
               {
                   t1.Resume();
               }
               else if(t1.ThreadState!=ThreadState.Suspended&&value==false)
               {
                   t1.Suspend();
               }
               clientEnabled = value;
           }
           get
           {
               return clientEnabled;
           }   
       }
   }

}


      </source>


Multicast Chat

<source lang="csharp"> /* C# Network Programming by Richard Blum Publisher: Sybex ISBN: 0782141765

  • /

using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; public class MulticastChat : Form {

  TextBox newText;
  ListBox results;
  Socket sock;
  Thread receiver;
  IPEndPoint multiep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050);
  public MulticastChat()
  {
     Text = "Multicast Chat Program";
     Size = new Size(400, 380);
     Label label1 = new Label();
     label1.Parent = this;
     label1.Text = "Enter text string:";
     label1.AutoSize = true;
     label1.Location = new Point(10, 30);
     newText = new TextBox();
     newText.Parent = this;
     newText.Size = new Size(200, 2 * Font.Height);
     newText.Location = new Point(10, 55);
     results = new ListBox();
     results.Parent = this;
     results.Location = new Point(10, 85);
     results.Size = new Size(360, 18 * Font.Height);
     Button sendit = new Button();
     sendit.Parent = this;
     sendit.Text = "Send";
     sendit.Location = new Point(220,52);
     sendit.Size = new Size(5 * Font.Height, 2 * Font.Height);
     sendit.Click += new EventHandler(ButtonSendOnClick);
     Button closeit = new Button();
     closeit.Parent = this;
     closeit.Text = "Close";
     closeit.Location = new Point(290, 52);
     closeit.Size = new Size(5 * Font.Height, 2 * Font.Height);
     closeit.Click += new EventHandler(ButtonCloseOnClick);
     sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
     IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
     sock.Bind(iep);
     sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.100.0.1")));
     receiver = new Thread(new ThreadStart(packetReceive));
     receiver.IsBackground = true;
     receiver.Start();
  }
  void ButtonSendOnClick(object obj, EventArgs ea)
  {
     byte[] message = Encoding.ASCII.GetBytes(newText.Text);
     newText.Clear();
     sock.SendTo(message, SocketFlags.None, multiep);
  }
  void ButtonCloseOnClick(object obj, EventArgs ea)
  {
     receiver.Abort();
     sock.Close();
     Close();
  }
  void packetReceive()
  {
     EndPoint ep = (EndPoint)multiep;
     byte[] data = new byte[1024];
     string stringData;
     int recv;
     while (true)
     {
        recv = sock.ReceiveFrom(data, ref ep);
        stringData = Encoding.ASCII.GetString(data, 0, recv);
        results.Items.Add("from " + ep.ToString() + ":  " + stringData);
     }
  }
  public static void Main()
  {
     Application.Run(new MulticastChat());
  }

}

      </source>


New Tcp Chat

<source lang="csharp"> /* C# Network Programming by Richard Blum Publisher: Sybex ISBN: 0782141765

  • /

using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms;

public class NewTcpChat : Form {

  private static TextBox newText;
  private static ListBox results;
  private static ListBox hosts;
  private static Socket client;
  private static byte[] data = new byte[1024];
  public NewTcpChat()
  {
     Text = "New TCP Chat Program";
     Size = new Size(400, 380);
     
     Label label1 = new Label();
     label1.Parent = this;
     label1.Text = "Enter text string:";
     label1.AutoSize = true;
     label1.Location = new Point(10, 30);
     newText = new TextBox();
     newText.Parent = this;
     newText.Size = new Size(200, 2 * Font.Height);
     newText.Location = new Point(10, 55);
     results = new ListBox();
     results.Parent = this;
     results.Location = new Point(10, 85);
     results.Size = new Size(360, 10 * Font.Height);
     Label label2 = new Label();
     label2.Parent = this;
     label2.Text = "Active hosts";
     label2.AutoSize = true;
     label2.Location = new Point(10, 240);
     hosts = new ListBox();
     hosts.Parent = this;
     hosts.Location = new Point(10, 255);
     hosts.Size = new Size(360, 5 * Font.Height);
     Button sendit = new Button();
     sendit.Parent = this;
     sendit.Text = "Send";
     sendit.Location = new Point(220,52);
     sendit.Size = new Size(5 * Font.Height, 2 * Font.Height);
     sendit.Click += new EventHandler(ButtonSendOnClick);
     Button connect = new Button();
     connect.Parent = this;
     connect.Text = "Connect";
     connect.Location = new Point(295, 20);
     connect.Size = new Size(6 * Font.Height, 2 * Font.Height);
     connect.Click += new EventHandler(ButtonConnectOnClick);
     Button listen = new Button();
     listen.Parent = this;
     listen.Text = "Listen";
     listen.Location = new Point(295,52);
     listen.Size = new Size(6 * Font.Height, 2 * Font.Height);
     listen.Click += new EventHandler(ButtonListenOnClick);
     Thread fh = new Thread(new ThreadStart(findHosts));
     fh.IsBackground = true;
     fh.Start();
  }
  void ButtonListenOnClick(object obj, EventArgs ea)
  {
     results.Items.Add("Listening for a client...");
     Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
     newsock.Bind(iep);
     newsock.Listen(5);
     newsock.BeginAccept(new AsyncCallback(AcceptConn), newsock);
     Thread advertise = new Thread(new ThreadStart(srvrAdvertise));
     advertise.IsBackground = true;
     advertise.Start();
  }
  void ButtonConnectOnClick(object obj, EventArgs ea)
  {
     results.Items.Add("Connecting...");
     client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     string selectedhost = (string)hosts.SelectedItem;
     string[] hostarray = selectedhost.Split(":");
     IPEndPoint iep = new IPEndPoint(IPAddress.Parse(hostarray[1]), 9050);
     client.BeginConnect(iep, new AsyncCallback(Connected), client);
  }
  void ButtonSendOnClick(object obj, EventArgs ea)
  {
     byte[] message = Encoding.ASCII.GetBytes(newText.Text);
     newText.Clear();
     client.BeginSend(message, 0, message.Length, 0, new AsyncCallback(SendData), client);
  }
  void AcceptConn(IAsyncResult iar)
  {
     Socket oldserver = (Socket)iar.AsyncState;
     client = oldserver.EndAccept(iar);
     results.Items.Add("Connection from: " + client.RemoteEndPoint.ToString());
     Thread receiver = new Thread(new ThreadStart(ReceiveData));
     receiver.IsBackground = true;
     receiver.Start();
  }
  void Connected(IAsyncResult iar)
  {
     try
     {
        client.EndConnect(iar);
        results.Items.Add("Connected to: " + client.RemoteEndPoint.ToString());
        Thread receiver = new Thread(new ThreadStart(ReceiveData));
        receiver.IsBackground = true;
        receiver.Start();
     } catch (SocketException)
     {
        results.Items.Add("Error connecting");
     }
  }
  void SendData(IAsyncResult iar)
  {
     Socket remote = (Socket)iar.AsyncState;
     int sent = remote.EndSend(iar);
  }
  void ReceiveData()
  {
     int recv;
     string stringData;
     while (true)
     {
        recv = client.Receive(data);
        stringData = Encoding.ASCII.GetString(data, 0, recv);
        if (stringData == "bye")
           break;
        results.Items.Add(stringData);
     }
     stringData = "bye";
     byte[] message = Encoding.ASCII.GetBytes(stringData);
     client.Send(message);
     client.Close();
     results.Items.Add("Connection stopped");
     return;
  }
  void srvrAdvertise()
  {
     Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
     server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
     IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9051);
     byte[] hostname = Encoding.ASCII.GetBytes(Dns.GetHostName());
     while (true)
     {
        server.SendTo(hostname, iep);
        Thread.Sleep(60000);
     }
  }
  void findHosts()
  {
     while(true)
     {
        Socket remoteHosts = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9051);
        EndPoint ep = (EndPoint)iep;
        remoteHosts.Bind(iep);
        byte[] data = new byte[1024];
        int recv = remoteHosts.ReceiveFrom(data, ref ep);
        string stringData = Encoding.ASCII.GetString(data, 0, recv);
        string entry = stringData + ":" + ep.ToString();
        if (!hosts.Items.Contains(entry))
           hosts.Items.Add(entry);
     }
  }
  public static void Main()
  {
     Application.Run(new NewTcpChat());
  }

}

      </source>


Tcp Chat

<source lang="csharp"> /* C# Network Programming by Richard Blum Publisher: Sybex ISBN: 0782141765

  • /

using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms;

public class TcpChat : Form {

  private static TextBox newText;
  private static ListBox results;
  private static Socket client;
  private static byte[] data = new byte[1024];
  public TcpChat()
  {
     Text = "TCP Chat Program";
     Size = new Size(400, 380);
     
     Label label1 = new Label();
     label1.Parent = this;
     label1.Text = "Enter text string:";
     label1.AutoSize = true;
     label1.Location = new Point(10, 30);
     newText = new TextBox();
     newText.Parent = this;
     newText.Size = new Size(200, 2 * Font.Height);
     newText.Location = new Point(10, 55);
     results = new ListBox();
     results.Parent = this;
     results.Location = new Point(10, 85);
     results.Size = new Size(360, 18 * Font.Height);
     Button sendit = new Button();
     sendit.Parent = this;
     sendit.Text = "Send";
     sendit.Location = new Point(220,52);
     sendit.Size = new Size(5 * Font.Height, 2 * Font.Height);
     sendit.Click += new EventHandler(ButtonSendOnClick);
     Button connect = new Button();
     connect.Parent = this;
     connect.Text = "Connect";
     connect.Location = new Point(295, 20);
     connect.Size = new Size(6 * Font.Height, 2 * Font.Height);
     connect.Click += new EventHandler(ButtonConnectOnClick);
     Button listen = new Button();
     listen.Parent = this;
     listen.Text = "Listen";
     listen.Location = new Point(295,52);
     listen.Size = new Size(6 * Font.Height, 2 * Font.Height);
     listen.Click += new EventHandler(ButtonListenOnClick);
  }
  void ButtonListenOnClick(object obj, EventArgs ea)
  {
     results.Items.Add("Listening for a client...");
     Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
     newsock.Bind(iep);
     newsock.Listen(5);
     newsock.BeginAccept(new AsyncCallback(AcceptConn), newsock);
  }
  void ButtonConnectOnClick(object obj, EventArgs ea)
  {
     results.Items.Add("Connecting...");
     client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
     client.BeginConnect(iep, new AsyncCallback(Connected), client);
  }
  void ButtonSendOnClick(object obj, EventArgs ea)
  {
     byte[] message = Encoding.ASCII.GetBytes(newText.Text);
     newText.Clear();
     client.BeginSend(message, 0, message.Length, 0, new AsyncCallback(SendData), client);
  }
  void AcceptConn(IAsyncResult iar)
  {
     Socket oldserver = (Socket)iar.AsyncState;
     client = oldserver.EndAccept(iar);
     results.Items.Add("Connection from: " + client.RemoteEndPoint.ToString());
     Thread receiver = new Thread(new ThreadStart(ReceiveData));
     receiver.Start();
  }
  void Connected(IAsyncResult iar)
  {
     try
     {
        client.EndConnect(iar);
        results.Items.Add("Connected to: " + client.RemoteEndPoint.ToString());
        Thread receiver = new Thread(new ThreadStart(ReceiveData));
        receiver.Start();
     } catch (SocketException)
     {
        results.Items.Add("Error connecting");
     }
  }
  void SendData(IAsyncResult iar)
  {
     Socket remote = (Socket)iar.AsyncState;
     int sent = remote.EndSend(iar);
  }
  void ReceiveData()
  {
     int recv;
     string stringData;
     while (true)
     {
        recv = client.Receive(data);
        stringData = Encoding.ASCII.GetString(data, 0, recv);
        if (stringData == "bye")
           break;
        results.Items.Add(stringData);
     }
     stringData = "bye";
     byte[] message = Encoding.ASCII.GetBytes(stringData);
     client.Send(message);
     client.Close();
     results.Items.Add("Connection stopped");
     return;
  }
  public static void Main()
  {
     Application.Run(new TcpChat());
  }

}

      </source>