.NET 4.x Не работает чат на сокетах - C#

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

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

Привет. Есть чат на сокетах но, при попытке коннекта программа просто зависает. Уже окончательно запутался. Прошу помощи у форумчан. Весь код ниже + ссылка на прогу

Program.cs

Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using System.Windows.Forms;
  6. namespace oneProject
  7. {
  8. static class Program
  9. {
  10. /// <summary>
  11. /// Главная точка входа для приложения.
  12. /// </summary>
  13. [STAThread]
  14. static void Main()
  15. {
  16. Application.EnableVisualStyles();
  17. Application.SetCompatibleTextRenderingDefault(false);
  18. Application.Run(new oneProject.WindowSettings());
  19. Application.Run(new oneProject.MainChat());
  20. }
  21. }
  22. }

Form1 (Настройка)

Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. using System.Net;
  11. using System.Net.Sockets;
  12. namespace oneProject
  13. {
  14. public partial class WindowSettings : Form
  15. {
  16. Thread WaitingForConnecting;
  17. public WindowSettings()
  18. {
  19. InitializeComponent();
  20. // Назначаем потоку имя ф-ции
  21. WaitingForConnecting = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(SocketWorker.CreateSocket));
  22. IPAdress.Text = GetLocalIP();
  23. }
  24. // Указывает на тип приложения
  25. private static bool AppCheckedTypeServer = true;
  26. // Обработчик таймера
  27. private void UpdateForm_Tick(object sender, EventArgs e)
  28. {
  29. // Если подключились - закрываем окно настроек
  30. if (SocketWorker.IsConnected)
  31. {
  32. try
  33. {
  34. // Пытаемся завершить поток подключений
  35. WaitingForConnecting.Abort();
  36. }
  37. catch { }
  38. // Закрываем окно настроек
  39. this.Close();
  40. }
  41. if (ServerRadio.Checked)
  42. {
  43. // Блокируем поле ввода IP-адреса
  44. IPAdress.Enabled = false;
  45. AppCheckedTypeServer = true;
  46. }
  47. else
  48. {
  49. AppCheckedTypeServer = false;
  50. IPAdress.Enabled = true;
  51. }
  52. }
  53. //функция возвращает айпи
  54. private string GetLocalIP()
  55. {
  56. IPHostEntry host;
  57. host = Dns.GetHostEntry(Dns.GetHostName());
  58. foreach (IPAddress ip in host.AddressList)
  59. {
  60. if (ip.AddressFamily == AddressFamily.InterNetwork)
  61. {
  62. return ip.ToString();
  63. }
  64. }
  65. return "127.0.0.1";
  66. }
  67. private void StartChat_Click(object sender, EventArgs e)
  68. {
  69. // Блокируем кнопку от повторного нажатия
  70. StartChat.Enabled = false;
  71. // Настраиваем основной игровой объект
  72. Worker.CreateGameObject(AppCheckedTypeServer, ChatNick.Text);
  73. // Запускаем поток подключения
  74. if (AppCheckedTypeServer)
  75. {
  76. // 0.0.0.0 -для прослушки внешней сети, не используйте 127.0.0.1 или localhost!
  77. WaitingForConnecting.Start(new Object[] { "0.0.0.0", "12123", AppCheckedTypeServer });
  78. }
  79. else
  80. {
  81. // 12123 –порт подключения
  82. WaitingForConnecting.Start(new Object[] { IPAdress.Text.ToString(), "12123", AppCheckedTypeServer });
  83. }
  84. }
  85. private void IPAdress_TextChanged(object sender, EventArgs e)
  86. {
  87. IPAdress.Text = GetLocalIP();
  88. }
  89. }
  90. }
