С#: вопрос по сокетам

Рейтинг: 0Ответов: 1Опубликовано: 09.04.2015

Есть код сокета:

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Создаем основной сокет
IPAddress ipAddress = null; //IP-адресс
IPEndPoint Addr = null; //конечная точка(IP и порт)

Console.WriteLine("1 - Server\n2 - Client");
switch (Console.ReadKey(true).KeyChar)
{
    case '1':
        Console.Title = "Server"; //Сервер
        //ipAddress = Dns.GetHostEntry("localhost").AddressList[0]; //Преобразовуем адрес или IP узла в массив IP и берем первый
        Addr = new IPEndPoint(IPAddress.Any, 5300); //"localhost" = 127.0.0.1
        s.Bind(Addr); //"Адресуем" сокет
        s.Listen(10); //Обозначаем количество ожидающих в очереди на подключение
        Console.WriteLine("Ждем коннекта...");
        Socket cl_s = s.Accept(); //Ожидаем подключения
        Console.WriteLine("Есть коннект!");
        while (!Console.KeyAvailable) //Пока не нажата клавиша
        {
            byte[] msg = new byte[cl_s.Available];
            cl_s.Receive(msg); //Принимаем МСГ
            Console.WriteLine(Encoding.UTF8.GetString(msg)); //Конвертируем и выводим
        }
        cl_s.Close(); //Закрываем сокет
        break;
    case '2':
        Console.Title = "Client"; //Клиент
        ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
        Addr = new IPEndPoint(ipAddress, 5300); //"localhost" = 127.0.0.1
        s.Connect(Addr); //Коннектимся к серверу
        while (true) //Вечная истина :)
        {
            byte[] msg = Encoding.UTF8.GetBytes(Console.ReadLine()); //Конвертируем
            s.Send(msg); //Отправляем
        }
        break;
}
s.Close(); //Закрываем сокет
Console.ReadKey();

В принципе все понятно: клиент отсылает, сервер принимает сообщения.

Я хочу научиться делать такую вещь: клиент отправил сообщение - ждет сервера - ответ пришел - потом прочитал ответ. Потом заново отправил сообщение и пр. Т.е. обычный сокет, но не понимаю как его сделать.

Ответы

▲ 3Принят

На самом деле весь необходимый код у вас уже есть. Сейчас у вас сервер только принимает данные в цикле while, а клиент только отправляет. Для того, чтобы они обменивались сообщениями просто чередуйте в циклах приёма-передачи команды Send и Receive.

Команда Receive, если нет данных, ждёт, пока они не придут, так что заботиться о синхронизации отправки и приёма вам на этом уровне не нужно. Можно также задать значение тайм-аута ReceiveTimeout. Если данные не придут в течение этого времени, то возникнет исключение SocketException.