Form1.cs
上传用户:yiyuerguo
上传日期:2014-09-27
资源大小:3781k
文件大小:5k
源码类别:

C#编程

开发平台:

Others

  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. /// Form1 的摘要说明。
  14. /// </summary>
  15. public class Form1 : System.Windows.Forms.Form
  16. {
  17. private int listenport = 5555;
  18. private TcpListener listener;
  19. private ArrayList clients;
  20. private Thread processor;
  21. private Socket clientsocket;
  22. private Thread clientservice;
  23. private System.Windows.Forms.ListBox lbClients;
  24. /// <summary>
  25. /// 必需的设计器变量。
  26. /// </summary>
  27. private System.ComponentModel.Container components = null;
  28. public Form1()
  29. {
  30. //
  31. // Windows 窗体设计器支持所必需的
  32. //
  33. InitializeComponent();
  34. //
  35. // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  36. //
  37. clients = new ArrayList();
  38. processor = new Thread(new ThreadStart(StartListening));
  39. processor.Start();
  40. }
  41. /// <summary>
  42. /// 清理所有正在使用的资源。
  43. /// </summary>
  44. protected override void Dispose( bool disposing )
  45. {
  46. if( disposing )
  47. {
  48. if (components != null) 
  49. {
  50. components.Dispose();
  51. }
  52. }
  53. base.Dispose( disposing );
  54. }
  55. #region Windows Form Designer generated code
  56. /// <summary>
  57. /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  58. /// 此方法的内容。
  59. /// </summary>
  60. private void InitializeComponent()
  61. {
  62. this.lbClients = new System.Windows.Forms.ListBox();
  63. this.SuspendLayout();
  64. // 
  65. // lbClients
  66. // 
  67. this.lbClients.ItemHeight = 12;
  68. this.lbClients.Location = new System.Drawing.Point(24, 24);
  69. this.lbClients.Name = "lbClients";
  70. this.lbClients.Size = new System.Drawing.Size(248, 232);
  71. this.lbClients.TabIndex = 0;
  72. // 
  73. // Form1
  74. // 
  75. this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  76. this.ClientSize = new System.Drawing.Size(292, 273);
  77. this.Controls.AddRange(new System.Windows.Forms.Control[] {
  78.   this.lbClients});
  79. this.Name = "Form1";
  80. this.Text = "服务器端";
  81. this.ResumeLayout(false);
  82. }
  83. #endregion
  84. private void StartListening()
  85. {
  86. listener = new TcpListener(listenport);
  87. listener.Start();
  88. while (true) 
  89. {
  90. try
  91. {
  92. Socket s = listener.AcceptSocket();
  93. clientsocket = s;
  94. clientservice = new Thread(new ThreadStart(ServiceClient));
  95. clientservice.Start();
  96. }
  97. catch(Exception e)
  98. {
  99. Console.WriteLine(e.ToString() );
  100. }
  101. }
  102. }
  103. private void ServiceClient()
  104. {
  105. Socket client = clientsocket;
  106. bool keepalive = true;
  107. while (keepalive)
  108. {
  109. Byte[] buffer = new Byte[1024];
  110. client.Receive(buffer);
  111. string clientcommand = System.Text.Encoding.ASCII.GetString(buffer);
  112. string[] tokens = clientcommand.Split(new Char[]{'|'});
  113. Console.WriteLine(clientcommand);
  114. if (tokens[0] == "CONN")
  115. {
  116. for(int n=0; n<clients.Count; n++) 
  117. {
  118. Client cl = (Client)clients[n];
  119. SendToClient(cl, "JOIN|" + tokens[1]);
  120. }
  121. EndPoint ep = client.RemoteEndPoint;
  122. Client c = new Client(tokens[1], ep, clientservice, client);
  123. clients.Add(c);
  124. string message = "LIST|" + GetChatterList() +"rn";
  125. SendToClient(c, message);
  126. lbClients.Items.Add(c);
  127. }
  128. if (tokens[0] == "CHAT")
  129. {
  130. for(int n=0; n<clients.Count; n++)
  131. {
  132. Client cl = (Client)clients[n];
  133. SendToClient(cl, clientcommand);
  134. }
  135. }
  136. if (tokens[0] == "PRIV") 
  137. {
  138. string destclient = tokens[3];
  139. for(int n=0; n<clients.Count; n++) 
  140. {
  141. Client cl = (Client)clients[n];
  142. if(cl.Name.CompareTo(tokens[3]) == 0)
  143. SendToClient(cl, clientcommand);
  144. if(cl.Name.CompareTo(tokens[1]) == 0)
  145. SendToClient(cl, clientcommand);
  146. }
  147. }
  148. if (tokens[0] == "GONE")
  149. {
  150. int remove = 0;
  151. bool found = false;
  152. int c = clients.Count;
  153. for(int n=0; n<c; n++)
  154. {
  155. Client cl = (Client)clients[n];
  156. SendToClient(cl, clientcommand);
  157. if(cl.Name.CompareTo(tokens[1]) == 0)
  158. {
  159. remove = n;
  160. found = true;
  161. lbClients.Items.Remove(cl);
  162. }
  163. }
  164. if(found)
  165. clients.RemoveAt(remove);
  166. client.Close();
  167. keepalive = false;
  168. }
  169. }
  170. private void SendToClient(Client cl, string message)
  171. {
  172. try
  173. {
  174. byte[] buffer = System.Text.Encoding.ASCII.GetBytes(message.ToCharArray());
  175. cl.Sock.Send(buffer,buffer.Length,0);
  176. }
  177. catch(Exception)
  178. {
  179. cl.Sock.Close();
  180. cl.CLThread.Abort();
  181. clients.Remove(cl);
  182. lbClients.Items.Remove(cl.Name + " : " + cl.Host.ToString());
  183. }
  184. }
  185. private string GetChatterList()
  186. {
  187. string chatters = "";
  188. for(int n=0; n<clients.Count; n++)
  189. {
  190. Client cl = (Client)clients[n];
  191. chatters += cl.Name;
  192. chatters += "|";
  193. }
  194. chatters.Trim(new char[]{'|'});
  195. return chatters;
  196. }
  197. /// <summary>
  198. /// 应用程序的主入口点。
  199. /// </summary>
  200. [STAThread]
  201. static void Main() 
  202. {
  203. Application.Run(new Form1());
  204. }
  205. }
  206. }