.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 { }
- }
- }
- }
- // -----------------------------------------------------------------------
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д