MainChat (сам чат)
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace oneProject
  10. {
  11. public partial class MainChat : Form
  12. {
  13. public MainChat()
  14. {
  15. InitializeComponent();
  16. // Создаем новый поток, указываем на ф-цию получения сообщений в классе Worker
  17. WaitingForMessage = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Worker.GetMessages));
  18. // Запускаем, в параметрах передаем листбокс (история чата)
  19. WaitingForMessage.Start(new Object[] { ChatHistory });
  20. }
  21. // Обработчик отправки сообщения (кнопки)
  22. private void Send_Click(object sender, EventArgs e)
  23. {
  24. if (Worker.GlobalAppObject.ApplicationTypeProp == AppCore.AppType.Server)
  25. {
  26. // Посылаем клиенту новое сообщение
  27. SocketWorker.SendDataToClient(ChatText.Text, Worker.GlobalAppObject.ChatNickProp);
  28. }
  29. else
  30. {
  31. SocketWorker.SendDataToServer(ChatText.Text, Worker.GlobalAppObject.ChatNickProp);
  32. }
  33. // Добавляем в историю свое же сообщение + ник + время написания
  34. ChatHistory.Items.Add(DateTime.Now.ToShortTimeString() + " " + Worker.GlobalAppObject.ChatNickProp + ": " + ChatText.Text.ToString());
  35. // Автопрокрутка истории чата
  36. ChatHistory.TopIndex = ChatHistory.Items.Count - 1;
  37. // Убираем текст из поля ввода
  38. ChatText.Text = "";
  39. }
  40. }
  41. }
AppCore
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace oneProject
  6. {
  7. class AppCore
  8. {
  9. // Тип приложения --------------------------------------------
  10. public enum AppType { Server, Client }
  11. private AppType ApplicationType;
  12. public AppType ApplicationTypeProp
  13. {
  14. get { return ApplicationType; }
  15. set { ApplicationType = value; }
  16. }
  17. // Ник в чате -----------------------------------------------
  18. private string ChatNick = "BadUser";
  19. public string ChatNickProp
  20. {
  21. get { return ChatNick; }
  22. set { ChatNick = value; }
  23. }
  24. // ----------------------------------------------------------
  25. }
  26. }
Ссылка
http://rgho.st/private/6Lkbf7fmF/ebe73fb79e27ff66a90d2267231990c0

Решение задачи: «.NET 4.x Не работает чат на сокетах»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6.  
  7. namespace oneProject
  8. {
  9.     class Worker
  10.     {
  11.         // Глобальный объект, характеризирующий персону в чате --------------------
  12.         public static AppCore GlobalAppObject;
  13.         // Настраивает объект выше
  14.         public static void CreateGameObject(bool IsServer, string ChatNick)
  15.         {
  16.             GlobalAppObject = new AppCore();
  17.             // Назначаем ник
  18.             GlobalAppObject.ChatNickProp = ChatNick;
  19.  
  20.             // Тип приложения
  21.             if (IsServer)
  22.             {
  23.                 GlobalAppObject.ApplicationTypeProp = AppCore.AppType.Server;
  24.             }
  25.             else
  26.             {
  27.                 GlobalAppObject.ApplicationTypeProp = AppCore.AppType.Client;
  28.             }
  29.         }
  30.         // Ф-ция, работающая в новом потоке: получение новых сообщенй -------------
  31.         public static void GetMessages(Object obj)
  32.         {
  33.             // Получаем объект истории чата (лист бокс)
  34.             Object[] Temp = (Object[])obj;
  35.             System.Windows.Forms.ListBox ChatListBox =
  36.             (System.Windows.Forms.ListBox)Temp[0];
  37.  
  38.             // В бесконечном цикле получаем сообщения
  39.             while (true)
  40.             {
  41.                 // Ставим паузу, чтобы на время освобождать порт для отправки сообщений
  42.                 Thread.Sleep(50);
  43.                 if (GlobalAppObject.ApplicationTypeProp == AppCore.AppType.Server)
  44.                 {
  45.                     try
  46.                     {
  47.                         // Получаем сообщение от клиента
  48.                         string Message = SocketWorker.GetDataFromClient();
  49.                         // Добавляем в историю + текущее время
  50.                         ChatListBox.Items.Add(DateTime.Now.ToShortTimeString() + " " + Message);
  51.                         // Автопрокрутка списка
  52.                         ChatListBox.TopIndex = ChatListBox.Items.Count - 1;
  53.                     }
  54.                     catch { }
  55.                 }
  56.                 else
  57.                 {
  58.                     try
  59.                     {
  60.                         string Message = SocketWorker.GetDataFromServer();
  61.                         ChatListBox.Items.Add(DateTime.Now.ToShortTimeString() + " " + Message);
  62.                         ChatListBox.TopIndex = ChatListBox.Items.Count - 1;
  63.                     }
  64.                     catch { }
  65.                 }
  66.             }
  67.         }
  68.         // -----------------------------------------------------------------------
  69.     }
  70. }

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


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

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

12   голосов , оценка 4.25 из 5

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

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

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