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

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

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

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

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();
        }
    }
}
MainChat (сам чат)
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 = "";
        }
    }
}
AppCore
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 { }
                }
            }
        }
        // -----------------------------------------------------------------------
    }
}

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


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

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

12   голосов , оценка 4.25 из 5
Похожие ответы