98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378

Приложение мгновенного обмена сообщениями, как получить список друзей

22.03.2012, 19:17. Показов 6825. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Я работаю на C# всего нечего, но он меня заинтересовал... и я решил на тему дипломной программы выбрать "Приложение мгновенного обмена сообщениями" на C# (хочу реализовать что похожие на qip, mail agent, в лучшем случае по функциональности похожим на skype), потихоньку освоил сокеты и использую примеры из книжки "NET. Сетевое программирование для профессионалов" Асинхронное приложение сервер (так сказать взял его за основу и разрабатываю дальше). Очень трудно освоить =(, сейчас мне интересно как реализовать разрыв клиента к серверу, то есть после закрытия клиентом приложение, чтобы на сервере закрывался поток(сокет), у меня происходит ошибка на данной строчке
C#
1
int bytesRead = handler.EndReceive(ar);
пишет "Удаленный хост принудительно разорвал существующее подключение", как этого избежать непойму.

Так как там застрял я начал писать клиентскую часть, а если точнее взялся за оформление и тут тоже не могу найти решение, как реализовать список друзей/user list (чтобы было фото, имя, статус, ну еще что то) и так же диалоговое окно/окно обмена сообщениями (пробовал сделать с MDI формой, но как то не удачно, мало возможностей изменений интерфейса). В интернете я нашел много примеров изменения компонентов и форм, но почти везде используется рисование, что у меня вовсе не удается =(.

Еще не могу не как придумать как лучше сделать, передачу данных о пользователе (фото, имя, ид, возраст, статус и тп), сохранение истории.

Вобщем итоге у меня есть сервер к которому можно подключиться и авторизоваться.

Все данные о пользователе я беру из БД MySql.

Добавлено через 21 час 8 минут
Оформление
Listbox
Вобщем решил сам нарисовать свой ListBox, нашел статью сделал все как там описано (в плане рисование компоненты), но вышло как то не удачно (исходник залил)
Не могу понять по какой причине увеличивается размер изображения, оно имеет размер 48х48, а при добавления записи ее размер увеличивается и выходит за рамки дозволенного.
Так же в том исходнике указан пример с тем что там всегда одно изображение, а мне нужно чтобы у каждого значение было свое изображение (будет загружаться с сервера).
+ ко всему при добавление записи в мою компоненту создается ошибка... как объяснить ее даже не знаю, посмотрите в исходнике.

Tabcontrol
Так как с MDI не получается сделать диалоговое окно решил использовать Tabcontrol, первым делом нашел такую чтобы была возможность закрыть вкладку. Тут. Возникло сразу 2 вопроса каким образом поменять цвет шапки и внутренностей.
Так же не могу реализовать чтобы при нажатии на элемент, из списка Listbox, открывалось окно где есть контрол и в ней одна вкладка с двумя Rich или Textbox'ами, button кнопкой отправки, menustrip, picturebox. И при последующем нажатии другого элемента, из списка Listbox, открывалось та же форма с тем же контролом, но просто добавил новая вкладка с тем же компонентами.

И еще на счет сервера не кто не знает? (описано в посте выше)
Вложения
Тип файла: rar LBP.rar (45.6 Кб, 51 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2012, 19:17
Ответы с готовыми решениями:

Программа для мгновенного обмена сообщениями
Скажи, пожалуйста, если писать программу для обмена через Интернет, а не по локальной сети. То что для этого надо? Я так понимаю нужен...

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

Как получить список друзей вк
Как получить список друзей вк Авторизуюсь так: <?php function wparse($s, $starts, $ends){ * *$result=substr($s, strpos($s,...

33
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
23.03.2012, 15:35  [ТС]
Доброго времени!
Нужна ваша помощь. Решил пока оставить рисование компонентов и вернулся к MDI контейнеру, возникла идея сделать не диалоговое окно (сообщений) как в mail-agente или qip, с делать что то похожие на скайп, идея в принципе удалась, но есть мелочи которые я не могу не как решить, я для начало опишу что решил сделать , на Form1 создать panel1 привязать ее к одному из краев (я выбрал левый край), задать ей определенный размер, кинуть на форму menustrip, и при вызове дочернего окна сделать его "во весь экран" (это получается свободное место, оставшиеся от панели и меню) и тут начинаются косяки:
Во первых, немогу убрать стандартные кнопки с form2 (закрыть, свернуть, и тп), а также иконку, с тем учетом что Form2 имеет FormBorderStyle = None;
Во вторых, у меня немного свой дизайн (в плане что я не хочу сделать его примитивным windows приложением), и по краем вылазит не нужные лини, что портит всю картину;
В третьих, когда я вызываю Form2, как я сказал ранее форма "во весь экран", она переходит за menustrip и menustrip ее закрывает
C#
1
2
chlog.WindowState = FormWindowState.Maximized;
chlog.Show();
но если поменять строчку таким образом
C#
1
2
chlog.Show();
chlog.WindowState = FormWindowState.Maximized;
то она не приятно появляется ( появляется форма размером 292; 271, и начинает разворачиваться во весь экран)

На скриншоте я изобразил, первые две ошибки (я не стал форму подгонять под стиль, так как пока просто экспериментирую).
ЗЫ: так же я решил для отображения списка друзей использовать listview и imagelist, думаю это будет даже как то лучше выглядеть, точнее надеюсь
Миниатюры
Приложение мгновенного обмена сообщениями, как получить список друзей  
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.03.2012, 16:24
1. Реализуй на сервере класс-пользователь и лист этих классов, который заполняется по мере подключения пользователей. и функцию, которая возвращает открытые данные по всем пользователям.
2.
немогу убрать стандартные кнопки с form2 (закрыть, свернуть, и тп),
MyForm.ControlBox - false
для иконки аналогично есть поле-свойство
1
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
23.03.2012, 16:43  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
2.MyForm.ControlBox - false
для иконки аналогично есть поле-свойство
Да спасибо, там иконка сразу исчезает с этим свойством, а как сделать чтобы с низу это рамка исчезла?

Цитата Сообщение от Learx Посмотреть сообщение
1. Реализуй на сервере класс-пользователь и лист этих классов, который заполняется по мере подключения пользователей. и функцию, которая возвращает открытые данные по всем пользователям.
нет это позже, я имею ввиду как с сервера/клиента передать простым путем данные?
допустим для авторизации я сделал так, что пользователь вбивает логин и пароль, они сохраняются в строку с двумя спец символами, один символ оповещает сервер что это авторизацию (&), а второй говорит о том где кончается логин и начинается пароль (|), &login|password.
если все сделать таким образом это довольно таки не выгодно, слишком много циклов распознавания сообщения от клиента/сервера, что ведет к длительным обработкам.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.03.2012, 16:54
создай свой класс - пакет
один из параметров - тип запроса(подключение, сообщение, отключение и т.д.)

применяешь к своему классу xml(для html протокола) или бинарную сериализацую(для любого протокола) - получаешь на сервере пакет данных, десириализуешь, обрабатываешь

внутри класа-пакета можно реализовать шифрование данных.
1
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
23.03.2012, 17:06  [ТС]
Learx, к сожалению я имею мало понятия о том что вы написали , так как учил только что нужно было, как сейчас и если вас не затруднит можете доступным языком объяснить что вы имеете в виду.
Спасибо за помощь.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.03.2012, 18:50
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//класс -пакет
class MySend
{
//определяем тип пакета
int type;
//данные, сообщение, логин-пароль
string message; 
}
....
//создаем сообщение
MySend  mes = new MySend();
mes.type=1;//пусть 1 - авторизация
mes.message = "login|pass"; //логин-пароль
//поток в память
System.IO.MemoryStream ms = new System.IO.MemoryStream();
XmlSerializer  xs = new XmlSerializer (typeof(MySend));
//сериализуем в память
xs.Serialize(ms, mes);
//получем строку сериализованного объекта
string str = Encoding.Default.GetString(ms.ToArray());
//отправляем на сервер
Send(str);
XML сериализация
Бинарная сериализация

что делать на сервере думаю разберешься
2
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
23.03.2012, 20:25  [ТС]
Извините что задаю столько вопросов...
С сериализацией я вроде разобрался ,частично, но возник вопрос как использовать переменные одного класса в другом? и таким же образом возможно передавать изображения?

И еще возник вопрос со списком друзей, изначально я себе представлял что в таблице(юзеров) бд будет поле "friend_list", в котором будет перечислены id или логины пользователей, что находятся в друзьях, через ";", когда пользователь проходит авторизацию, ему передавались все свои данные ( "login, user_id, user_pass, user_mail, user_year, user_name, user_surname, user_photo, friend_list), после чего запускать запрос на сервер о получение данных на каждого друга/пользователя... И подобным образом отправлять сообщения, "id/login | сообщение/звонок/картинку/данные..."

Да и вобще я один могу реализовать такой проект в течение месяца-двух или же надо будет отбросить некоторые функции программы?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
24.03.2012, 12:36
умеючи для локальной сети чатик можно за неделю сделать.

чтоб передавать изображения добавь в класс-пакет поле - массив байт.

про список друзей я тебе говорил выше: создаешь класс на сервере напр. User, который хранит инфу о пользователе( в том числе его сокет)
создаешь List<User> пользователей и при подключении добавляешь в этот лист нового пользователя.
при запросе на список онлайн - делаешь выборку из твоего List<User> на сервере тех кто находится в списке друзей запросившего пользователя, или просто весь список, если у тебя чат.

если на сервер приходит сообщения для пользователя с таким-то логином просто находишь его в листе и отправляешь на его сокет сообщение и т.д.

хотя еще лучше будет хранить инфу о пользователе на сервере и при авторизации брать данные с сервера, а не от пользователя
1
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
27.03.2012, 19:27  [ТС]
что то я поспешил с выводом =/ ваще все напортачил...

Добавлено через 21 минуту
Вобщем запутался, как преобразовать полученный байт в поток памяти, от туда в переменные класса ?


Добавлено через 5 часов 36 минут
Так с десериализацией я разобрался, но тут какая то ошибка на сервере
так я сериализую на клиенте


Добавлено через 3 часа 11 минут
И тут тоже разобрался, надо было создать библиотеку класса, который я сереализовал, и добавить в обе программы...

На клиентской части я использую notifyicon, когда я вызываю окно авторизацию, заполняю данные, жму кнопку Login у меня появляется еще одно иконка в трее и так при каждой нажатии клавиши Login. Как решить эту проблему?

Добавлено через 11 часов 57 минут
Кто подскажет что не так, пользователь проходит авторизацию если все верно ему возвращается класс MySend(type, message) и на форме должно поменяться название, типо "Chat - Login", а у меня остается "Chat - Chat", может я отправляю не так данные?
Сервер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("login and password true");
Console.ResetColor();
mes.type = 100;//100 - конект
mes.message = command; //логин
 
//поток в память
MemoryStream mse = new MemoryStream();
BinaryFormatter xse = new BinaryFormatter();
//сериализуем в память
xse.Serialize(mse, mes);
 
//получем строку сериализованного объекта
string str = Encoding.Default.GetString(ms.ToArray());
byte[] msg = Encoding.ASCII.GetBytes(str);
// Отправляем данные через сокет
int bytesSent = ClientSocket.Send(msg);
Клиент
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
            byte[] bytes = new byte[1024];
 
            try
            {
                // устанавливаем удаленную конечну точку для скета
                IPHostEntry ipHost = Dns.Resolve("0.0.0.0");
                IPAddress ipAddr = ipHost.AddressList[0];
                IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 9050);
 
                Socket sender = new Socket(AddressFamily.InterNetwork, 
                                                SocketType.Stream, ProtocolType.Tcp);
 
                // соединяем сокет с удаленной конечной точкой
                sender.Connect(ipEndPoint);
 
                byte[] msg = Encoding.ASCII.GetBytes(mesg);
 
                // Отправляем данные через сокет
                int bytesSent = sender.Send(msg);
 
                // Получаем ответ от удаленного устройства
                int bytesRec = sender.Receive(bytes);
 
                //поток в память
                MemoryStream mse = new MemoryStream(bytes);
                BinaryFormatter xse = new BinaryFormatter();
                //десериализуем в память
                MySend mes = (MySend)xse.Deserialize(mse);
                mse.Close();
                mesd.Text = mes.message.ToString();
            }
            catch
            {
                //MessageBox.Show("error");
            }
0
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
30.03.2012, 19:03  [ТС]
Может кто скинуть пример асинхороного клиента?
Второй день не могу разобраться с примером из книги NET. Сетевое программирование для профессионалов.

Добавлено через 22 часа 58 минут
Клиент отправляет одно сообщение и закрывает в чем проблема?
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        public static string theResponse = "";
        public static byte[] buffer = new byte[1024];
 
        public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
        public static ManualResetEvent SendDone = new ManualResetEvent(false);
        public static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
 
        static void Main(string[] args)
        {
            try
            {
                IPHostEntry ipHost = Dns.Resolve("0.0.0.0");
                IPAddress ipAddr = ipHost.AddressList[0];
                IPEndPoint endPoint = new IPEndPoint(ipAddr, 9050);
 
                Socket sClient = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);
 
                sClient.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), sClient);
 
                ConnectDone.WaitOne();
            }
            catch { }
        }
 
        public static void ConnectCallback(IAsyncResult ar)
        {
            Thread thr = Thread.CurrentThread;
 
            Socket sClient = (Socket)ar.AsyncState;
            sClient.EndConnect(ar);
 
            byte[] byteData = Encoding.ASCII.GetBytes(Console.ReadLine());
 
            sClient.BeginSend(byteData, 0, byteData.Length, 0,
                new AsyncCallback(SendCallback), sClient);
 
            ConnectDone.Set();
        }
 
        public static void SendCallback(IAsyncResult ar)
        {
            Thread thr = Thread.CurrentThread;
 
            Socket sClient = (Socket)ar.AsyncState;
 
            int byteSent = sClient.EndSend(ar);
 
            sClient.BeginReceive(buffer, 0, buffer.Length, 0,
                new AsyncCallback(ReceiveCallback), sClient);
 
            SendDone.Set();            
        }
 
        public static void ReceiveCallback(IAsyncResult ar)
        {
            Thread thr = Thread.CurrentThread;
 
            Socket sClient = (Socket)ar.AsyncState;
            
            int bytesRead = sClient.EndReceive(ar);
 
            if (bytesRead > 0)
            {
                theResponse += Encoding.ASCII.GetString(buffer, 0, bytesRead);
 
                sClient.BeginReceive(buffer, 0, buffer.Length, 0,
                    new AsyncCallback(ReceiveCallback), sClient);
            }
            else
            {
                ReceiveDone.Set();
            }
            Console.ReadKey();
        }
    }
}
Добавлено через 7 часов 25 минут
up up хелп!!!
0
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
09.04.2012, 22:47  [ТС]
Помогите разобраться не чо не пойму
На сервер с клиента приходит сообщение с логином и паролем, сервер принимает вывод в консоль сообщение о том что логин и пароль верные и тут я незнаю что не так, либо сервер не отсылает сообщение, либо клиент тупит
Сервер
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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using Library;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Net.NetworkInformation;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
 
namespace ServerSpeakPort
{
    class Mains
    {
        //переменные для подключения MySql
        public static string mysql_user = "root";
        public static string mysql_pass = "";
        public static string mysql_host = "localhost";
        public static string mysql_dbname = "sp";
 
 
        //переменные для идентификация пользователя
        public static string user_Login = "";
        public static string user_Pas = "";
        public static string user_Id = "";
 
        //буфер для получения и отправки данных
        public static byte[] buffer = new byte[1024];
 
        //класс события для поддержки синхронизации
        public static ManualResetEvent socketEvent = new ManualResetEvent(false);
 
        static void Main(string[] args)
        {
            IPHostEntry ipHost = Dns.Resolve(Dns.GetHostName());
            //IPHostEntry ipHost = Dns.Resolve("127.0.0.0");
            IPAddress ipAddr = ipHost.AddressList[0];
 
            IPEndPoint localEnd = new IPEndPoint(ipAddr, 9050);
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine(ipAddr.ToString());
 
            Socket sListener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);
 
            //связываем сокет
            sListener.Bind(localEnd);
 
            //начинаем слушать
            sListener.Listen(10);
 
            Console.WriteLine("Waiting for a connection...");
            Console.ResetColor();
 
            AsyncCallback aCallback = new AsyncCallback(AcceptCallback);
 
            //асинхронная функция, дающая согласие на соединения
            sListener.BeginAccept(aCallback, sListener);
 
            //ждем, пока другие потоки закончат работу
            socketEvent.WaitOne();
        }
 
        public static void AcceptCallback(IAsyncResult ar)
        {
            //сокет для получения запросов
            Socket listener = (Socket)ar.AsyncState;
 
            //новый сокет
            Socket handler = listener.EndAccept(ar);
 
            handler.BeginReceive(buffer, 0, buffer.Length, 0,
                new AsyncCallback(ReceiveCallback), handler);
        }
 
        public static void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                Socket ClientSocket = (Socket)ar.AsyncState;
                int bytesRead = ClientSocket.EndReceive(ar);                
 
                //если данные есть
                if (bytesRead > 0)
                {
                    //поток в память
                    MemoryStream ms = new MemoryStream(buffer);
                    BinaryFormatter xs = new BinaryFormatter();
                    //десериализуем в память
                    MySend mes = (MySend)xs.Deserialize(ms);
                    ms.Close();
 
                    switch (mes.type)
                    {
                        case 1: //Login
                            try
                            {
                                try
                                {
                                    int l = 0;
                                    for (int i = 0; i < mes.message.Length; i++)
                                    {
                                        if (mes.message[i] != '|')
                                        {
                                            l++;
                                        }
                                        else break;
                                    }
                                    for (int i = 0; i < l; i++)
                                    {
                                        user_Login = user_Login + mes.message[i];
                                    }
                                    for (int i = l + 1; i < mes.message.Length; i++)
                                    {
                                        user_Pas = user_Pas + mes.message[i];
                                    }
 
                                    string Connect = "Database=" + mysql_dbname + ";Data Source=" + mysql_host + ";User Id=" + mysql_user + ";Password=" + mysql_pass;
                                    MySqlConnection mysql_connect = new MySqlConnection(Connect);
 
                                    MySqlCommand mysql_query = new MySqlCommand("SELECT `username` FROM `users`;", mysql_connect);
 
                                    mysql_connect.Open();
 
                                    MySqlDataReader mysql_result;
                                    mysql_result = mysql_query.ExecuteReader();
 
                                    while (mysql_result.Read())
                                    {
                                        Console.WriteLine(mysql_result.GetString(0));
                                    }
 
                                    mysql_connect.Close();
 
                                    string command;
                                    command = user_Login;
                                    if (command != "")
                                    {
                                        mysql_query = new MySqlCommand("SELECT * FROM `users` WHERE `username`=\"" + command + "\";", mysql_connect);
                                        mysql_connect.Open();
                                        mysql_result = mysql_query.ExecuteReader();
                                        if (mysql_result.HasRows)
                                        {
                                            mysql_result.Read();
                                            if (mysql_result.GetString(0) != user_Login)
                                            {
                                                Console.ForegroundColor = ConsoleColor.Green;
                                                Console.WriteLine("error login");
                                                Console.ResetColor();
                                                mes.type = 101;//101 - нет такого юзера
                                                mes.message = "Нет такого юзера"; //логин-пароль чистим поле
 
                                                //поток в память
                                                MemoryStream mse = new MemoryStream();
                                                BinaryFormatter xse = new BinaryFormatter();
                                                //сериализуем в память
                                                xse.Serialize(mse, mes);
 
                                                //получем строку сериализованного объекта
                                                string str = Encoding.Default.GetString(ms.ToArray());
                                                byte[] msg = Encoding.ASCII.GetBytes(str);
                                                // Отправляем данные через сокет
                                                ClientSocket.BeginSend(msg, 0, msg.Length, 0,
                                                    new AsyncCallback(SendCallback), ClientSocket);
                                            }
                                            else
                                            {
                                                if (mysql_result.GetString(2) != user_Pas)
                                                {
                                                    Console.ForegroundColor = ConsoleColor.Green;
                                                    Console.WriteLine("error password");
                                                    Console.ResetColor();
                                                    mes.type = 102;//102 - неверный пароль
                                                    mes.message = "Неверный пароль"; //логин-пароль чистим поле
 
                                                    //поток в память
                                                    MemoryStream mse = new MemoryStream();
                                                    BinaryFormatter xse = new BinaryFormatter();
                                                    //сериализуем в память
                                                    xse.Serialize(mse, mes);
 
                                                    //получем строку сериализованного объекта
                                                    string str = Encoding.Default.GetString(ms.ToArray());
                                                    byte[] msg = Encoding.ASCII.GetBytes(str);
                                                    // Отправляем данные через сокет
                                                    ClientSocket.BeginSend(msg, 0, msg.Length, 0,
                                                        new AsyncCallback(SendCallback), ClientSocket);
                                                }
                                                else
                                                {
                                                    Console.ForegroundColor = ConsoleColor.Green;
                                                    Console.WriteLine("login and password true");
                                                    Console.ResetColor();
                                                    mes.type = 100;//100 - конект
                                                    mes.message = command; //логин
 
                                                    //поток в память
                                                    MemoryStream mse = new MemoryStream();
                                                    BinaryFormatter xse = new BinaryFormatter();
                                                    //сериализуем в память
                                                    xse.Serialize(mse, mes);
 
                                                    //получем строку сериализованного объекта
                                                    string str = Encoding.Default.GetString(ms.ToArray());
                                                    byte[] msg = Encoding.ASCII.GetBytes(str);
                                                    // Отправляем данные через сокет
                                                    ClientSocket.BeginSend(msg, 0, msg.Length, 0,
                                                        new AsyncCallback(SendCallback), ClientSocket);
                                                    break;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            Console.ForegroundColor = ConsoleColor.Green;
                                            Console.WriteLine("not found");
                                            Console.ResetColor();
                                            mes.type = 103;//103 - пользователь с таким именем не найден
                                            mes.message = "Пользователь с таким именем не найден"; //логин-пароль чистим поле
 
                                            //поток в память
                                            MemoryStream mse = new MemoryStream();
                                            BinaryFormatter xse = new BinaryFormatter();
                                            //сериализуем в память
                                            xse.Serialize(mse, mes);
 
                                            //получем строку сериализованного объекта
                                            string str = Encoding.Default.GetString(ms.ToArray());
                                            byte[] msg = Encoding.ASCII.GetBytes(str);
                                            // Отправляем данные через сокет
                                            ClientSocket.BeginSend(msg, 0, msg.Length, 0,
                                                new AsyncCallback(SendCallback), ClientSocket);
                                        }
                                        mysql_connect.Close();
                                    }
                                }
                                catch
                                {
                                    Console.ForegroundColor = ConsoleColor.Green;
                                    Console.WriteLine("Ошибка MySQL");
                                    Console.ResetColor();
                                }
 
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.ToString());
                            }
                            break;
 
                        case 2://Privat message
                            try
                            {
 
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.ToString());
                            }
                            break;
                    }
                }
            }
            catch (Exception ex) { Console.WriteLine(ex.ToString()); }
        }
 
        public static void SendCallback(IAsyncResult ar)
        {
            Socket handler = (Socket)ar.AsyncState;
 
            //отправляем данные обратн клиенту
            int bytesSent = handler.EndSend(ar);
        }
    }
}
Клиент
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
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.Net;
using System.Net.Sockets;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
using Library;
 
namespace ClientSpeakPort
{
    public partial class SpeakPort : Form
    {
        public SpeakPort()
        {            
            InitializeComponent();
        }
        
        private void speakPortToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
            ListViewItem newItem = this.listView1.Items.Add("LoginName");
            newItem.ImageKey = "photo.gif";
            newItem.SubItems.Add("name");            
        }
 
        private void loginToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Login login = new Login();
            login.Show();
        }
 
        public static string theResponse = "";
        public static byte[] buffer = new byte[1024];
 
        public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
        public static ManualResetEvent SendDone = new ManualResetEvent(false);
        public static ManualResetEvent ReceiveDone = new ManualResetEvent(false);
 
        public static void Connect()
        {
            try
            {
                IPHostEntry ipHost = Dns.Resolve("127.0.0.0");
                IPAddress ipAddr = ipHost.AddressList[0];
                IPEndPoint endPoint = new IPEndPoint(ipAddr, 9050);
 
                Socket sClient = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);
 
                sClient.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), sClient);
 
                ConnectDone.WaitOne();
            }
            catch { }
        }
 
        public static void ConnectCallback(IAsyncResult ar)
        {
            Thread thr = Thread.CurrentThread;
 
            Socket sClient = (Socket)ar.AsyncState;
            sClient.EndConnect(ar);
 
            //Login.str.ToString() сериализовоная строка с type 1, message login|password
            byte[] byteData = Encoding.ASCII.GetBytes(Login.str.ToString());
 
            sClient.BeginSend(byteData, 0, byteData.Length, 0,
                new AsyncCallback(SendCallback), sClient);
 
            ConnectDone.Set();
        }
 
        public static void SendCallback(IAsyncResult ar)
        {
            Thread thr = Thread.CurrentThread;
 
            Socket sClient = (Socket)ar.AsyncState;
 
            int byteSent = sClient.EndSend(ar);
 
            sClient.BeginReceive(buffer, 0, buffer.Length, 0,
                new AsyncCallback(ReceiveCallback), sClient);
            //Console.WriteLine(buffer.ToString());
 
            //SendDone.Set();
        }
 
        public static void ReceiveCallback(IAsyncResult ar)
        {
            //Thread thr = Thread.CurrentThread;
 
            Socket sClient = (Socket)ar.AsyncState;
 
            int bytesRead = sClient.EndReceive(ar);
 
            if (bytesRead > 0)
            {
                //поток в память
                MemoryStream ms = new MemoryStream(buffer);
                BinaryFormatter xs = new BinaryFormatter();
                //десериализуем в память
                MySend mes = (MySend)xs.Deserialize(ms);
 
                switch (mes.type)
                {
                    case 100:
                        try
                        {
                            SpeakPort main = new SpeakPort();
                            main.Show();
                            main.Text = "Speak Port: " + mes.message.ToString();
                        }
                        catch { }
                        break;
                    case 101:
                        { }
                        break;
                }
                ms.Close();
                theResponse += Encoding.ASCII.GetString(buffer, 0, bytesRead);
                if (theResponse == "Anna")
                {
                    SpeakPort nn = new SpeakPort();
                    nn.Text = theResponse.ToString();
                }
                sClient.BeginReceive(buffer, 0, buffer.Length, 0,
      new AsyncCallback(ReceiveCallback), sClient);
            }
        }        
    }
}
Добавлено через 3 часа 37 минут
UP UP очень нужна помощь
0
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
14.04.2012, 00:41  [ТС]
Объяснит может кто почему в сериалезованном классе.строке если написать на русском приходят всякие ?????????, а если цифры или на английском то все норм приходит?

Добавлено через 52 минуты
и еще подскажите как работать из под класса, то есть у меня есть класс все функции записаны в нем и там есть условие вызова формы, так когда я ее вызываю она у меня просто как зависшая, не могу предпринять ни каких действий =/
0
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
17.04.2012, 12: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
//клиент
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (CONNECTED == true)
            {
                MeOff(true);
            }
            Application.Exit();
        }
....
private void MeOff(bool sl)
        {
            if (sl == true)
            {
                try
                {
                    MySend mes = new MySend();
                    mes.type = 110;
                    mes.message = "";
                    mes.fr_id = friendl;
                    MemoryStream mse_ = new MemoryStream();
                    BinaryFormatter xse_ = new BinaryFormatter();
                    xse_.Serialize(mse_, mes);
                    string str = Encoding.Default.GetString(mse_.ToArray());
                    mse_.Close();
                    byte[] message = Encoding.ASCII.GetBytes(str);
                    ClToSr.BeginSend(message, 0, message.Length, 0, new AsyncCallback(SendDataSr), ClToSr);                    
                    CONNECTED = false;
                    receiver_.Suspend();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
            }
        }
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
//сервер
        public void ReceiveCallback(object id)
        {
            int Clnm = (int)id;
            while (true)
            {
                byte[] data = new byte[1024];
 
                try
                {
                    int recv = user[Clnm].Receive(data);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
                MemoryStream ms = new MemoryStream(data);
                BinaryFormatter xs = new BinaryFormatter();
                //десериализуем в память
                MySend mes = (MySend)xs.Deserialize(ms);
                ms.Close();
 
                string stData = mes.message, userNM = userlist[Clnm];
                switch (mes.type)
                {
                    case 110:
                        try
                        {
                            Console.WriteLine("\nПользователь \"" + userlist[Clnm] + "\" отключился.");
                            SendMeOff(Clnm, mes.fr_id);
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.ToString());
                        }
                        break;
                }
                Console.WriteLine("\nПользователь \"" + userNM + "\" отключился.");
                try
                {
                    user[Clnm].Close();
                }
                catch { }
            }
            user[Clnm] = null;
            userlist[Clnm] = null;
            return;
        }
....
private void SendMeOff(int ID,string frList)
        {
            try
            {
                MySend mes = new MySend();
                int k = 0, l = 0;
                string[] fr = new string[1000];
                string fr_ = "";
                string otName = userlist[ID];
 
                for (int i = 0; i < frList.Length; i++)
                {
                    if (frList[i] != ';')
                    {
                        k = k + 1;
                    }
                    else
                    {
                        for (int j = l; j < k; j++)
                        {
                            fr_ = fr_ + frList[j].ToString();
                        }
                        Console.Write(fr_ + " - ");
                        for (int r = 0; r < 1000; r++)
                        {
                            if (userlist[r] != null)
                            {
                                Console.WriteLine(r.ToString() + " ;");
                                if (fr_ == userlist[r])
                                {
                                    mes.type = 107;//107 - online send
                                    mes.message = otName; //логин  
                                    mes.status = 0; //status online
                                    MemoryStream mse = new MemoryStream();
                                    BinaryFormatter xse = new BinaryFormatter();
                                    xse.Serialize(mse, mes);
                                    string str = Encoding.Default.GetString(mse.ToArray());
                                    mse.Close();
                                    byte[] msg = Encoding.ASCII.GetBytes(str);
                                    user[r].BeginSend(msg, 0, msg.Length, 0,
                                        new AsyncCallback(SendCallback), user[r]);
                                }
                                Console.WriteLine(userlist[r]+"////");
                            }
                        }
                        fr[l] = fr_;
                        fr_ = "";
                        k = k + 1;
                        l = k;
                    }
                }
                user[ID] = null;
                userlist[ID] = null;
                return;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
Так же любые действия при нажатии на кнопки не чего не дают =/
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
17.04.2012, 13:47
когда сокет правильно закрывается на другой конец отправляется сообщение об этом
достаточно обработать кол-во принятых байт на сервере
C#
1
2
3
4
5
6
 int bytesRead = ClientSocket.EndReceive(ar); 
 
if(bytesRead == 0 )  
{
//клиент отключился
}
1
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
17.04.2012, 15:34  [ТС]
Ну я так пробовал, но выходили кучу ошибок, самая частая "клиент разорвал с вами соединение" что такое... но решил еще раз попробовать, на клиенте добавил отправку двух сообщений и дал время ожидания между ними Thread.Sleep(100);
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
        private void MeOff(bool sl)
        {
            if (sl == true)
            {
                try
                {
                    MySend mes = new MySend();
                    mes.type = 110;
                    MemoryStream mse_ = new MemoryStream();
                    BinaryFormatter xse_ = new BinaryFormatter();
                    xse_.Serialize(mse_, mes);
                    string str = Encoding.Default.GetString(mse_.ToArray());
                    mse_.Close();
                    byte[] message = Encoding.ASCII.GetBytes(str);
                    ClToSr.BeginSend(message, 0, message.Length, 0, new AsyncCallback(SendDataSr), ClToSr);
                    Thread.Sleep(100);
                    byte[] messag = new byte[0];
                    ClToSr.BeginSend(messag, 0, messag.Length, 0, new AsyncCallback(SendDataSr), ClToSr);
                    CONNECTED = false;                    
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
            }
        }
ну и на сервере, надо было убрать исключение на кол-во полученных байтов, так же повозился с mes.fr_id = friendl; (это список друзей которым должны прийти байты о том что друг отключился) заменил на public string[] friendlist = new string[1000];, который заполняется при подключение клиента, так же надо было добавить остановку вечного цикла, создал переменную bool st и использовал ее как тормоз
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
        public void ReceiveCallback(object id)
        {
            int Clnm = (int)id;
            while (true)
            {
                bool st = false;
                byte[] data = new byte[1024];
                int recv = user[Clnm].Receive(data);
                if (recv != 0)
                {
                    MemoryStream ms = new MemoryStream(data);
                    BinaryFormatter xs = new BinaryFormatter();
                    //десериализуем в память
                    MySend mes = (MySend)xs.Deserialize(ms);
                    ms.Close();
 
                    string stData = mes.message, userNM = userlist[Clnm];
                    switch (mes.type)
                    {
                        case 110:
                            try
                            {
                                Console.WriteLine("ZDFASDF ------");
                                string frl = friendlist[Clnm];
                                SendMeOff(Clnm, frl);
                                st = true;
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine("case 110 " + e.ToString());
                            }
                            break;
                    }
                    Console.WriteLine("\nПользователь \"" + userNM + "\" отключился.");
                    if (st == true)
                    {
                        break;
                    }
Ну и теперь осталось малость неприятное, отображение полученных сообщений от друзей в клиенте...
0
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
20.04.2012, 16:26  [ТС]
Почему то клиент не может приконектится к серверу с другого ПК после того как изменился IP, на сервер приходит сообщение о том что он пытается подключится, но не может. Как решить проблему?
C#
1
2
3
4
5
6
7
8
9
10
//сервер
            IPHostEntry ipHost = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint localEnd = new IPEndPoint(ipAddr, 4505);
            Socket sListener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);
            //связываем сокет
            sListener.Bind(localEnd);
            //начинаем слушать
            sListener.Listen(1000);
Все обшарил где то пишут что таким образом не удастся подключится ...
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
20.04.2012, 17:01
после того как изменился IP
чей ip изменился?
0
98 / 98 / 46
Регистрация: 21.03.2012
Сообщений: 378
20.04.2012, 17:06  [ТС]
Цитата Сообщение от m0nax Посмотреть сообщение
чем ip изменился?
мой, то есть сервера, ну был один x.y.z.c стал x.y.k.l, последняя пара цифр изменилась, не знаю влияет нет, но программа через интернет не работает =/
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
20.04.2012, 17:13
ясен пень никто не присоединится если изменился адрес сервера
на то он и называется сервер - у него всегда один IP
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2012, 17:13
Помогаю со студенческими работами здесь

Как получить список друзей Вконтакте
&lt;?php //Функция парсинга function wparse($s, $starts, $ends){ * *$result=substr($s, strpos($s, $starts)+strlen($starts),...

Vk API, как получить список друзей?
Всем привет, подскажите как получить список друзей. выходит данная ошибка: if __name__ == '__main__': access_token, _ =...

Создать клиент/серверное сетевое приложение для обмена текстовыми сообщениями
Создать клиент/серверное сетевое приложение для обмена текстовыми сообщениями через среду передачи данных стека TCP/IP. Для реализации...

Получить список друзей из контакта, предварительно залогинившись
Всем привет, помогите с кодом, как можно получить список друзей из контакта? Т.е. надо с начало надо авторизоваться, а потом получить...

VK api. Получить список друзей после авторизации на моём сайте
У меня в проекте (он веб) стоит авторизация ВК. Когда человек входит ей, я получаю его айди, и пытаюсь получить его друзей по id, используя...


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

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

Новые блоги и статьи
Интеграция Hangfire с RabbitMQ в проектах C#.NET
stackOverflow 18.04.2025
Разработка современных . NET-приложений часто требует выполнения задач "за кулисами". Это может быть отправка email-уведомлений, генерация отчётов, обработка загруженных файлов или синхронизация. . .
Построение эффективных запросов в микросервисной архитектуре: Стратегии и практики
ArchitectMsa 18.04.2025
Микросервисная архитектура принесла с собой много преимуществ — возможность независимого масштабирования сервисов, технологическую гибкость и четкое разграничение ответственности. Но как часто бывает. . .
Префабы в Unity: Использование, хранение, управление
GameUnited 18.04.2025
Префабы — один из краеугольных элементов разработки игр в Unity, представляющий собой шаблоны объектов, которые можно многократно использовать в различных сценах. Они позволяют создавать составные. . .
RabbitMQ как шина данных в интеграционных решениях на C# (с MassTransit)
stackOverflow 18.04.2025
Современный бизнес опирается на множество специализированных программных систем, каждая из которых заточена под решение конкретных задач. CRM управляет отношениями с клиентами, ERP контролирует. . .
Типы в TypeScript
run.dev 18.04.2025
TypeScript представляет собой мощное расширение JavaScript, которое добавляет статическую типизацию в этот динамический язык. В JavaScript, где переменная может свободно менять тип в процессе. . .
Погружение в Kafka: Концепции и примеры на C# с ASP.NET Core
stackOverflow 18.04.2025
Apache Kafka изменила подход к обработке данных в распределенных системах. Эта платформа потоковой передачи данных выходит далеко за рамки обычной шины сообщений, предлагая мощные возможности,. . .
Коммуникация в реальном времени с SignalR в C# на примере создания чата
UnmanagedCoder 17.04.2025
Современный веб стремительно эволюционирует от статичных страниц к динамичным приложениям, где пользователи ожидают мгновенной реакции на свои действия. Представим, что вы отправляете сообщение. . .
Реализация CQRS с MediatR на C# .NET
stackOverflow 17.04.2025
Современная разработка программного обеспечения постоянно ищет пути повышения эффективности организации кода. Архитектурные паттерны появляются, эволюционируют, и те, что проявляют свою. . .
Verilog и интеллектуальная собственность - "глазами" обученной LM модели.
Hrethgir 17.04.2025
В сети встречаются участники, заявляющие что код на Verilog ни о чём не говорит. Но вот патентная практика на самом деле показывает обратное ими утверждаемому. То-есть код на Verilog включают в. . .
Свап-файл дополнительно к разделу (если вдруг не хватает или не создан)
jigi33 17.04.2025
ПОДКЛЮЧЕНИЕ ДОПОЛНИТЕЛЬНОГО SWAP ПРОСТРАНСТВА, Т. О. , РАСШИРЕНИЕ ЕГО РАЗМЕРА В Linux можно использовать как раздел подкачки (swap), так и файл подкачки (swap-файл). Чтобы создать swap-файл вместо. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru