Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
~Sл@\/яH~
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 13
1

Клиент-Сервер: приватные сообщения в чате

26.07.2014, 21:21. Просмотров 1144. Ответов 1
Метки нет (Все метки)

Добрый вечер форумчане. Делая приложения Клиент-Сервер на чистых сокетах, столкнулся с несколькими проблемами, прошу помощи в решении их. У программы есть своя БД. В программе хочу реализовать чат. Так вот, в общую комнату отправляю сообщение, а вот что бы отправить приватное сообщение как быть??? Сервер должен конектится к этому пользователю простым конектом??? или нужно создавать новый сокет и через него привязываться??? И еще небольшая проблема в сторону остановки сервера. Никак не могу понять как можно остановить асинхронную работу сервера? Я не прошу писать программу, прошу направления на устранения этих проблем.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2014, 21:21
Ответы с готовыми решениями:

Клиент-сервер. Как в многопользовательском чате реализовать личные сообщения
Console.WriteLine(Func.ToDateTime() + "Server started."); TcpListener listener =...

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

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

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что...

1
Nord790
Строитель
680 / 414 / 137
Регистрация: 01.04.2014
Сообщений: 436
27.07.2014, 05:26 2
Лучший ответ Сообщение было отмечено ~Sл@\/яH~ как решение

Решение

~Sл@\/яH~
Сервер должен конектится к этому пользователю простым конектом??? или нужно создавать новый сокет и через него привязываться???
Нет. Вот посмотри этот код и увидишь как это всё делается:
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
using System;
using System.Collections.Generic;
using System.Text;
public class Server
{
    public delegate void StartListenerEventHanlder(object sender, EventArgs e);
    public event StartListenerEventHanlder StartListener;
 
    public delegate void EndListenerEventHanlder(object sender, EventArgs e);
    public event EndListenerEventHanlder EndListener;
 
    public delegate void ReceiveDataEventHandler(object sender, ReceiveDataEventArgs e);
    public event ReceiveDataEventHandler ReceiveData;
 
    public delegate void ConnectedSocketEventHanlder(object sender, ConnectedSocketEventArgs e);
    public event ConnectedSocketEventHanlder ConnectedSocket;
 
    public delegate void DisconnectedSocketEventHandler(object sender, DisconnectedSocketEventArgs e);
    public event DisconnectedSocketEventHandler DisconnectedSocket;
 
    private System.Net.Sockets.TcpListener TcpListener;
    private System.Threading.SynchronizationContext Current;
    private System.Collections.Generic.Dictionary<System.Net.EndPoint, System.Net.Sockets.Socket> DefaultClients = new System.Collections.Generic.Dictionary<System.Net.EndPoint, System.Net.Sockets.Socket>();
 
    public Server() { }
 
    public bool IsListener { get; private set; }
 
 
    public void Start(System.Net.IPEndPoint endPoint) 
    {
        if (TcpListener == null) 
        {
            DefaultClients.Clear();
            Current = System.Threading.SynchronizationContext.Current;
            TcpListener = new System.Net.Sockets.TcpListener(endPoint);
            TcpListener.Start();
            System.Threading.Thread T = new System.Threading.Thread(OnAcceptSockets);
            T.IsBackground = true; T.Start(); IsListener = true;
            if (StartListener != null) StartListener.Invoke(this, new EventArgs());
        }
    }
 
    public void Stop()
    {
       if (TcpListener != null)
       {
           IsListener = false; TcpListener.Stop(); TcpListener = null;
           DefaultClients.Clear(); EndListener.Invoke(this, new EventArgs());
       }
    }
 
    public System.Collections.Generic.Dictionary<System.Net.EndPoint, System.Net.Sockets.Socket> Clients { get { return DefaultClients; } }
 
