27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
1

Зависает клиент при приёме от сервера

31.03.2013, 14:42. Показов 1486. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
С начало сделал посыл данных только от клиента серверу..там всё хорошо
далее начал делать обратный, от сервера вроде как всё хорошо уходит
но клиент зависает..вроде вывел в отдельные потоки,но всё равно что то не так, помогите разобраться
клиент:
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Reflection;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
 
namespace Helper
{
    public partial class mainform : Form
    {
        TcpClient tcpClient;
 
        public mainform()
        {
            InitializeComponent();
        }
 
        static NetworkStream Stream;
        static IPAddress IP = IPAddress.Parse("127.0.0.1");
        const int port = 10203;
 
        void Write(object cl)
        {
            while (true)
            {
                try
                {
                    byte[] numt = new byte[4];
                    Stream.Read(numt, 0, 4);
                    int len = BitConverter.ToInt32(numt, 0);
                    byte[] textData = new byte[len];
                    int cnt = 0;
                    while (cnt != len)
                        cnt += Stream.Read(textData, 0, textData.Length - cnt);
                    string InputData = Encoding.Unicode.GetString(textData);
                    richTextBox1.Invoke(new Action<String>(SetStr), InputData);
 
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                }
            }
            Stream.Close();
            tcpClient.Close();
        }
 
        bool flag;
        string rtf = "";
        private void SetStr(string s)
        {
            if (s != "")
            {
                string date = DateTime.Now.ToString();
                if (!flag)
                {
                    richTextBox1.Text += date + Environment.NewLine;
                    int my1stPosition = richTextBox1.Find(date);
                    richTextBox1.SelectionStart = my1stPosition;
                    richTextBox1.SelectionLength = date.Length;
                    richTextBox1.SelectionColor = Color.FromArgb(255, 15, 63);
                    richTextBox1.SelectionFont = new Font("Arial", 10, FontStyle.Bold);
 
                    richTextBox1.Text += s + Environment.NewLine;
                    int my2stPosition = richTextBox1.Find(s);
                    richTextBox1.SelectionStart = my2stPosition;
                    richTextBox1.SelectionLength = s.Length;
                    richTextBox1.SelectionColor = Color.DarkSlateGray;
                    richTextBox1.SelectionFont = new Font("Arial", 10, FontStyle.Regular);
                    flag = true;
                }
                else
                {
                    rtf = richTextBox1.Rtf;
                    rtf = rtf.Insert(rtf.Length - 3, "\\cf1\\b " + date + "\\par" + "\\cf2\\b0 " + s + "\\par\\par");
                    richTextBox1.Rtf = rtf;
                    richTextBox1.Select(richTextBox1.TextLength - 1, 0);
                    richTextBox1.ScrollToCaret();
                }
 
            }
        }
 
        Thread listenThread;
        private void button2_Click(object sender, EventArgs e)
        {
            tcpClient = new TcpClient();
            try
            {
                listenThread = new Thread(new ThreadStart(ListenForClients));
                listenThread.Start();
                listenThread.IsBackground = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Сервер не доступен! Повторите попытку.",  MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
 
        private void ListenForClients()
        {
            tcpClient.Connect(IP, port);
            Stream = tcpClient.GetStream();
            while (true)
            {
                Thread clientThread = new Thread(new ParameterizedThreadStart(Write));
                clientThread.Start();
            }
        }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2013, 14:42
Ответы с готовыми решениями:

Зависает при приёме больших данных
не могу разобраться что я делаю с потоком входящих данных не так, при входе большого колличества...

Программа зависает при приеме файла через NetworkStream
Передаю файл с сервера клиенту. Код клиентской части: FileStream fs = new...

Клиент-серверное приложение перстает работать при отправке/приеме 3-4 сообщений
Здравствуйте! При создании сервера (пока он ещё на начальном этапе и я сделал только самое простое)...

Программа зависает при приеме сообщения через com порт
создал один виртуальный порт.Написал программу для чтения и записи по этому порту, но при приёме...

4
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
31.03.2013, 14:47 2
может вместо Invoke использовать BeginInvoke?
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
31.03.2013, 14:52  [ТС] 3
нет..проблема точно не в этом...он туда даже не доходит..

Добавлено через 43 секунды
он настолько сильно вешается, что даже VS вешается...

Добавлено через 1 минуту
а через некоторое время выдаёт исключение типа "System.OutOfMemoryException".
на строчку
C#
1
clientThread.Start();
0
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,247
31.03.2013, 15:49 4
у вас там везде while(true), и при записи тоже, не оч хорошо такие штуки делать ведь
0
27 / 27 / 8
Регистрация: 30.03.2010
Сообщений: 380
Записей в блоге: 1
31.03.2013, 16:57  [ТС] 5
это всё не является решением проблемы..
хотя бы потому что на сервере это работает..с этими самыми while(true)
при этом если сообщение было послано, а потом перезапустить клиент, то он его принимает..и зависает..

Добавлено через 54 минуты
в общем вопрос в следующем:
Как правильно принимать сообщения от сервера?
м.б. создавать нечто вроде сервера внутри клиента, или есть более адекватный способ?..связанный лишь с добавлением некоторого функционала в клиент..
0
31.03.2013, 16:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2013, 16:57
Помогаю со студенческими работами здесь

При запуске зависает удаленный клиент
Добрый вечер, программистам и администраторам! Ребята, перенес базу &quot;ЗиК&quot; с обновлением...

Клиент-сервер зависает при старте
Написал клиент-серверное приложение, помогите найти проблему. После старта сервера программа...

Зависает клиент при получении файла
часть сервера public void getFile(string name) { ...

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

Зависает торрент - клиент при запуске (ЛЮБОЙ!)
Доброго времени суток, есть проблема, суть такова: при запуске любого торрент - клиента (будь то...

Клиент-сервер. При нажатии на start, окно зависает
Когда запускаю проект, всё работает норм, но когда нажимаю на start окно перестаёт реагировать на...


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

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

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