0 / 0 / 0
Регистрация: 27.06.2019
Сообщений: 23
1

Приостановление stream.Read

07.01.2021, 19:38. Показов 1766. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
С Рождеством!
Уже месяц бьюсь над проблемой. Вопрос такой, у меня чат-сервер. При подключении проблем нет, но когда наступает время самого чата. То клиент не может ничего написать, так как NetworkStream занят чтением (ожиданием отклика от сервера, ну, во всяком случае я так думаю, другие сотни вариантов перебрал). Помогите, если можете, код класса подключения и передачи ниже. Заранее спасибо!
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
    public class Connection
    {
        StreamWriter writer;
        StreamReader reader;
        NetworkStream stream;
        byte[] buf;
        byte[] receiveBuffer;
        int dataBufferSize = 2048;
 
        public Connection(TcpClient tcpClient)
        {
            stream = tcpClient.GetStream();
            writer = new StreamWriter(stream);
            reader = new StreamReader(stream);
        }
 
        [MethodImpl(MethodImplOptions.Synchronized)]
        public void send(Message message)
        {
            writer.WriteLine(message.getXml());
            writer.Flush();
        }
 
        [MethodImpl(MethodImplOptions.Synchronized)]
        public Message receive()
        {
            Message message;
 
            string s = reader.ReadLine();
            var serializer = new XmlSerializer(typeof(Message));
            using (var xmlStream = new StringReader(s))
            {
                message = (Message)serializer.Deserialize(xmlStream);
            }
            return message;
        }
 
        public void close()
        {
            stream.Close();
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2021, 19:38
Ответы с готовыми решениями:

Пробная база данных.EndOfException: Unable to read the end of the stream (после попытки чтения первой строки)
Написал на С# учебно-тренировочную базу данных,но работать она не хочет.Прошу помочь...

Вывод http stream в новое окно
Есть у меня приложение в VB .NET При нажатии кнопки пользователю должны выдаться данные в новом...

По какой причине приложение может застопорится при вызове функции Stream.Read?
По какой причине приложение может застопорится при вызове функции Stream.Read? Т.е. не выдает...

Что делает Read(byte[] buffer, int offset, int count) метод класса Stream
Что делает Read(byte buffer, int offset, int count) метод класса Stream. Приведите пример...

4
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
08.01.2021, 12:23 2
Gnoooooooooom, нужен код самого чата. synchronized лишнее
0
0 / 0 / 0
Регистрация: 27.06.2019
Сообщений: 23
08.01.2021, 14:45  [ТС] 3
Ну, у меня код сервера на Java, проблема вообще-то не в сервере, как я думаю. Клиент встает на этапе отправки сообщения (то есть на методе send). Я сделал костыль, специально остановил поток отправки в моей программе, и только тогда сообщение отправилось, но я думаю, что нужно как-то по-другому сделать.
0
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
08.01.2021, 14:55 4
Gnoooooooooom, код клиента конечно.
0
0 / 0 / 0
Регистрация: 27.06.2019
Сообщений: 23
08.01.2021, 17:13  [ТС] 5
Это как обычная строка передается серверу.
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
protected void sendTextMessage(string text)
    {
        try
        {
            stopMain();
            connection.send(new Message(MessageType.TEXT, text));
            startMain();
        }
        catch (Exception)
        {
            ConsoleHelper.writeMessage("Ошибка отправки");
            clientConnected = false;
        }
    }
private void startMain()
    {
        checkThread = new Thread(clientMainLoop);
        checkThread.Start();
    }
 
    private void stopMain()
    {
        checkThread.Abort();
    }
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
public class Connection
    {
        StreamWriter writer;
        StreamReader reader;
        NetworkStream stream;
        byte[] buf;
        byte[] receiveBuffer;
        int dataBufferSize = 2048;
 
        public Connection(TcpClient tcpClient)
        {
            stream = tcpClient.GetStream();
            writer = new StreamWriter(stream);
            reader = new StreamReader(stream);
        }
 
        [MethodImpl(MethodImplOptions.Synchronized)]
        public void send(Message message)
        {
            writer.WriteLine(message.getXml());
            writer.Flush();
        }
 
        [MethodImpl(MethodImplOptions.Synchronized)]
        public Message receive()
        {
            Message message;
 
            try
            {
                string s = reader.ReadLine();
                if(s == null)
                {
                    return null;
                }
                var serializer = new XmlSerializer(typeof(Message));
                using (var xmlStream = new StringReader(s))
                {
                    message = (Message)serializer.Deserialize(xmlStream);
                }
            }
            catch (ArgumentNullException)
            {
                return null;
            }
            return message;
        }
 
        public void close()
        {
            stream.Close();
        }
    }
0
08.01.2021, 17:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2021, 17:13
Помогаю со студенческими работами здесь

Как создать картинки используя bitmap.Save(Stream stream, .)
Я сохраняю все картинки так: output = bmp; output.Save($"Img{Convert.ToString(i)}.png"); Это в...

Приостановление процесса для копирования занятого файла
Приветствую , вопрос таков , как приостановить процесс ? Не убить , именно приостановить ....

The memory could not be "read" \ "write"; Read\WriteProcessMemory
Добрый день. Вечная проблема при попытке прочитать \ записать в память, при помощи...

StreamWriter to Stream
StreamWriter sw = gcnew StreamWriter("D:\\wow\\realmlist.wtf"); sw.WriteLine("set realmlist...

Memory Stream
есть такой код string s = "что-небудь"; MemoryStream ms = new MemoryStream(); ...

Stream.Seek
Привет. Есть бинарник, в котором записан массив int, в котором записаны числа от 1 до 64. Нужно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru