/* 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.ComponentModel; 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.ComponentModel.Container components = null; private System.Windows.Forms.ComboBox 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.ComboBox(); 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; } } } }