Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
1

Клиент-сервер. Как в многопользовательском чате реализовать личные сообщения

25.12.2013, 09:47. Просмотров 1243. Ответов 8
Метки нет (Все метки)

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
                Console.WriteLine(Func.ToDateTime() + "Server started.");
                TcpListener listener = new TcpListener(5000);
                listener.Start();
                while (true)
                {
                    
                    TcpClient client = listener.AcceptTcpClient();
 
                    StreamReader reader;
                    Console.WriteLine(Func.ToDateTime() + "Client Connected.");
                    StreamWriter writer = new StreamWriter(client.GetStream());
                    writer.AutoFlush = true;
                    reader = new StreamReader(client.GetStream());
                    Thread thread = new Thread(new ThreadStart(delegate()
                    {
                        
                        string message = string.Empty;
                        while (true)
                        {
                            try
                            {
                                message = reader.ReadLine();
                                writer.WriteLine(Funtions(message));
                            }
                            catch { client.Close(); Console.WriteLine(Func.ToDateTime() + "Client disconnected."); break; }
                        }
                    }));
                    thread.Start();
                }
Вот так выглядит сервер.... Я там с одного исходника его подифицировал в многопоточный сервер и теперь он работает так как мне надо почти, - ему приходит команда типо - RegAccount|NAME|PASSWORD он считывает ключ "RegAccount" и с помощью свич определяет функцию выполняемую в зависимости от ключа и в данном случае регает аккаунт и отсылает команду OK или LoginDetect... Тут всё ок...

Вопрос заключается в другом, как мне сделать систему личных сообщений? что бы 1 пользователь мог писать напрямую другому пользователю? и вобще! Если я буду делать чат общий в котором 1 написаное сообщение должно отправится всем в чат то как это при данном сервере реализовать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2013, 09:47
Ответы с готовыми решениями:

Клиент-Сервер: как реализовать
Во общем есть Сервер на Ansi-C Задача:нужно написать клиента C# Данные поступают в...

Клиент - Сервер. Вечное ожидание сообщения
Грубый набросок. 1)Первый случай Клиент: TcpClient client = new TcpClient(); ...

Клиент-сервер: форма закрывается после второй отправки сообщения
В клиенте 2 формы. 1ая форма соединяется с сервером Создал класс Client cl.Start(IpTextBox.Text,...

Можно ли реализовать сервер и клиент в одном приложении
Вот пишу программу, обмена сообщениями между 2 приложениями. Хочу сделать что бы каждое приложение...

Клиент-Сервер: приватные сообщения в чате
Добрый вечер форумчане. Делая приложения Клиент-Сервер на чистых сокетах, столкнулся с несколькими...

8
nb-np
47 / 47 / 22
Регистрация: 18.11.2013
Сообщений: 92
25.12.2013, 15:24 2
вы должны регистрировать входящие подключения, у вас в коде ничего подобного не вижу
для начала можете ознакомиться хотя бы с этим
http://msdn.microsoft.com/ru-ru/library/dd335942.aspx#Section4
1
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
26.12.2013, 01:43  [ТС] 3
Бррррр Ересь какая то.... я вобще делал C# - client и php сервер... И методом переодических запросов получал и лс и анонсы...

Тут тоже самое могу сделать но это не есть айс... Мб есть какие ещё варианты? Например как в моем кода организовать сохранение хотябы в какойнить массив сокетов м? точнее потоков ))) Ну или подскажите чё ещё можно просто в моем коде сделать? Это мои первые сокеты вобще... Я весь C# изучаю методом тыка)
0
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
29.12.2013, 06:55  [ТС] 4
А что если я
C#
1
2
StreamWriter writer = new StreamWriter(client.GetStream());
reader = new StreamReader(client.GetStream());
сДЕЛАЮ массивными и буду обращатся к массиву с ID или логином юзера м?
0
Yukikaze
341 / 320 / 48
Регистрация: 12.12.2011
Сообщений: 563
29.12.2013, 10:10 5
Вот простой пример сервера, если список соединений заменить на словарь будет даже лучше.
Сервер не обрабатывает исключений и дисконектов, в этом вам придется разбираться самому
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
 
namespace TcpServerExample
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpServer server = new TcpServer(8888);
            server.Listen();
 
            Console.ReadKey(true);
        }
 
        
    }
 
    class TcpServer
    {
        private readonly TcpListener _listener;
        
        public int Port { get; set; }
        public List<Connection> Connections { get; set; }
 
        public TcpServer(int port)
        {
            Port = port;
            var endPoint = new IPEndPoint(IPAddress.Any, port);
            _listener = new TcpListener(endPoint);
        }
 
        private void listener_OnAccept(IAsyncResult ar)
        {
            TcpClient client = _listener.EndAcceptTcpClient(ar);
 
            Connection connection = new Connection(client);
            Connections.Add(connection);
 
            _listener.BeginAcceptTcpClient(listener_OnAccept, null);
        }
 
        public void Listen()
        {
            _listener.Start();
            _listener.BeginAcceptTcpClient(listener_OnAccept, null);
        }
    }
 
    class Connection
    {
        private readonly NetworkStream _stream;
        public IPEndPoint EndPoint { get; set; }
        public Connection(TcpClient client)
        {
            _stream = client.GetStream();
            EndPoint = (IPEndPoint)client.Client.RemoteEndPoint;
        }
 
        public void Send(byte[] data)
        {
            _stream.Write(data, 0, data.Length);
        }
    }
}
1
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
29.12.2013, 13:49  [ТС] 6
Yukikaze, Спс конешно... Но:
1. Здесь передача происходит байтами
2. Здесь я не вижу потоков и постоянной линии передачи...
3. Как сделать обращение к функциям - я вобще понять не могу.


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
        static string Connect = "Database=server;Data Source=localhost;User Id=root;Password=";
        static MySqlConnection myConnection;
        static TcpListener listener;
 
 
        static void Main(string[] args)
        {
            Console.WriteLine(Func.ToDateTime() + "Server started.");
            Console.WriteLine(@"
    в–€   в–€ в–€в–€в–€ в–€  в–€   в–€в–€в–€в–€ в–€в–€в–€   в–€   в–€ в–€в–€в–€в–€ в–€в–€в–€в–€ в–€в–€в–€в–€ в–€в–€в–€в–€ в–€в–€в–€в–€ в–€в–€в–€ в–€в–€в–€
    в–€в–€ в–€в–€  в–€  в–€в–€ в–€   в–€  в–€ в–€     в–€   в–€ в–€  в–€ в–€  в–€ в–€  в–€ в–€  в–€ в–€  в–€ в–€    в–€
    в–€ в–€ в–€  в–€  в–€ в–€в–€   в–€  в–€ в–€в–€в–€   в–€ в–€ в–€ в–€в–€в–€в–€ в–€в–€в–€в–€ в–€    в–€в–€в–€в–€ в–€в–€в–€в–€ в–€в–€в–€  в–€
    в–€   в–€  в–€  в–€  в–€   в–€  в–€ в–€     в–€в–€в–€в–€в–€ в–€  в–€ в–€ в–€  в–€  в–€ в–€ в–€  в–€  в–€ в–€    в–€
    в–€   в–€ в–€в–€в–€ в–€  в–€   в–€в–€в–€в–€ в–€      в–€ в–€  в–€  в–€ в–€ в–€  в–€в–€в–€в–€ в–€ в–€  в–€  в–€ в–€    в–€
 
                        в–€в–€в–€  в–€в–€в–€  в–€в–€в–€в–€  в–€ в–€  в–€в–€в–€  в–€в–€в–€в–€
                        в–€    в–€    в–€  в–€  в–€ в–€  в–€    в–€  в–€
                        в–€в–€в–€  в–€в–€в–€  в–€в–€в–€в–€  в–€ в–€  в–€в–€в–€  в–€в–€в–€в–€
                          в–€  в–€    в–€ в–€   в–€в–€в–€  в–€    в–€ в–€
                        в–€в–€в–€  в–€в–€в–€  в–€ в–€    в–€   в–€в–€в–€  в–€ в–€
");
        
            try
            {
                myConnection = new MySqlConnection(Connect);
                myConnection.Open();
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine(Func.ToDateTime() + "MySQL connected.");
                Console.ForegroundColor = ConsoleColor.Gray;
            }
            catch 
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(Func.ToDateTime() + "MySQL unable connect.");
                Logs.ProgrammLog("MySQL unable connect.");
                Environment.Exit(0);
            }
            
            try
            {
                listener = new TcpListener(5000);
                listener.Start();
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine(Func.ToDateTime() + "Connect created.");
                Console.ForegroundColor = ConsoleColor.Gray;
            }
            catch
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(Func.ToDateTime() + "Error creating connect.");
                Logs.ProgrammLog("MySQL unable connect.");
                Environment.Exit(0);
            }
            Console.Beep();
            while (true)
            {
                string userid = null;
                TcpClient client = listener.AcceptTcpClient();
                Console.WriteLine(Func.ToDateTime() + "Client Connected.");
                StreamWriter writer = new StreamWriter(client.GetStream());
                writer.AutoFlush = true;
                var reader = new StreamReader(client.GetStream());
                Thread thread = new Thread(new ThreadStart(delegate()
                {
 
                    string message = string.Empty;
                    while (true)
                    {
                        try
                        {
                            message = reader.ReadLine();
                            var result = Funtions(message + "|" + userid);
                            writer.WriteLine(result);
                            if (result == "AUTH_OK")
                            {
                                var key = message.Split('|');
                                var Values = key[1].Split('Ыћ');
                                var ToAccount = MySQL("SELECT id FROM `accounts` WHERE `username`='" + Values[0] + "'");
                                userid = ToAccount[0].ToString();
                            }
                        }
                        catch { client.Close(); Console.WriteLine(Func.ToDateTime() + "Client " + userid + " disconnected."); break; }
                    }
                }));
                thread.Start();
            }
 
                
        }
        static object[] MySQL_Result = new object[100];
        public static object[] MySQL(string command)
        {
            MySQL_Result = new object[100];
            MySqlCommand myCommand = new MySqlCommand(command, myConnection);
            MySqlDataReader MyDataReader;
            MyDataReader = myCommand.ExecuteReader();
            List<object[]> result = new List<object[]>();
            while (MyDataReader.Read())
            {
                MySQL_Result = new Object[MyDataReader.FieldCount];
                int fieldCount = MyDataReader.GetValues(MySQL_Result);
                result.Add(MySQL_Result);
            }
           
            MyDataReader.Close();
            return MySQL_Result;
        }
 
 
        public static string Funtions(string text)
        {
            //Ыћ
            var key = text.Split('|');
            var Values = key[1].Split('Ыћ');
            switch (key[0])
            {
                case "RegAccount":
                    var ToLogin = MySQL("SELECT username FROM `accounts` WHERE `username`='" + Values[0] + "'");
                    if (Convert.ToString(ToLogin[0]) != Values[0])
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("Account registration: "+Values[0] + " registrated.");
                        Console.ForegroundColor = ConsoleColor.Gray;
                        MySQL("INSERT INTO `accounts`(`username`,`password`) VALUES ('" + Values[0] + "','" + Values[1] + "')");
                        
                        return "REG_OK";
                    }
                    else {
                        return "LOGIN_DETECT"; 
                        }
                        break;
                case "Login":
 
                        var MyLogin = MySQL("SELECT password FROM `accounts` WHERE `username`='" + Values[0] + "'");
                        if (Convert.ToString(MyLogin[0]) == Values[1])
                        {
                            return "AUTH_OK";
                        }
                        else
                        {
                            return "AUTH_ERROR";
                        }
                        break;
                case "MyRes":
                        var MyRes = MySQL("SELECT * FROM `accounts_resources` WHERE `id_account` = '" + key[2] + "'");
                        
                        if (Convert.ToString(MyRes[0]) == key[2])
                        {
                            var MyUnits = MySQL("SELECT * FROM `accounts_npc` WHERE `id_account` = '" + key[2] + "'");
                            MyRes[2] = 100 * (int)MyUnits[1] + (int)MyRes[2];
                            MySQL("UPDATE `accounts_resources` SET `lamber`='" + MyRes[2] + "' WHERE `id_account` = '" + key[2] + "'");
                            return MyRes[1] + "|" + MyRes[2] + "|" + MyRes[3];
                        }
                        else
                        {
                            MySQL("INSERT INTO `accounts_resources`(`id_account`, `gold`, `lamber`, `humans`) VALUES ('" + key[2] + "','0','0','0')");
                            MySQL("INSERT INTO `accounts_npc`(`id_account`) VALUES ('" + key[2] + "')");
                            return "0|0|0";
                        }
                        break;
                default:
                return "Unknown command";
                break;
 
 
            }
        }
Вот текущий вариант сервера.... И меня он практически устраивает... Есть кое что что ещё я дорабатываю... Но уже дело пошло)))
0
ablai96
118 / 116 / 47
Регистрация: 14.09.2012
Сообщений: 276
Завершенные тесты: 6
30.12.2013, 12:55 7
SkoTi, у вас выполняется обновления списка пользователей в клиенте? если выполняете то как вы реализовали? при отключении клиента передавали обновленный список пользователей? или по запросу с клиентского приложения?
0
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
30.12.2013, 14:03  [ТС] 8
ablai96, Да я позже реализую это... Всё очень просто... В таблице accounts добовляется колонка - lasttime и в неё в формате Datetime записывается последние время какого либо действия...
И все у кого время по формуле больше - в онлайне
MySQL
1
`lastdate` > (NOW() - INTERVAl 10 SECOND)
Да и вобще)) Это пока проосто экспеременит))) потом буду оптимизировать всё это)))
0
ablai96
118 / 116 / 47
Регистрация: 14.09.2012
Сообщений: 276
Завершенные тесты: 6
30.12.2013, 14:11 9
SkoTi, у меня всех кто онлайн отправляется список, но почему то не всем доходит список только первому, а последнему приходит только когда он клиент запрашивает список Многопользовательский чат на socket. Не обновляется список пользователей
0
30.12.2013, 14:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2013, 14:11

Клиент-сервер для курсовой, как реализовать
Помогите пожалуйста. В C# практически новичок, только начал осваивать. Но необходимо сделать...

Сервер не принимает сообщения TCP или клиент не отправляет
Столкнулся с такой проблемой что программа клиента принимает сообщения TCP и делает всё правильно....

Клиент-сервер. После каждой строки сообщения появляется символ
Добрый вечер. Делаю программку клиент- сервер. Представляет чат с зашифрованными сообщениями....


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

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

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