ChatServerForm.cs
上传用户:kenve1
上传日期:2008-04-28
资源大小:35k
文件大小:6k
源码类别:

ICQ/即时通讯

开发平台:

C#

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Threading;
  10. namespace ChatServer
  11. {
  12. /// <summary>
  13. /// Summary description for Form1.
  14. /// </summary>
  15. public class ChatServer : System.Windows.Forms.Form
  16. {
  17. /// <summary>
  18. /// Required designer variable.
  19. /// </summary>
  20. private System.ComponentModel.Container components = null;
  21. private int listenport = 5555;
  22. private TcpListener listener;
  23. private System.Windows.Forms.ListBox lbClients;
  24. private ArrayList clients;
  25. private Thread processor;
  26. private Socket clientsocket;
  27. private Thread clientservice;
  28. public ChatServer()
  29. {
  30. //
  31. // Required for Windows Form Designer support
  32. //
  33. InitializeComponent();
  34. clients = new ArrayList();
  35. processor = new Thread(new ThreadStart(StartListening));
  36. processor.Start();
  37. }
  38. /// <summary>
  39. /// Clean up any resources being used.
  40. /// </summary>
  41. protected override void Dispose( bool disposing )
  42. {
  43. if( disposing )
  44. {
  45. if (components != null) 
  46. {
  47. components.Dispose();
  48. }
  49. }
  50. base.Dispose( disposing );
  51. }
  52. #region Windows Form Designer generated code
  53. /// <summary>
  54. /// Required method for Designer support - do not modify
  55. /// the contents of this method with the code editor.
  56. /// </summary>
  57. private void InitializeComponent()
  58. {
  59. this.lbClients = new System.Windows.Forms.ListBox();
  60. this.SuspendLayout();
  61. // 
  62. // lbClients
  63. // 
  64. this.lbClients.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  65. this.lbClients.ItemHeight = 16;
  66. this.lbClients.Location = new System.Drawing.Point(16, 8);
  67. this.lbClients.Name = "lbClients";
  68. this.lbClients.Size = new System.Drawing.Size(264, 228);
  69. this.lbClients.TabIndex = 0;
  70. // 
  71. // ChatServer
  72. // 
  73. this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  74. this.ClientSize = new System.Drawing.Size(292, 273);
  75. this.Controls.AddRange(new System.Windows.Forms.Control[] {
  76.   this.lbClients});
  77. this.Name = "ChatServer";
  78. this.Text = "ChatServer";
  79. this.ResumeLayout(false);
  80. }
  81. #endregion
  82. protected override void OnClosed(EventArgs e)
  83. {
  84. try
  85. {
  86. for(int n=0; n<clients.Count; n++)
  87. {
  88. Client cl = (Client)clients[n];
  89. SendToClient(cl, "QUIT|");
  90. cl.Sock.Close();
  91. cl.CLThread.Abort();
  92. }
  93. listener.Stop();
  94. if(processor != null)
  95. processor.Abort();
  96. }
  97. catch(Exception ex)
  98. {
  99. Console.WriteLine(ex.ToString() );
  100. }
  101. base.OnClosed(e);
  102. }
  103. private void StartListening()
  104. {
  105. listener = new TcpListener(listenport);
  106. listener.Start();
  107. while (true) {
  108. try
  109. {
  110. Socket s = listener.AcceptSocket();
  111. clientsocket = s;
  112. clientservice = new Thread(new ThreadStart(ServiceClient));
  113. clientservice.Start();
  114. }
  115. catch(Exception e)
  116. {
  117. Console.WriteLine(e.ToString() );
  118. }
  119. }
  120. //listener.Stop();
  121. }
  122. private void ServiceClient()
  123. {
  124. Socket client = clientsocket;
  125. bool keepalive = true;
  126. while (keepalive)
  127. {
  128. Byte[] buffer = new Byte[1024];
  129. client.Receive(buffer);
  130. string clientcommand = System.Text.Encoding.ASCII.GetString(buffer);
  131. string[] tokens = clientcommand.Split(new Char[]{'|'});
  132. Console.WriteLine(clientcommand);
  133. if (tokens[0] == "CONN")
  134. {
  135. for(int n=0; n<clients.Count; n++) {
  136. Client cl = (Client)clients[n];
  137. SendToClient(cl, "JOIN|" + tokens[1]);
  138. }
  139. EndPoint ep = client.RemoteEndPoint;
  140. //string add = ep.ToString();
  141. Client c = new Client(tokens[1], ep, clientservice, client);
  142. clients.Add(c);
  143. string message = "LIST|" + GetChatterList() +"rn";
  144. SendToClient(c, message);
  145. //lbClients.Items.Add(c.Name + " : " + c.Host.ToString());
  146. lbClients.Items.Add(c);
  147. }
  148. if (tokens[0] == "CHAT")
  149. {
  150. for(int n=0; n<clients.Count; n++)
  151. {
  152. Client cl = (Client)clients[n];
  153. SendToClient(cl, clientcommand);
  154. }
  155. }
  156. if (tokens[0] == "PRIV") {
  157. string destclient = tokens[3];
  158. for(int n=0; n<clients.Count; n++) {
  159. Client cl = (Client)clients[n];
  160. if(cl.Name.CompareTo(tokens[3]) == 0)
  161. SendToClient(cl, clientcommand);
  162. if(cl.Name.CompareTo(tokens[1]) == 0)
  163. SendToClient(cl, clientcommand);
  164. }
  165. }
  166. if (tokens[0] == "GONE")
  167. {
  168. int remove = 0;
  169. bool found = false;
  170. int c = clients.Count;
  171. for(int n=0; n<c; n++)
  172. {
  173. Client cl = (Client)clients[n];
  174. SendToClient(cl, clientcommand);
  175. if(cl.Name.CompareTo(tokens[1]) == 0)
  176. {
  177. remove = n;
  178. found = true;
  179. lbClients.Items.Remove(cl);
  180. //lbClients.Items.Remove(cl.Name + " : " + cl.Host.ToString());
  181. }
  182. }
  183. if(found)
  184. clients.RemoveAt(remove);
  185. client.Close();
  186. keepalive = false;
  187. }
  188. }
  189. private void SendToClient(Client cl, string message)
  190. {
  191. try{
  192. byte[] buffer = System.Text.Encoding.ASCII.GetBytes(message.ToCharArray());
  193. cl.Sock.Send(buffer,buffer.Length,0);
  194. }
  195. catch(Exception e){
  196. cl.Sock.Close();
  197. cl.CLThread.Abort();
  198. clients.Remove(cl);
  199. lbClients.Items.Remove(cl.Name + " : " + cl.Host.ToString());
  200. //MessageBox.Show("Could not reach " + cl.Name + " - disconnected","Error",
  201. //MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  202. }
  203. }
  204. private string GetChatterList()
  205. {
  206. string chatters = "";
  207. for(int n=0; n<clients.Count; n++)
  208. {
  209. Client cl = (Client)clients[n];
  210. chatters += cl.Name;
  211. chatters += "|";
  212. }
  213. chatters.Trim(new char[]{'|'});
  214. return chatters;
  215. }
  216. /// <summary>
  217. /// The main entry point for the application.
  218. /// </summary>
  219. [STAThread]
  220. static void Main() 
  221. {
  222. Application.Run(new ChatServer());
  223. }
  224. }
  225. }