.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 { }
}
}
}
// -----------------------------------------------------------------------
}
}