Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 21:11   #1
borN_free
Новичок
Джуниор
 
Регистрация: 18.03.2010
Сообщений: 1
По умолчанию мини Чат клиент сервер

Добрый день.
Пишу небольшой мини чат, клиент сервер. Возникла проблема в сервере, он принимает сообщения от клиента, и рассылает всем подключившимся клиентам. Но делает это через раз, не могу понять где причина.
Вот код сервера:

Код:

namespace server
{
	class Program
	{
		public static Hashtable htUsers = new Hashtable(30);
		static Queue clientQueue = new Queue[30];
		//для оздания отдельного процесса
		public class Connection
		{
			public TcpClient cl;
			private StreamWriter swSender;
			private StreamReader srReceiver;
			private String str;
			//private Queue clientQueue;
			
			public void Work()
			{
				srReceiver = new StreamReader(cl.GetStream()); //принятие
				swSender = new StreamWriter(cl.GetStream());
								
				// сообщаем об успешном подключении
				swSender.WriteLine("Connection Successfuly!");
				swSender.Flush();
				str = "";
				
				//str = srReceiver.ReadLine();
				//clientQueue.Enqueue(str);
				while((str = srReceiver.ReadLine()) != "") { // цикл для принятия сообщений от клиента
						clientQueue.Enqueue(str);
						Thread.Sleep(50);
						Console.WriteLine(str); // выводим в консоль принятое сообщение
				}
			}
			
			public void Sender() {
				TcpClient[] tcpClients = new TcpClient[htUsers.Count]; // содержит массив клиентов
				string[] namesClients = new string[htUsers.Count]; // массив ников клиентов
				
				htUsers.Values.CopyTo(tcpClients, 0);
				htUsers.Keys.CopyTo(namesClients, 0);
                int k = 0, p=0;

				string msg;
				while (true) {
					Thread.Sleep(5000);
					while (clientQueue.Count > 0) {
						msg = (string)clientQueue.Dequeue();
                        k = 0;
						for (k= 0; k< tcpClients.Length; k++) {
							StreamWriter swSender = new StreamWriter(tcpClients[k].GetStream());
							swSender.WriteLine(msg);
							swSender.Flush();
						}	
					}
				}
			}
			
		}
		//многопроцессорная работа
		static void Main(string[] args)
		{
			Console.WriteLine("Maka's (c) Server, the version 1.0.0.0 [borN_free]"); //не стоит сюда смотреть ;)
			
			int port = 1116; //взяли порт из файла
			IPAddress localAdd = IPAddress.Parse("127.0.0.1");
			TcpListener server = new TcpListener(localAdd, port); //и на нем у нас висит сервер
			server.Start(); //серер запущен
			Console.WriteLine("The server is started... Waiting for connections..."); //уведомили об этом
            int nameThread = 0;
			while (true)
			{
				TcpClient cl = server.AcceptTcpClient();
				Console.WriteLine("Connected!");
				Connection c = new Connection();
				StreamReader sr = new StreamReader(cl.GetStream());
				// тут тупо сделано считывание от клиента имени юзера для занесения в хэш таблицу
				string s = sr.ReadLine();
				htUsers.Add(s, cl);
				
				c.cl = cl;
				Thread t = new Thread(new ThreadStart(c.Work));
				t.IsBackground = false;
				t.Start();
				
				// поток для отправки сообщений ОТ сервера
				Thread sendThread = new Thread(new ThreadStart(c.Sender));
				sendThread.IsBackground = false;
                sendThread.Name = "thread" + nameThread.ToString();
				sendThread.Start();
                nameThread++;
			}
		}
	}
}
Может ли быть причина в том, что созданные два потока с функцией Sender для двух клиентов конфликтуют с разделяемым ресурсом очереди?
Прошу любого совета, тк перепробовал уйму способов. Спасибо.
borN_free вне форума Ответить с цитированием
Старый 19.03.2010, 22:31   #2
MeTeOpA
Форумчанин
 
Аватар для MeTeOpA
 
Регистрация: 17.02.2010
Сообщений: 194
По умолчанию

Неувидел в коде..

Попробуй с

try
{
...
}
catch
{
....
}
MeTeOpA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мини чат на форуме Levsha100 О форуме и сайтах клуба 42 25.03.2011 20:42
Мини FTP клиент! f1xed Помощь студентам 0 01.02.2010 01:31
Чат-клиент на С++ VanHelsing Общие вопросы C/C++ 0 21.01.2010 10:23
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18