Клиент-серверное приложение на потоковом сокете TCP - C#
Формулировка задачи:
Хотел сделать связь между пользователями, вот тут http://professorweb.ru/my/csharp/web/level3/3_2.php подробно все написано, но если запускать 2 клиента, то с них надо отправлять данные по очереди, то есть при двух подключенных клиентах к серверу, с одного из них, не чего второй раз не отправляется, может кто-то знает, как это исправить?
Сам сервер
И клиент
// SocketServer.cs
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketServer
{
class Program
{
static void Main(string[] args)
{
// Устанавливаем для сокета локальную конечную точку
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
// Создаем сокет Tcp/Ip
Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// Назначаем сокет локальной конечной точке и слушаем входящие сокеты
try
{
sListener.Bind(ipEndPoint);
sListener.Listen(10);
// Начинаем слушать соединения
while (true)
{
Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);
// Программа приостанавливается, ожидая входящее соединение
Socket handler = sListener.Accept();
string data = null;
// Мы дождались клиента, пытающегося с нами соединиться
byte[] bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
// Показываем данные на консоли
Console.Write("Полученный текст: " + data + "\n\n");
// Отправляем ответ клиенту\
string reply = "Спасибо за запрос в " + data.Length.ToString()
+ " символов";
byte[] msg = Encoding.UTF8.GetBytes(reply);
handler.Send(msg);
if (data.IndexOf("<TheEnd>") > -1)
{
Console.WriteLine("Сервер завершил соединение с клиентом.");
break;
}
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
Console.ReadLine();
}
}
}
}// SocketClient.cs
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketClient
{
class Program
{
static void Main(string[] args)
{
try
{
SendMessageFromSocket(11000);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
Console.ReadLine();
}
}
static void SendMessageFromSocket(int port)
{
// Буфер для входящих данных
byte[] bytes = new byte[1024];
// Соединяемся с удаленным устройством
// Устанавливаем удаленную точку для сокета
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// Соединяем сокет с удаленной точкой
sender.Connect(ipEndPoint);
Console.Write("Введите сообщение: ");
string message = Console.ReadLine();
Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());
byte[] msg = Encoding.UTF8.GetBytes(message);
// Отправляем данные через сокет
int bytesSent = sender.Send(msg);
// Получаем ответ от сервера
int bytesRec = sender.Receive(bytes);
Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));
// Используем рекурсию для неоднократного вызова SendMessageFromSocket()
if (message.IndexOf("<TheEnd>") == -1)
SendMessageFromSocket(port);
// Освобождаем сокет
sender.Shutdown(SocketShutdown.Both);
sender.Close();
}
}
}
up!
Решение задачи: «Клиент-серверное приложение на потоковом сокете TCP»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace SocketServer
{
class Program
{
private static void Func(object o)
{
try
{
Socket handler = (Socket) o;
string data = null;
// Мы дождались клиента, пытающегося с нами соединиться
byte[] bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
// Показываем данные на консоли
Console.Write("Полученный текст: " + data + "\n\n");
// Отправляем ответ клиенту\
string reply = "Спасибо за запрос в " + data.Length.ToString()
+ " символов";
byte[] msg = Encoding.UTF8.GetBytes(reply);
handler.Send(msg);
if (data.IndexOf("<TheEnd>") > -1)
{
Console.WriteLine("Сервер завершил соединение с клиентом.");
}
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static void Main(string[] args)
{
// Устанавливаем для сокета локальную конечную точку
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
// Создаем сокет Tcp/Ip
Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// sListener.SetSocketOption();
// Назначаем сокет локальной конечной точке и слушаем входящие сокеты
try
{
sListener.Bind(ipEndPoint);
sListener.Listen(10);
Console.WriteLine("started " + sListener.LocalEndPoint.ToString());
List<Thread> threads=new List<Thread>();
while (true)
{
Socket s = sListener.Accept();
Console.WriteLine("New client Connected");
threads.Add(new Thread(Func));
threads.Last().IsBackground = true;
threads.Last().Start(s);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}}
}
}