    private void OnAcceptSockets() 
    {
        while (IsListener)
            {
                try 
                {
                    System.Net.Sockets.Socket AcceptSocket = TcpListener.AcceptSocket();
                    DefaultClients.Add(AcceptSocket.RemoteEndPoint, AcceptSocket);
                    if (ConnectedSocket != null) ConnectedSocket.Invoke(this, new ConnectedSocketEventArgs(AcceptSocket)); 
                    System.Threading.Thread T = new System.Threading.Thread(OnReceiveSocket);
                    T.IsBackground = true;
                    T.Start(AcceptSocket);
                }
                catch { }
            }
    }
 
    private void OnReceiveSocket(object e) 
    {
        System.Net.Sockets.Socket ClientSocket = (System.Net.Sockets.Socket)e;
        System.Net.EndPoint RemoteEndPoint = ClientSocket.RemoteEndPoint;
        int ReceiveLength;
        int BufferLength = 255;
        byte[] BufferReceive = new byte[BufferLength];
        try 
        {
           while (true)
           {
              ReceiveLength= ClientSocket.Receive(BufferReceive);
              if (ReceiveLength == 0) { break; }
              Array.Resize(ref BufferReceive, ReceiveLength);
              ReceiveDataEventArgs EventArgs = new ReceiveDataEventArgs(RemoteEndPoint, BufferReceive, ClientSocket.Available, ClientSocket);
              if (ReceiveData != null) ReceiveData.Invoke(this, EventArgs); 
              Array.Resize(ref BufferReceive, BufferLength);
           }
        }
        catch { }
        DefaultClients.Remove(RemoteEndPoint);
        if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(RemoteEndPoint));
    }
 
    public void KickAll()
    {
        foreach(System.Net.Sockets.Socket e in DefaultClients.Values )
        {
              e.Close();
              if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(e.RemoteEndPoint));
        }
        DefaultClients.Clear();
    }
 
    public void Kick(System.Net.EndPoint e ) 
    {
        if (DefaultClients.ContainsKey(e)) 
        {
            DefaultClients[e].Close();
            DefaultClients.Remove(e);
            if (DisconnectedSocket != null) DisconnectedSocket.Invoke(this, new DisconnectedSocketEventArgs(e));
        }
    }
 
    //отправить приватное сообщение.
    public void Send(byte[] buf, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].Send(buf); } }
    
    //отправить приватное сообщение.
    public void Send(string buf, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].Send(System.Text.Encoding.Default.GetBytes(buf)); } }
 
    public void SendAll(byte[] buf) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.Send(buf); } }
 
    public void SendAll(string buf) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.Send(System.Text.Encoding.Default.GetBytes(buf)); } }
 
    public void SendFile(string path, System.Net.EndPoint e) { if (DefaultClients.ContainsKey(e)) { DefaultClients[e].SendFile(path); } }
 
    public void SendFile(string path) { foreach (System.Net.Sockets.Socket e in DefaultClients.Values) { e.SendFile(path); } }
 
}
 
 
public class ReceiveDataEventArgs: EventArgs 
{
    public ReceiveDataEventArgs(System.Net.EndPoint endPoint, byte[] buf, int available,System.Net.Sockets.Socket sock)
    { RemoteEndPoint = endPoint; Buffer = buf; Available = available; ClientSocket = sock; }
 
    public System.Net.EndPoint RemoteEndPoint { get; private set; }
    public byte[] Buffer { get; private set; }
    public int Available { get; private set; }
    public System.Net.Sockets.Socket ClientSocket { get; private set; }
}
public class ConnectedSocketEventArgs: EventArgs
{
    public ConnectedSocketEventArgs(System.Net.Sockets.Socket sock) { ClientSocket = sock; }
    public System.Net.Sockets.Socket ClientSocket { get; private set; }
}
 
public class DisconnectedSocketEventArgs : EventArgs
{
    public DisconnectedSocketEventArgs(System.Net.EndPoint endPoint) { RemoteEndPoint = endPoint; }
    public System.Net.EndPoint RemoteEndPoint { get; private set; }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2014, 05:26

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание...

Зависает сервер при создании приложения типа клиент/сервер
Зависает сервер при создании приложения типа клиент/сервер using System; using...

Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст
Ребят подскажите как сделать: Клиент должен отправить файл на сервер. Сервер его обработать и...


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

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

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