.NET 4.x Не работает чат на сокетах - C#
Формулировка задачи:
Привет. Есть чат на сокетах но, при попытке коннекта программа просто зависает. Уже окончательно запутался. Прошу помощи у форумчан.
Весь код ниже + ссылка на прогу
MainChat (сам чат)
AppCore
Ссылка
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace oneProject { static class Program { /// <summary> /// Главная точка входа для приложения. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new oneProject.WindowSettings()); Application.Run(new oneProject.MainChat()); } } }
Form1 (Настройка)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Net; using System.Net.Sockets; namespace oneProject { public partial class WindowSettings : Form { Thread WaitingForConnecting; public WindowSettings() { InitializeComponent(); // Назначаем потоку имя ф-ции WaitingForConnecting = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(SocketWorker.CreateSocket)); IPAdress.Text = GetLocalIP(); } // Указывает на тип приложения private static bool AppCheckedTypeServer = true; // Обработчик таймера private void UpdateForm_Tick(object sender, EventArgs e) { // Если подключились - закрываем окно настроек if (SocketWorker.IsConnected) { try { // Пытаемся завершить поток подключений WaitingForConnecting.Abort(); } catch { } // Закрываем окно настроек this.Close(); } if (ServerRadio.Checked) { // Блокируем поле ввода IP-адреса IPAdress.Enabled = false; AppCheckedTypeServer = true; } else { AppCheckedTypeServer = false; IPAdress.Enabled = true; } } //функция возвращает айпи private string GetLocalIP() { IPHostEntry host; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { return ip.ToString(); } } return "127.0.0.1"; } private void StartChat_Click(object sender, EventArgs e) { // Блокируем кнопку от повторного нажатия StartChat.Enabled = false; // Настраиваем основной игровой объект Worker.CreateGameObject(AppCheckedTypeServer, ChatNick.Text); // Запускаем поток подключения if (AppCheckedTypeServer) { // 0.0.0.0 -для прослушки внешней сети, не используйте 127.0.0.1 или localhost! WaitingForConnecting.Start(new Object[] { "0.0.0.0", "12123", AppCheckedTypeServer }); } else { // 12123 –порт подключения WaitingForConnecting.Start(new Object[] { IPAdress.Text.ToString(), "12123", AppCheckedTypeServer }); } } private void IPAdress_TextChanged(object sender, EventArgs e) { IPAdress.Text = GetLocalIP(); } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace oneProject { public partial class MainChat : Form { public MainChat() { InitializeComponent(); // Создаем новый поток, указываем на ф-цию получения сообщений в классе Worker WaitingForMessage = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Worker.GetMessages)); // Запускаем, в параметрах передаем листбокс (история чата) WaitingForMessage.Start(new Object[] { ChatHistory }); } // Обработчик отправки сообщения (кнопки) private void Send_Click(object sender, EventArgs e) { if (Worker.GlobalAppObject.ApplicationTypeProp == AppCore.AppType.Server) { // Посылаем клиенту новое сообщение SocketWorker.SendDataToClient(ChatText.Text, Worker.GlobalAppObject.ChatNickProp); } else { SocketWorker.SendDataToServer(ChatText.Text, Worker.GlobalAppObject.ChatNickProp); } // Добавляем в историю свое же сообщение + ник + время написания ChatHistory.Items.Add(DateTime.Now.ToShortTimeString() + " " + Worker.GlobalAppObject.ChatNickProp + ": " + ChatText.Text.ToString()); // Автопрокрутка истории чата ChatHistory.TopIndex = ChatHistory.Items.Count - 1; // Убираем текст из поля ввода ChatText.Text = ""; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace oneProject { class AppCore { // Тип приложения -------------------------------------------- public enum AppType { Server, Client } private AppType ApplicationType; public AppType ApplicationTypeProp { get { return ApplicationType; } set { ApplicationType = value; } } // Ник в чате ----------------------------------------------- private string ChatNick = "BadUser"; public string ChatNickProp { get { return ChatNick; } set { ChatNick = value; } } // ---------------------------------------------------------- } }
http://rgho.st/private/6Lkbf7fmF/ebe73fb79e27ff66a90d2267231990c0
Решение задачи: «.NET 4.x Не работает чат на сокетах»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace oneProject { class Worker { // Глобальный объект, характеризирующий персону в чате -------------------- public static AppCore GlobalAppObject; // Настраивает объект выше public static void CreateGameObject(bool IsServer, string ChatNick) { GlobalAppObject = new AppCore(); // Назначаем ник GlobalAppObject.ChatNickProp = ChatNick; // Тип приложения if (IsServer) { GlobalAppObject.ApplicationTypeProp = AppCore.AppType.Server; } else { GlobalAppObject.ApplicationTypeProp = AppCore.AppType.Client; } } // Ф-ция, работающая в новом потоке: получение новых сообщенй ------------- public static void GetMessages(Object obj) { // Получаем объект истории чата (лист бокс) Object[] Temp = (Object[])obj; System.Windows.Forms.ListBox ChatListBox = (System.Windows.Forms.ListBox)Temp[0]; // В бесконечном цикле получаем сообщения while (true) { // Ставим паузу, чтобы на время освобождать порт для отправки сообщений Thread.Sleep(50); if (GlobalAppObject.ApplicationTypeProp == AppCore.AppType.Server) { try { // Получаем сообщение от клиента string Message = SocketWorker.GetDataFromClient(); // Добавляем в историю + текущее время ChatListBox.Items.Add(DateTime.Now.ToShortTimeString() + " " + Message); // Автопрокрутка списка ChatListBox.TopIndex = ChatListBox.Items.Count - 1; } catch { } } else { try { string Message = SocketWorker.GetDataFromServer(); ChatListBox.Items.Add(DateTime.Now.ToShortTimeString() + " " + Message); ChatListBox.TopIndex = ChatListBox.Items.Count - 1; } catch { } } } } // ----------------------------------------------------------------------- } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д