Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Yurko_UA
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 41
Завершенные тесты: 5
1

Socket TCP: обрывается соединение после первого сообщения

03.10.2016, 00:43. Просмотров 672. Ответов 4
Метки нет (Все метки)

Всем привет! Начал учить сокеты, написал по примере первую программу: клиент и сервер на TCP сокетах.
Клиент подключается к серверу, проходит первое сообщение (клиент вводит свой никнейм и на сервере появляется сообщение о подключении), а вот потом проблема:

клиент отправляет сообщение, но до сервера оно не доходит, при том, что сервер отправляет сообщение о приеме. Клиент дальше перестает работать.

Не перезапуская сервер, запускаю еще одного клиента, и та же самая история со всеми клиентами: после первого сообщения пропадает соединение (дебаг показал: после первого сообщения на сокетах Connected = false), исключения не выскакивают.

Код сервера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
namespace SocketServer
{
    class ProgramServer
    {
        const int port = 8005;
 
        static void Main(string[] args)
        {
            IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
            Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Socket handler = null;
 
            try
            {
                listenSocket.Bind(ipPoint);
                listenSocket.Listen(10);
                Console.WriteLine($"Server {ipPoint.Address}:{port} started.\n");
 
                while (true)
                {
                    handler = listenSocket.Accept();
                    StringBuilder sBuilder = new StringBuilder();
                    int bytes = 0;
                    byte[] data = new byte[256];
 
                    do
                    {
                        bytes = handler.Receive(data);
                        sBuilder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (handler.Available > 0);
 
                    Console.WriteLine($"[{DateTime.Now.ToShortTimeString()}]: {sBuilder}");
 
                    data = Encoding.Unicode.GetBytes($"[{DateTime.Now.ToShortTimeString()}] Server: Message sended.");
                    handler.Send(data);
                }
            }
            catch (Exception ex)
            {
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
}
Код клиента:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
namespace SocketClient
{
    class ProgramClient
    {
        const int port = 8005;
        const string ip = "127.0.0.1";
 
        static void Main(string[] args)
        {
            var ipPoint = new IPEndPoint(IPAddress.Parse(ip), port);
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            try
            {
                socket.Connect(ipPoint);
 
                Console.WriteLine($"The connection to the server {ipPoint.Address}:{port} was successful");
                Console.Write("Your name: ");
                string nickName = Console.ReadLine();
 
                socket.Send(Encoding.Unicode.GetBytes($"{nickName} is connected."));
 
                string message;
 
                while (true)
                {
                    Console.Write("- ");
                    message = nickName + ": " + Console.ReadLine();
                    socket.Send(Encoding.Unicode.GetBytes(message));
 
                    var data = new byte[256];
                    var sBuilder = new StringBuilder();
                    int bytes = 0;
 
                    do
                    {
                        bytes = socket.Receive(data, data.Length, 0);
                        sBuilder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (socket.Available > 0);
 
                    Console.WriteLine(sBuilder.ToString());
                }
            }
            catch (Exception ex)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
}
0
Миниатюры
Socket TCP: обрывается соединение после первого сообщения  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2016, 00:43
Ответы с готовыми решениями:

Сервер продолжает получать пустые сообщения после вызова метода Socket.Send
Есть сервер с сокетом, который выдает ответы на запросы. Связь с ним нормально работает через...

Односторонний чат: не работает после первого сообщения
Есть приложение - односторонний чат, но отправляет только одно сообщение. Код отправляющего...

Реализация отправки сообщения всем клиентам (TCP Socket)
Пишу чат на TCP Сокетах и возник вопрос: Как при получении сообщения сервером, отправить его всем...

Asio deadline_timer и tcp::socket отослать асинхоронно по tcp по таймеру
Здравствуйте. Цель по tcp соединению отсылать через равные промежутки времени сообщение одно и...

Обрывается wi-fi соединение
Доброго времени суток! Такая простая и непонятная проблема: обрывается wi-fi соединение.Повторно...

4
Cupko
465 / 454 / 127
Регистрация: 17.07.2012
Сообщений: 1,352
Записей в блоге: 1
Завершенные тесты: 2
03.10.2016, 15:18 2
Yurko_UA,
Меня, единственное что пугает, это синхронность ваших клиент-серверов - вы ждете подключений и читаете/пишите в одном потоке. Если Accept() блокирует поток до следующего запроса (а он скорее всего так и делает), то вторая итерация while никогда не выполнится, и повторных чтений/записей не будет.

Делайте сервер асинхронным, используя существующие асинхронные модели в .NET, либо же создавайте раздельные потоки вручную.
1
Yurko_UA
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 41
Завершенные тесты: 5
03.10.2016, 16:36  [ТС] 3
Cupko, тоесть SendAsync, ReceiveAsync?
0
Cupko
465 / 454 / 127
Регистрация: 17.07.2012
Сообщений: 1,352
Записей в блоге: 1
Завершенные тесты: 2
03.10.2016, 16:41 4
Цитата Сообщение от Yurko_UA Посмотреть сообщение
тоесть SendAsync, ReceiveAsync?
Да, именно они. По ссылке вы найдёте 3 паттерна с примерами. Если вы используете 4.5+ версию фреймворка, рекомендуется применять TAP-модель с async/await, хотя все 3 будут прекрасно работать.
0
Yurko_UA
0 / 0 / 0
Регистрация: 31.03.2015
Сообщений: 41
Завершенные тесты: 5
03.10.2016, 21:11  [ТС] 5
Cupko, спасибо за внимание! Уже написал (точнее, полускопипастил) асинхронные клиент-сервер и успокоился. Все работает!
0
03.10.2016, 21:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2016, 21:11

периодически обрывается Wi-Fi соединение!
Дело вот в чём, имеется DSL модем, к нему подключен Wi-Fi роутер D-Link DIR615, к нему основной...

Обрывается соединение с интернетом
Здравствуйте товарищи. У меня проблема,и к сожалению определенного ее решения в интернете я не...

Постоянно обрывается соединение
Здравствуйте! Дома мой комп подключен через провод к ADSL-роутеру, другой (не мой) компьютер дома...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru