Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/43: Рейтинг темы: голосов - 43, средняя оценка - 4.88
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163

Socket.BeginConnect и чтение/запись данных - проверка кода

13.09.2012, 13:42. Показов 9756. Ответов 71
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
private void Connect()
        {
            String server = "192.168.10.100";
            Int32 port = 6000;
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(server);
            int iPortNo = System.Convert.ToInt16(port);
            IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
            try
            {
                server = "192.168.10.100";
                port = 6000;
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                ip = IPAddress.Parse(server);
                iPortNo = System.Convert.ToInt16(port);
                ipEnd = new IPEndPoint(ip, iPortNo);
                //_socket.Blocking = false; ?????
                _socket.BeginConnect(ipEnd, new AsyncCallback(ConnectCallback), _socket);
            }
            catch (Exception e)
            {
                _socket.Dispose();
                MessageBox.Show(e.ToString() + " Connect()");
            }
        }
public void ConnectCallback(IAsyncResult ar)
        {
            while (flag)
                try
                {
                    FileBuffer = new byte[BYTEBUFFER];
                    int j = 0;
                    Socket client = (Socket)ar.AsyncState;
                    buf12 = new byte[BYTEBUFFER];
                    int read = client.Receive(buf12);
                    fs.Write(buf12,0,buf12.Length);
 
                   int readFile =  fs.Read(FileBuffer, 0, FileBuffer.Length);
                    for (int i = 16; i <= read; i = i + 16)
                    {
                        Convert = BitConverter.ToInt16(buf12, i - 12);
                        
                       /* ThreadPool.QueueUserWorkItem(delegate(object sender)
                        {
                            System.Windows.Forms.DataVisualization.Charting.Chart _chart = (System.Windows.Forms.DataVisualization.Charting.Chart)sender;
                            _chart.Invoke(actionChart, new object[] {_chart, BitConverter.ToInt16(buf12, i - 12)});
                        },chart1);*/
                        if (chart1.InvokeRequired == false)
                            MessageBox.Show("FATAL");
                           Invoke(new Action(() =>
                        {
                            if(readFile !=0)
                                textBoxThread.AppendText(String.Format("{0}:{1}:{2}:{3}", FileBuffer[i - 16].ToString(), FileBuffer[i - 15].ToString(), BitConverter.ToInt16(FileBuffer, i - 14).ToString(), BitConverter.ToInt16(FileBuffer, i - 12).ToString()) + Environment.NewLine);
                            textBox1.Text=String.Format("{0}:{1}:{2}:{3}", buf12[i - 16].ToString(), buf12[i - 15].ToString(), BitConverter.ToInt16(buf12, i - 14).ToString(), Convert.ToString()) + Environment.NewLine;
                          //  chart1.Series[0].Points.AddY(Double.Parse(BitConverter.ToInt16(buf12, i - 12).ToString()));
                          //  textBoxThread.AppendText((j == BitConverter.ToInt16(buf12, i - 12) || j == 1000) ? "" : j.ToString() + Environment.NewLine);
                        }));
                       /* if (i % 400 == 0 || i == 16)
                        {
                            chart1.BeginInvoke(new Action(() =>
                            {
                                chart1.Series[0].Points.AddY(Convert);
                            }));
                        }*/
                    }
                    //    client.BeginReceive(buf12, 0, buf12.Length, 0,
                    //           new AsyncCallback(ReceiveCallback), buf12);
                }
                catch (Exception e)
                {
                    fs.Close();
                    MessageBox.Show(e.ToString() + " ConnectCallback(IAsyncResult ar)"); return;
                }
            
        }
Извеняюсь за быдло код.
Данные поступают я их вывожу в контролы.Также хотелось бы реализовать запись данных в файл и одновременное чтение в другом месте.как мне это реализовать без "Задержки данных" ибо мы используем асинхронный коннект. Также хотелось бы спросить у ГУРУ у меня "правильная логика" полученния данных вывод и всего остального?

Добавлено через 40 минут
И ещё если убрать комментарии возле Chart'a то видно не вооруженным глазом что данные "запаздывают" в Textbox'e я вижу только один путь исправления. "оптимизировать" Chart т.е. выводить только текущие значения(пакеты который только что пришли и прошлый пакет вырисовывать, а не все что бы график не выравнивался и не "скручивался"), но даже он не даст "точных" текущих значений на клиете(они не будут совпадать на сервере) как вывесте текущее значения в Chart??или как вылечить болезнь с "запаздыванием" данных если она вообще решается на моё примере(т.к. используем асинхронный коннект)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2012, 13:42
Ответы с готовыми решениями:

как передать начальные данные в Socket.BeginConnect
Добрый день. У System.Net.Socket есть метод который завершает асинхронное подключение к сокету и выдает начальные данные (принятые от...

Реализовать чтение данных ИБП Ippon через serial socket
Здравствуйте пытаюсь сделать такую задачу. У меня есть бесперебойник ippon я поставил себе такую задачу, нужно что бы по средством...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

71
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 10:05  [ТС]
Студворк — интернет-сервис помощи студентам
Delphi
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient;
 
type TRecvTime=record
hour:byte;
minute:byte;
second:byte;
millisec:word;
microsec:word;
RealSila:smallint;
ZadSila:smallint;
A:smallint;
S:smallint;
end;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    IdTCPClient1: TIdTCPClient;
    Button2: TButton;
    Memo2: TMemo;
    CheckBox1: TCheckBox;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure IdTCPClient1Disconnected(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
TClientOnReceive = class(TThread)
    private
    procedure Action; protected
    procedure Execute;override;
end;
 
var
  Form1: TForm1;
  ClientRecive:TClientOnReceive;
  recv_packet:array [1..50] of TRecvTime;
  SA:BOOLEAN;
  s,old_s:integer;
implementation
 
{$R *.dfm}
procedure TClientOnReceive.Action;
var
i:integer;
begin
with Form1 do
begin
if IdTCPClient1.Tag=-1 then
   begin
   ClientRecive.Terminate;
   Form1.IdTCPClient1.Disconnect;
   Form1.IdTCPClient1.Tag:=0;
   end;
 
for i:=1 to 50 do
    begin
    s:=recv_packet[i].millisec;
 
    if(old_s=-1) then
       old_s:=s
       else
       begin
       if(old_s=999) then
          old_s:=0
          else
          old_s:=old_s+1;
       end;
 
    if(old_s<>s) then
       begin
       Memo2.Lines.Add(inttostr(recv_packet[i].hour)+':'+inttostr(recv_packet[i].minute)+':'+inttostr(recv_packet[i].second)+':'+inttostr(s)+':'+inttostr(recv_packet[i].microsec)+'--'+inttostr(old_s)+':'+inttostr(s));
       Memo1.Lines.Add(inttostr(recv_packet[i].hour)+':'+inttostr(recv_packet[i].minute)+':'+inttostr(recv_packet[i].second)+':'+inttostr(s)+':'+inttostr(recv_packet[i].microsec)+'-----------------------------------');
       old_s:=-1;
       end
       else
       Memo1.Lines.Add(inttostr(recv_packet[i].hour)+':'+inttostr(recv_packet[i].minute)+':'+inttostr(recv_packet[i].second)+':'+inttostr(s)+':'+inttostr(recv_packet[i].microsec)+'-'+inttostr(recv_packet[i].RealSila));
    end;
 
end;
end;
 
procedure TClientOnReceive.Execute;
begin
  while not Terminated do
  begin
    try
    if not Form1.IdTCPClient1.Connected then
      Terminate
    else
      begin
      Form1.IdTCPClient1.ReadBuffer(recv_packet, SizeOf(recv_packet));
      Synchronize(Action);
      end;
    except
    end;
  end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption='Connect' then
   begin
     try
     IdTCPClient1.Host:='192.168.10.100';
     IdTCPClient1.Port :=6000;
     IdTCPClient1.Connect(10000);
 
     ClientRecive := TClientOnReceive.Create(True);
     ClientRecive.FreeOnTerminate:=True;
     ClientRecive.Resume;
     except
     on E: Exception do MessageDlg ('Îøèáêà ñîåäèíåíèÿ: '+#13+E.message, mtError, [mbOk], 0);
     end;
   end//if Button1.Caption='Connect' then
   else
   IdTCPClient1.Tag:=-1;
end;
 
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
Button1.Caption:='Disconnect';
Button2.Enabled:=TRUE;
old_s:=-1;
end;
 
procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
Button1.Caption:='Connect';
Button2.Enabled:=False;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTCPClient1.Tag:=-1;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
sa:=not sa;
if IdTCPClient1.Connected then
   begin
   IdTCPClient1.WriteBuffer(sa,sizeof(sa),true);
   end;
end;
 
end.
вот код клиента на делфи и всё работает=( а мне что то похожее надо только на шарпе
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 10:16
videoLoL, код простейший, не вижу особых трудностей переписать все на шарп. Такой вопрос: пробовал переписать клиента используя мой пример? Если нет, то сперва перепиши. В консольке сделай, чтобы был коннект, принимались данные. После продолжим.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 10:43  [ТС]
Ок сейчас переделаю под более менее читабельный вид

Добавлено через 24 минуты
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
        
        short Convert;
        bool flag = false;
        private const short BYTEBUFFER = 800;
        byte[] buf12 = new byte[BYTEBUFFER];
        byte[] BoolSend = new byte[1];
 
        Socket _socket = null;
 
        private void Connect(string ip, Int32 port)
        {
            try
            {
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(ip), System.Convert.ToInt16(port));
                _socket.BeginConnect(ipEnd, new AsyncCallback(ConnectCallback), _socket);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
 
        public void ConnectCallback(IAsyncResult ar)
        {
 
            while (flag)
                try
                {
                    ReceiveData();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
        }
 
        public void ReceiveData()
        {
            try
            {
                buf12 = new byte[BYTEBUFFER];
                int read = _socket.Receive(buf12);
                for (int i = 16; i <= read; i = i + 16)
                {
                    Convert = BitConverter.ToInt16(buf12, i - 12);
 
                    Invoke(new Action(() =>
                    {
                        textBox1.Text = String.Format("{0}:{1}:{2}:{3}", buf12[i - 16].ToString(), buf12[i - 15].ToString(), BitConverter.ToInt16(buf12, i - 14).ToString(), Convert.ToString()) + Environment.NewLine;
                        //chart1.Series[0].Points.AddY(Double.Parse(BitConverter.ToInt16(buf12, i - 12).ToString()));
                    }));
                    if (i % 400 == 0 || i == 16)
                    {
                        Invoke(new Action(() =>
                        {
                            chart1.Series[0].Points.AddY(Convert);
                        }));
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
 
        public void SendData()
        {
            BoolSend[0] = byte.Parse(textBoxThread.Text);
            _socket.Send(BoolSend);
        }
 
        private void ConButton_Click(object sender, EventArgs e)
        {
            ConButton.Enabled = flag;
            flag = true;
            button1.Enabled = flag;
            Connect("192.168.10.100", 6000);
        }
 
        private void DisconButton_Click(object sender, EventArgs e)
        {
            ConButton.Enabled = flag;
            flag = false;
            button1.Enabled = flag;
            Thread.Sleep(100);
            if (_socket.Connected)
            {
                _socket.Disconnect(false);
                _socket.Close();
            }
        }
 
        private void SendButton_Click(object sender, EventArgs e)
        {
            SendData();
        }
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 10:53
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void ConnectCallback(IAsyncResult ar)
        {
            Socket sock = ar.State as Socket;
            sock.EndConnect();
            while (flag)
                try
                {
                    ReceiveData();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
        }
должно быть примерно так, добавь две строчки. З.Ы. писал от руки, не ручаюсь за правильность этих двух строчек, но методы эти есть. Работает?
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 10:58  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public void ConnectCallback(IAsyncResult ar)
        {
            Socket sock = ar.AsyncState as Socket;
            sock.EndConnect(ar);
            while (flag)
                try
                {
                    ReceiveData();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
        }
Так и так всё работает.не могу понять смысл этих 2 строк..первая то понятно ..но вот Завершать ожидающий асинхронный запрос на подключение не понимаю зачем..

и ещё хотел сделать один класс что быпросто то инициализировать и методы вызывать но проблема в том что в методе ReceiveData() есть вывод в контролл и тут возникает проблемы я не могу понять как выводить в контролл делал ReceiveData(TextBox textbox) и толком не работает
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 11:10
sock.EndConnect(ar); - затем, что это асинхронный режим! Читай мат часть, каждый асинхронный вызов должен быть завершен end'ом.

На счет контрола не понял. Сделай глабольную переменную контрола и пиши в него что хочешь, откуда хочешь.
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 11:13  [ТС]
Пожалуйста если вам не трудно скиньте почитать про мат частью.

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
class ClientAsync
    {
        private Socket client;
        private IPEndPoint IP;
 
        public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
        public static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
        public static ManualResetEvent SendDone = new ManualResetEvent(false);
 
        private byte[] buf = new byte[800];
 
        public ClientAsync(string ip, Int32 port)
        {
            try
            {
                IP = new IPEndPoint(IPAddress.Parse(ip), port);
                client = new Socket(IP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            }
            catch(SocketException e)
            {
                MessageBox.Show(e.ToString());
            }
        }
 
        public void Start()
        {
            client.BeginConnect(IP, new AsyncCallback(ConnectCallback), client);
            //MessageBox.Show("Start");
        }
 
        private void ConnectCallback(IAsyncResult ar)
        {
            Socket socket = (Socket)ar.AsyncState;
            if (socket.Connected)
            {
                //ConnectDone.Set();
            }
            else
            {
                MessageBox.Show("Erorr Connected");
            }
        }
 
        public byte[] ReceiveData(/*ЛЮБОЙ КОНТРОЛЛ*/)
        {
//КАК ТОЛЬКО НЕ ПРОБЫВАЛ..НО ЭТОТ МЕТОД ДОЛЖЕН ВЫВОДИТЬ ДАННЫЕ В ЗАДАННЫЙ КОНТРОЛЛ
//РЕШИЛ ВОЗВРАШАТЬ БАЙТЫ А ПОТОМ КУДА ХОТЕЛ УЖЕ В FORM1 ТУДА И ВСАВЛЯЛ ЭТИ БАЙТЫ..НО ТУТ ВОЗНИКАЕТ ПРОБЛЕМА
//ВЫВОДА.ПИШИТ ЧТОТО ПРО ОЧЕРЕДЬ
            buf = new byte[800];
            //client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), buf);
            client.Receive(buf);
            return buf;
        }
 
        private void ReceiveCallBack(IAsyncResult ar)
        {
            try
            {
                byte[] TmpBuf = (byte[])ar.AsyncState;
                for (int i = 16; i <= TmpBuf.Length; i = i + 16)
                {
                 //   textBox1.Invoke(new Action(() =>
                //    {
                 //       textBox1.AppendText(String.Format("{0}:{1}:{2}:{3}", state[i - 16].ToString(), state[i - 15].ToString(), state[i - 14].ToString(), BitConverter.ToInt16(state, i - 12).ToString()) + Environment.NewLine);
                 //   }));
                    MessageBox.Show(BitConverter.ToInt16(buf, i - 12).ToString());
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
 
        public void Disconnect()
        {
            try
            {
                ConnectDone.Close();
                SendDone.Close();
                ReceiveDone.Close();
                if (client.Connected)
                {
                    client.Disconnect(false);
                    MessageBox.Show("Disconnect");
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                client.Close();
            }
 
        }
 
        private void ReadWriteToFile(string path)
        {
            using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
            {
                //byte[] FileBuffer = new byte[BYTEBUFFER];
                //fs.Write(buf12, 0, buf12.Length);
                //int readFile = fs.Read(FileBuffer, 0, FileBuffer.Length);
            }
        }
 
        
    }
Тут проблема вывода в контролл не могу вылечить её..создать класс что бы в дальнейшем им пользоватся..подскажите пожалуйста как правильно сделать.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 11:32
Цитата Сообщение от videoLoL Посмотреть сообщение
Тут проблема вывода в контролл не могу вылечить её..создать класс что бы в дальнейшем им пользоватся..подскажите пожалуйста как правильно сделать.
Я в такой ситуации создавал события и их уже скидывал вам.

http://msdn.microsoft.com/ru-r... 588te.aspx
http://msdn.microsoft.com/ru-r... 39x2a.aspx
http://msdn.microsoft.com/ru-r... 2eya8.aspx

Добавлено через 13 секунд
http://www.codeguru.com/csharp... art-II.htm

Добавлено через 2 минуты
думаю этих примеров хватит, чтобы начать разбираться в сокетах. Правда там теорию не очень много, но надо понять саму суть. Ну и, конечно, гугл в помощь. Лично мне по примерам проще учиться.

Добавлено через 6 минут
Клиент-серверное приложение, насколько верна организация предпоследнее сообщение с примерами. Там используются события, как раз таки то что тебе нужно.
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 12:04  [ТС]
Спасибо за статьи. но у меня данные идут бесконечно и при рвет их только тогда когда клиент этого захочет. это мне не нужно
C#
1
2
3
4
 
        public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
        public static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
        public static ManualResetEvent SendDone = new ManualResetEvent(false);
и как вывести контролл из класса
C#
1
2
3
4
5
6
7
Client _client = new Client("192......", 6000);
_client.start();
.....
_client.ReceiveData(textbox1);
//и он выводит в данные в текстбокс
//или лучше сделать так byte[] _buf = _client.ReceiveData();
//а после работать с байтами ?? в последнем способе выбивает ошибки
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 12:22
Цитата Сообщение от videoLoL Посмотреть сообщение
public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
* * * * public static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
* * * * public static ManualResetEvent SendDone = new ManualResetEvent(false);
Корректируй под себя, как тебе удобней будет, что-то не нужно, удаляй)

В принципе можешь создать
TextBox testbox = textBox1;
и передавать в конструктор переменную testbox, ну и соответственно в классе делать что в этом духе: testbox.Text = ReceiveData();
Но это очень корявый способ, я бы на твоем месте, посидел бы и разобрался бы с событиями. Это было бы намного грамотнее, да и на будущее может пригодится, тем более живой пример я тебе скинул.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 12:31  [ТС]
Надеюсь вы не про вот это? Создаешь класс для обработки события, обычно это класс унаследованный от EventArgs, в котором содержатся переменные, нужные тебе(например айпи адрес отправителя, количество принятый данных и т.п.) и делаешь там просто конструктор на инициализацию этих данных. Далее в коде клиента созда делег для события, и метод для заполнения данными этого события. Далее в форме останется объявить это события для класса клиента и реализовать его.
Пример как создать события:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ClientSendMsgEventArgs : EventArgs
    {
        public string msg;
        public string IP;
        public string port;
        public ClientSendMsgEventArgs(string msg, string IP, string port)
        {
            this.IP = IP;
            this.port = port;
            this.msg = msg;
        }
    }
 
    public delegate void ClientSendMsgEventHandler(object sender, ClientSendMsgEventArgs e);
Пример как определить событие внутри класса:
Код C#
C#
1
2
3
4
5
6
7
8
9
public event ClientSendMsgEventHandler ClientSendMsgEvent;
 protected virtual void OnClientSendMsg(ClientSendMsgEventArgs e)
        {
            if (ClientSendMsgEvent != null)
                ClientSendMsgEvent(this, e);
        }
....где то внутри метода отправки данных
OnClientSendMsg(new ClientReceiveMsgEventArgs(str, e.RemoteEndPoint.ToString(), msg));
...
Потоки тут не при чем. Ты пишешь обычный асинхронный клиент, либо любой другой.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 12:38
Именно про это.

https://www.cyberforum.ru/post2774974.html

по ссылке найдешь пример, если разберешься - будет здорово.
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 12:41  [ТС]
Спасибо за помощь буду разбиратся..правда там исходник сервера..а сервер то у меня уже написан и он не под .Net..а вот клиент с событиями я по изучаю..видимо тема ещё не закрыта)
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 12:43
Сервер тут не при чем. Делаешь все идентично примеру, ставишь методы On... там где тебе надо и записываешь в них нужную инфу.
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
14.09.2012, 12:49  [ТС]
увеличил буфер с 800 до 8192 заметил что если выводить в Textbox1.Invoke(new Action(()=> Textbox1.text = .....));
анологично в Chart.. пакеты приходили по 800байт..теперь приходят по 1600..и если Chart не очищать пакеты начинают приходить по 8192.
Поправьте если я не правильно напишу..
т.е. Chart рисует чз Invoke т.е. тратится время и когда Chart дорисовал принимается следующая "порция" пакетов.. и т.д. Chart уже сложно "ДОРИСОВЫВАТЬ новые точки" к текущим и уже тратися больше времени в это время очередь пакетов копится..и Recive хочет как можно быстрее их отдать Chart'у??
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
14.09.2012, 12:59
Не доводилось работать с Chart'ом, поэтому не могу что-то конкретное посоветовать. Но по идеи чарт виснит из-за того, что в него постоянно пытаются что-то впихнуть. Как вариант, можно сделать очередь, или событие на остановку дальнейшего приема данных чарта, пока не отрисуются текущие(т.е. с помощью ManualResetEvent)
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
24.09.2012, 09:56  [ТС]
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
class ClientAsync
    {
        private Socket client;
        private IPEndPoint IpPort;
        private bool flag = false;
        private byte[] buf;
 
        public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
        public static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
        public static ManualResetEvent SendDone = new ManualResetEvent(false);
       
        public event ClientConnectedEventHandler ClientConnected;
        public event DataReceivedEventHandler DataReceived;
        public event DataSendEventHandler DataSend;
 
        protected virtual void OnDataSend(DataSendEventArgs e)
        {
            if (DataSend != null)
                DataSend(this, e);
        }
 
        protected virtual void OnClientConnected(ClientConnectedEventArgs e)
        {
            if (ClientConnected != null)
                ClientConnected(this, e);
        }
 
        protected virtual void OnDataReceived(DataReceivedEventArgs e)
        {
            if (DataReceived != null)
                DataReceived(this, e);
        }
 
        public ClientAsync(string ip, Int32 port, short ByteBuffer)
        {
            this.buf = new byte[ByteBuffer];
            this.IpPort = new IPEndPoint(IPAddress.Parse(ip), port);
        }
 
        public void Start()
        {
            try
            {
                flag = true;
                this.client = new Socket(IpPort.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                this.client.BeginConnect(IpPort, new AsyncCallback(ConnectCallback), client);
                OnClientConnected(new ClientConnectedEventArgs(true));
            }
 
            catch (SocketException e)
            {
                MessageBox.Show(e.ToString());
            }
        }
 
        private void ConnectCallback(IAsyncResult ar)
        {
            Socket socket = ar.AsyncState as Socket;
            socket.EndConnect(ar);
            while (flag)
            //ConnectDone.Set();
            {
                int readByte = socket.Receive(buf);
                OnDataReceived(new DataReceivedEventArgs(buf, readByte));
                //client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), buf);
            }
        }
 
        public void Send(byte[] SendMessage)
        {
            client.Send(SendMessage);
            OnDataSend(new DataSendEventArgs(SendMessage));
        }
 
        private void ReceiveCallBack(IAsyncResult ar)
        {
            byte[] TmpBuf = ar.AsyncState as byte[];
            OnDataReceived(new DataReceivedEventArgs(TmpBuf, TmpBuf.Length));
        }
 
        public void Disconnect()
        {
            try
            {
                //ConnectDone.Close();
                //SendDone.Close();
                //ReceiveDone.Close();
                if (client.Connected)
                {
                    flag = false;
                    client.Disconnect(false);
                    OnClientConnected(new ClientConnectedEventArgs(false));
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                client.Close();
            }
        }
    }
 
public delegate void ClientConnectedEventHandler(object sender, ClientConnectedEventArgs e);
    public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);
    public delegate void DataSendEventHandler(object sender, DataSendEventArgs e);
 
    public class DataSendEventArgs : System.EventArgs
    {
        private byte[] sendMessage;
        public DataSendEventArgs(byte[] SendMessage)
        {
            this.sendMessage = SendMessage;
        }
    }
 
    public class ClientConnectedEventArgs : System.EventArgs
    {
        public bool asynConnected;
 
        public ClientConnectedEventArgs(bool AsynConnected)
        {
            this.asynConnected = AsynConnected;
        }
    }
 
    public class DataReceivedEventArgs : System.EventArgs
    {
        public byte[] message;
        public int readByte;
 
        public DataReceivedEventArgs(byte[] Message,int ReadByte)
        {
            this.message = Message;
            this.readByte = ReadByte;
        }
    }
 
public partial class Form1 : Form
    {
        ClientAsync clientA = new ClientAsync("192.168.10.100", 6000,8000);
        short Convert;
        bool flag = false;
        byte[] BoolSend = new byte[1];
 
        public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
        public static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
        public static ManualResetEvent SendDone = new ManualResetEvent(false);
 
        public Form1()
        {
            InitializeComponent();
            clientA.DataReceived += new Lp.Client.Async.DataReceivedEventHandler(clientA_DataReceived);
            clientA.DataSend += new DataSendEventHandler(clientA_DataSend);
            clientA.ClientConnected += new ClientConnectedEventHandler(clientA_ClientConnected);
            button1.Enabled = flag;
            chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
            chart1.ChartAreas[0].CursorX.IsUserEnabled = true;
            chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
            chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
            chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
            
        }
 
        void clientA_ClientConnected(object sender, ClientConnectedEventArgs e)
        {
            if (e.asynConnected)
                Conlabel.Text = "Client Connect";
            else
                Conlabel.Text = "Client Disconnect";
        }
 
        void clientA_DataSend(object sender, DataSendEventArgs e)
        {
 
        }
    
        void clientA_DataReceived(object sender, Lp.Client.Async.DataReceivedEventArgs e)
        {
            try
            {
                for (int i = 16; i <= e.readByte; i = i + 16)
                {
                    Convert = BitConverter.ToInt16(e.message, i - 12);
                    if (!flag)
                        break;
                    Invoke(new Action(() =>
                    {
                        textBox1.Text = (String.Format("{0}:{1}:{2}:{3}", e.message[i - 16].ToString(), e.message[i - 15].ToString(), BitConverter.ToInt16(e.message, i - 14).ToString(), Convert.ToString()) + Environment.NewLine);
                        //chart1.Series[0].Points.AddY(Double.Parse(BitConverter.ToInt16(buf12, i - 12).ToString()));
                        textBoxThread.Text = (" " + e.readByte.ToString());
                    }));
                    if (i % 400 == 0 || i == 16)
                    {
                        Invoke(new Action(() =>
                        {
                            if ((chart1.Series[0].Points.AddY(Convert)+1) % 500 ==0)
                            {
                                
 
                            }
                        }));
                    }
                }
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.ToString());
            }
        }
 
        private void ConButton_Click(object sender, EventArgs e)
        {
            ConButton.Enabled = flag;
            flag = true;
            button1.Enabled = flag;
            clientA.Start();
        }
 
        private void DisconButton_Click(object sender, EventArgs e)
        {
            ConButton.Enabled = flag;
            flag = false;
            button1.Enabled = flag;
            //Thread.Sleep(100);
            clientA.Disconnect();
        }
 
        private void SendButton_Click(object sender, EventArgs e)
        {
            BoolSend[0] = byte.Parse(textBoxThread.Text);
            clientA.Send(BoolSend);
        }
    }
Так правильно?)
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
24.09.2012, 13:04
videoLoL, О_о . Я вижу ты смог понять как все работает, в частности события, и сделал теперь все правильно) Мои поздравления. Но, не могу не спросить, теперь работает все как надо?)
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
24.09.2012, 13:18  [ТС]
Работает как надо..но есть проблемы..с Методом Send. Не выгляди ли он кастыльно?..и бывает такое что при нажатие на Коннект и сразу же Дисконект форма иногда закрывается.=(
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
24.09.2012, 13:26
videoLoL, на счет костыльности не знаю, по сути 1 строчка и будет из себя представлять отправку данных, и я смотрю ты до сих делаешь асинхронный коннект, но синхронные send и receive. Переделай в асинхронный, если есть желание.

На счет выкидывания из формы, тут остается только тестить, т.е. смотри при каких обстоятельствах закрывается и т.п. Просто так не моэет закрываться же, верно?

Send можно усложнить только добавлением к передаваемой строке каких нибудь специальных символов, но думаю тут это лишнее, так как ты разрабатваешь только 1 часть приложения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2012, 13:26

Чтение/запись hex кода файла
Я сделал процедуру записи в указанный файл, в указанный адрес нужный код hex. Вот: procedure writebyte(filename:string; Address:...

Проверка прав доступа (чтение/запись) в директории
Нужно проверить, доступна ли данная директория (к примеру &quot;D:\\readonly_folder\&quot;) для записи/чтения файлов. Подскажите, как можно...

Open/Save Dialog. Сериализация данных. Запись/чтение данных объектов в/из потока.
Описана файловая переменная FileOfFilms: file of TFilmArr и переменная, содержащая имя файла FileName: string, на форме присутствуют...

Чтение текстового файла. Парсинг его данных. Создание исключений для данных. Запись свойств объектов в файл
Проблема такая. Есть файл data.txt. В нем например какие-то данные. Landon Donovan, 150, A Hulk Hogan , 100, M Duke Nukem, 50,...

Чтение и запись данных
Здравствуйте, я записываю данные в файл (длинный код): vsevolod-s10.hut4.ru\открытия.txt И читаю я их таким образом:...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru