.NET 2.x Многопользовательский чат на TcpClient - C#

Узнай цену своей работы

Формулировка задачи:

Решил написать чат. сервер:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Net.Sockets;
  7. using System.Net;
  8. using System.Runtime.InteropServices;
  9. namespace ConsoleApplication1
  10. {
  11. class Program
  12. {
  13.  
  14. const int port=3128;
  15. public static List<user> users = new List<user>();
  16. public static user tmpuser = new user();
  17. public static TcpListener listener;
  18. public static Thread conn;
  19. static bool doneserver;
  20. public static string host = Dns.GetHostName();
  21. public static string myIp = Dns.GetHostByName(host).AddressList[0].ToString();
  22. static void Main(string[] args)
  23. {
  24. IPAddress localhost = IPAddress.Parse(myIp);
  25. listener = new TcpListener(localhost, port);
  26. listener.Start();
  27. Console.WriteLine("Сервер запущен...\r\n");
  28. conn = new Thread(connection);
  29. conn.Start();
  30. }
  31. static string ReadMessage(TcpClient client)
  32. {
  33. byte[] buffer = new byte[256];
  34. int totalRead = 0;
  35. do
  36. {
  37. int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
  38. totalRead += read;
  39. } while (client.GetStream().DataAvailable);
  40. return Encoding.Unicode.GetString(buffer, 0, totalRead);
  41. }
  42. public static void connection()
  43. {
  44. doneserver = false;
  45. Thread thread;
  46. while (!doneserver)
  47. {
  48. TcpClient client = listener.AcceptTcpClient();
  49. Console.WriteLine("Клиент подключен. IP:{0}",client.Client.RemoteEndPoint.ToString());
  50. thread = new Thread(new ParameterizedThreadStart(HandledientThread));
  51. thread.Start(client);
  52. }
  53. }
  54. static void HandledientThread(object obj)
  55. {
  56. TcpClient clientid = obj as TcpClient;
  57. bool done = false;
  58. while (!done)
  59. {
  60. string message = ReadMessage(clientid);
  61. string flag = "";
  62. string mess = "";
  63. flag += message[0];
  64. //////////////если прислал сообщение////////
  65. if (flag == "m")
  66. {
  67. Console.WriteLine("log::m::{0}",message);
  68. for (int i = 1; i < message.Length; i++)
  69. {
  70. mess += message[i];
  71. }
  72. Console.WriteLine(mess);
  73. SendMessageAll(clientid, mess, "m");
  74. }
  75. //////////////если прислал ник///////////////
  76. if (flag == "n")
  77. {
  78. for (int i = 1; i < message.Length; i++)
  79. {
  80. mess += message[i];
  81. }
  82. tmpuser.add(mess, clientid);
  83. users.Add(tmpuser);
  84. SendMessageAll(clientid, mess, "a");
  85. mess = "";
  86. Console.WriteLine("//////////////////////////////////////");
  87. foreach (user tmp in users)
  88. {
  89. Console.Write("name:{0}",tmp.name);
  90. Console.WriteLine("klient:{0}", tmp.klient.Client.RemoteEndPoint.ToString());
  91. if(clientid!=tmp.klient)
  92. mess += tmp.name + ";";
  93. }
  94. Console.WriteLine("///////////////////////////////////////");
  95. Console.Write("log:::n:::{0}", mess);
  96. SendMessage(clientid, mess, "l");
  97. }
  98. ///////////////если отключился/////////////
  99. if (flag == "o")
  100. {
  101. Console.WriteLine("log::o::{0}", message);
  102. for (int i = 1; i < message.Length; i++)
  103. {
  104. mess += message[i];
  105. }
  106. SendMessageAll(clientid,mess, "z");
  107. user tmp2 = new user();
  108. foreach (user tmp in users)
  109. {
  110. if (tmp.klient == clientid)
  111. {
  112. tmp2.add(tmp.name, tmp.klient);
  113. }
  114. }
  115. users.Remove(tmp2);
  116. done = true;
  117. }
  118. }
  119. Console.WriteLine("Клиент отключен. IP:{0}",clientid.Client.RemoteEndPoint);
  120. clientid.Close();
  121. }
  122.  
  123. static void SendMessage(TcpClient client, string message, string flag)
  124. {
  125. flag += message;
  126. byte[] bytes = Encoding.Unicode.GetBytes(flag);
  127. client.GetStream().Write(bytes, 0, bytes.Length);
  128. }
  129. static void SendMessageAll(TcpClient client, string message, string flag)
  130. {
  131. flag += message;
  132. byte[] bytes = Encoding.Unicode.GetBytes(flag);
  133. foreach (user tmp in users)
  134. {
  135. if (tmp.klient!=client)
  136. tmp.klient.GetStream().Write(bytes, 0, bytes.Length);
  137. }
  138. }
  139. }
  140. public class user
  141. {
  142. public int id;
  143. public string name;
  144. public TcpClient klient;
  145. public void add(int aid, string aname, TcpClient aklient)
  146. {
  147. id = aid;
  148. name = aname;
  149. klient = aklient;
  150. }
  151. }
  152. }
Клиент:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net.NetworkInformation;
  9. using System.Net.Sockets;
  10. using System.Net;
  11. using System.Threading;
  12. using System.Runtime.Serialization.Formatters.Binary;
  13. namespace Внутреняя_ICQ_Клиент_
  14. {
  15. public partial class Form1 : Form
  16. {
  17. IPAddress ipserver;
  18. int port;
  19. TcpClient clientkl;
  20. Thread read;
  21. public string NIK;
  22. public Form1()
  23. {
  24. InitializeComponent();
  25. }
  26. private void пользователиВСетиToolStripMenuItem_Click(object sender, EventArgs e)
  27. {
  28. if (textBox1.Text != "")
  29. {
  30. NIK = textBox1.Text;
  31. ipserver=IPAddress.Parse(textBox2.Text.ToString());
  32. port=Convert.ToInt32(textBox5.Text);
  33. if (пользователиВСетиToolStripMenuItem.Text == "Подключиться")
  34. {
  35. пользователиВСетиToolStripMenuItem.Text = "Отключиться";
  36. ///////вкладки///////////////
  37. panelmessage.Visible = true;
  38. panellogin.Visible = false;
  39. panelconfig.Visible=false;
  40. /////////////////////////////
  41. try
  42. {
  43. clientkl = new TcpClient();
  44. clientkl.Connect(ipserver, port);
  45. SendMessage(clientkl, NIK, "n");
  46. read = new Thread(new ParameterizedThreadStart(Read));
  47. read.Start(clientkl);
  48. }
  49. catch
  50. {
  51. MessageBox.Show("[X] Сервер не доступен!");
  52. пользователиВСетиToolStripMenuItem.Text = "Подключиться";
  53. ///////вкладки///////////////
  54. panelmessage.Visible = false;
  55. panellogin.Visible = true;
  56. panelconfig.Visible = false;
  57. /////////////////////////////
  58. //read.Abort();
  59. clientkl.Close();
  60. }
  61. }
  62. else
  63. {
  64. ///////вкладки///////////////
  65. panelmessage.Visible = false;
  66. panellogin.Visible = true;
  67. panelconfig.Visible=false;
  68. /////////////////////////////
  69. пользователиВСетиToolStripMenuItem.Text = "Подключиться";
  70. SendMessage(clientkl, NIK, "o");
  71. }
  72. }
  73. else
  74. {
  75. ///////вкладки///////////////
  76. panelmessage.Visible = false;
  77. panellogin.Visible = true;
  78. panelconfig.Visible = false;
  79. /////////////////////////////
  80. MessageBox.Show("Введите НИК");
  81. textBox1.Focus();
  82. }
  83. }
  84. private void настройкиToolStripMenuItem_Click(object sender, EventArgs e)
  85. {
  86. ///////вкладки///////////////
  87. panelmessage.Visible = false;
  88. panellogin.Visible = false;
  89. panelconfig.Visible = true;
  90. /////////////////////////////
  91. }
  92.  
  93. private static void SendMessage(TcpClient client, string message, string flag)
  94. {
  95. flag += message;
  96. byte[] bytes = Encoding.Unicode.GetBytes(flag);
  97. client.GetStream().Write(bytes, 0, bytes.Length);
  98. }
  99. public void Read(object obj)
  100. {
  101. TcpClient client = obj as TcpClient;
  102. bool done = false;
  103. while (!done)
  104. {
  105. try
  106. {
  107. string message = ReadResponse(client);
  108. string flag = "";
  109. string mess = "";
  110. flag += message[0];
  111. //////////////если сообщение/////////////
  112. if (flag == "m")
  113. {
  114. richTextBox1.Text += "log: " + message + "\r\n";
  115. for (int i = 1; i < message.Length; i++)
  116. {
  117. mess += message[i];
  118. }
  119. richTextBox1.Text += mess + "\r\n";
  120. }
  121. ///////////////если список/////////////
  122. if (flag == "l")
  123. {
  124. richTextBox1.Text += "log: " + message + "\r\n";
  125. for (int i = 1; i < message.Length; i++)
  126. {
  127. if (message[i] != ';')
  128. {
  129. mess += message[i];
  130. }
  131. else
  132. {
  133. listBox1.Items.Add(mess);
  134. mess = "";
  135. }
  136. }
  137. }
  138. //////////////////если ушел кто-то////////////
  139. if (flag == "z")
  140. {
  141. richTextBox1.Text += "log: " + message + "\r\n";
  142. for (int i = 1; i < message.Length; i++)
  143. {
  144. mess += message[i];
  145. }
  146. listBox1.Items.Remove(mess);
  147. }
  148. ///////////////////если пришел кто-то////////////////
  149. if (flag == "a")
  150. {
  151. richTextBox1.Text += "log: " + message + "\r\n";
  152. for (int i = 1; i < message.Length; i++)
  153. {
  154. mess += message[i];
  155. }
  156. listBox1.Items.Add(mess);
  157. }
  158. }
  159. catch
  160. {
  161. }
  162. }
  163. client.Close();
  164. }
  165. private static string ReadResponse(TcpClient clientkl)
  166. {
  167. byte[] buffer = new byte[256];
  168. int totalRead = 0;
  169. do
  170. {
  171. int read = clientkl.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
  172. totalRead += read;
  173. }
  174. while (clientkl.GetStream() .DataAvailable) ;
  175. return Encoding.Unicode.GetString(buffer, 0, totalRead);
  176. }
  177. private void button2_Click(object sender, EventArgs e)
  178. {
  179. string message = textBox3.Text;
  180. SendMessage(clientkl,message,"m");
  181. richTextBox1.Text += DateTime.Now.ToLongTimeString() + " " + NIK + ": " + message + "\r\n";
  182. textBox3.Text = "";
  183. }
  184. private void Form1_Load(object sender, EventArgs e)
  185. {
  186. }
  187. }
  188. }
Проблема в том что при подключении нового клиента в списке users все перезаписывается им((((

Решение задачи: «.NET 2.x Многопользовательский чат на TcpClient»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using System.Threading;
  7. using System.Net.Sockets;
  8. using System.Net;
  9. using System.Runtime.InteropServices;
  10.  
  11. namespace ConsoleApplication1
  12. {
  13.     class Program
  14.     {
  15.  
  16.        
  17.  
  18.         const int port=3128;
  19.         static public List<user> users = new List<user>();
  20.        
  21.         public static TcpListener listener;
  22.        
  23.         public static string host = Dns.GetHostName();
  24.         public static string myIp = Dns.GetHostByName(host).AddressList[0].ToString();
  25.        
  26.         static void Main(string[] args)
  27.         {
  28.             IPAddress localhost = IPAddress.Parse(myIp);
  29.             listener = new TcpListener(localhost, port);
  30.             listener.Start();
  31.             Console.WriteLine("Сервер запущен...");
  32.  
  33.            
  34.             Thread thread;
  35.            
  36.  
  37.             while (true)
  38.             {
  39.                 while (!listener.Pending())
  40.                 {
  41.                     Thread.Sleep(500);
  42.                 }
  43.  
  44.                 TcpClient client = new TcpClient();
  45.                 client =listener.AcceptTcpClient();
  46.                 thread = new Thread(new ParameterizedThreadStart(wordclient));
  47.                 thread.Start(client);
  48.             }
  49.         }
  50.  
  51.         static void wordclient(object obj)
  52.         {
  53.             TcpClient clientid = obj as TcpClient;
  54.             bool done = true;
  55.  
  56.             while (done)
  57.             {
  58.                 string message = ReadMessage(clientid);
  59.  
  60.                 string flag = "";
  61.                 string mess = "";
  62.  
  63.                 flag += message[0];
  64.                 //////////////если прислал сообщение////////
  65.                 if (flag == "m")
  66.                 {
  67.                     for (int i = 1; i < message.Length; i++)
  68.                     {
  69.                         mess += message[i];
  70.                     }
  71.  
  72.                     //Console.WriteLine(mess);
  73.                     SendMessageAll(clientid, mess, "m");
  74.                 }
  75.                 //////////////если прислал ник///////////////
  76.                 if (flag == "n")
  77.                 {
  78.                     for (int i = 1; i < message.Length; i++)
  79.                     {
  80.                         mess += message[i];
  81.                     }
  82.  
  83.                     var tmpuser = new user();
  84.  
  85.                     tmpuser.add(mess, clientid);
  86.                     users.Add(tmpuser);
  87.  
  88.                     SendMessageAll(clientid, mess, "a");
  89.                     mess = "";
  90.                    
  91.                     foreach (user tmp in users)
  92.                     {
  93.                         Console.WriteLine("Клиент подключен. IP:{0}   Ник:{1}", clientid.Client.RemoteEndPoint.ToString(), tmp.name);
  94.                         if(clientid!=tmp.klient)
  95.                             mess += tmp.name + ";";
  96.                     }
  97.  
  98.                     SendMessage(clientid, mess, "l");
  99.                 }
  100.                 ///////////////если отключился/////////////
  101.                 if (flag == "o")
  102.                 {
  103.                     for (int i = 1; i < message.Length; i++)
  104.                     {
  105.                         mess += message[i];
  106.                     }
  107.                     SendMessageAll(clientid, mess, "z");
  108.                     Console.WriteLine("Клиент отключен. IP:{0}    Ник:{1}", clientid.Client.RemoteEndPoint, mess);
  109.                     user tmp2 = new user();
  110.                     foreach (user tmp in users)
  111.                     {
  112.                         if (tmp.klient == clientid)
  113.                         {
  114.                             tmp2.add(tmp.name, tmp.klient);
  115.                         }
  116.                     }
  117.                     users.Remove(tmp2);
  118.  
  119.                     done = false;
  120.                 }
  121.             }
  122.            
  123.             clientid.Close();
  124.         }
  125.  
  126.         static string ReadMessage(TcpClient client)
  127.         {
  128.             byte[] buffer = new byte[256];
  129.             int totalRead = 0;
  130.             do
  131.             {
  132.                 int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
  133.                 totalRead += read;
  134.             } while (client.GetStream().DataAvailable);
  135.             return Encoding.Unicode.GetString(buffer, 0, totalRead);
  136.         }
  137.  
  138.         static void SendMessage(TcpClient client, string message, string flag)
  139.         {
  140.             flag += message;
  141.             byte[] bytes = Encoding.Unicode.GetBytes(flag);
  142.             client.GetStream().Write(bytes, 0, bytes.Length);
  143.         }
  144.  
  145.         static void SendMessageAll(TcpClient client, string message, string flag)
  146.         {
  147.             flag += message;
  148.             byte[] bytes = Encoding.Unicode.GetBytes(flag);
  149.             foreach (user tmp in users)
  150.             {
  151.                 if (tmp.klient!=client)
  152.                     tmp.klient.GetStream().Write(bytes, 0, bytes.Length);
  153.             }
  154.         }
  155.     }
  156.  
  157.     public class user
  158.     {
  159.         public string name;
  160.         public TcpClient klient;
  161.  
  162.         public void add(string aname, TcpClient aklient)
  163.         {
  164.             name = aname;
  165.             klient = aklient;
  166.         }
  167.     }
  168. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы