Нашел исходники простого чата с клиент-серверной архитектурой, че то никак вникнуть не могу....
Клиент
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
| using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.Collections.Generic;
namespace Net
{
/// Событие при передаче данных от сервера клиенту.
/// <param name="client">Клиент, который получает данные</param>
public delegate void ClienReciveData(Client client);
/// Клиент.
public class Client : IDisposable
{
/// <summary>
/// Скорость проверки полученых данных.
public static int TimeOutUpdate = 25;
/// Имя клиента.
internal string name;
/// Клиент.
internal TcpClient client;
/// Запись данных.
internal BinaryWriter writer;
/// Чтение данных.
internal BinaryReader reader;
/// Поток проверки полученных данных.
internal Thread ThreadReciveData;
/// Связь установленна?
internal bool isConnect = false;
/// <summary>
/// Имя сервера.
internal string serverName = "";
/// Объем полученных данных.
int oldReciveDataSize = 0;
/// Событие о приеме данных.
public ClienReciveData ReciveData;
public Client(string name)
{
this.name = name;
client = new TcpClient();
ThreadReciveData = new Thread(new ThreadStart(_ThreadReciveData));
}
/// Соединение с сервером.
/// <param name="ip">IP сервера</param>
/// <param name="port">Порт сервера</param>
/// <returns>Успех выполнения операции</returns>
public bool Connect(IPAddress ip, int port)
{
if (isConnect == true) return false;
try
{
client.Connect(ip, port);
writer = new BinaryWriter(client.GetStream());
reader = new BinaryReader(client.GetStream());
writer.Write(name);
Thread.Sleep(50);
serverName = reader.ReadString();
ThreadReciveData.Start();
isConnect = true;
return true;
}
catch
{
isConnect = false;
return false;
}
}
/// Поток проверки полученых данных.
void _ThreadReciveData()
{
while (true)
{
if (client.Available == 0) oldReciveDataSize = 0;
if (client.Available > oldReciveDataSize)
{
oldReciveDataSize = client.Available;
if (ReciveData != null) ReciveData.Invoke(this);
}
Thread.Sleep(TimeOutUpdate);
}
}
/// Имя.
public string Name
{
get
{
return name;
}
}
/// Чтение данных от сервера.
public BinaryReader Reader
{
get
{
return reader;
}
}
/// Передача данных серверу.
public BinaryWriter Writer
{
get
{
return writer;
}
}
/// Разрушить объект.
public void Dispose()
{
try
{
client.EndConnect(null);
ThreadReciveData.Abort();
}
catch
{
}
/// Соединение открыто?
public bool IsConnect
{
get
{
return isConnect;
}
}
/// Есть связь с сервером?
public bool ServerEnabled
{
get
{
return client.Connected;
}
}
/// Получить имя сервера.
public string ServerName
{
get
{
return serverName;
}
}
}
} |
|
Сервер
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
| using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.Collections.Generic;
namespace Net
{
/// <summary>
/// Событие при подключении клиента к серверу.
/// </summary>
/// <param name="client">Клиент, который совершил подключение</param>
public delegate void ServerClientJoint(Client client);
/// <summary>
/// Событие при передаче данных серверу от клиента.
/// </summary>
/// <param name="client">Клиент, который передал данные</param>
public delegate void ServerReciveData(Client client);
/// <summary>
/// Сервер.
/// </summary>
public class Server : IDisposable
{
/// <summary>
/// Имя сервера.
/// </summary>
string name;
/// <summary>
/// Сервер.
/// </summary>
TcpListener server;
/// <summary>
/// Поток приема клиентов.
/// </summary>
Thread ThreadAcceptSocket;
/// <summary>
/// Сервер запущен?
/// </summary>
bool isStarted = false;
/// <summary>
/// Список клиентов.
/// </summary>
public List<Client> Clients;
/// <summary>
/// Делегат присоединения клиентов.
/// </summary>
public ServerClientJoint ClientJoint;
/// <summary>
/// Прием данных от клиентов.
/// </summary>
public ServerReciveData ReciveData;
/// <summary>
/// Создать сервер.
/// </summary>
/// <param name="name">Имя</param>
/// <param name="ip">IP</param>
/// <param name="port">Порт</param>
public Server(String name, IPAddress ip, int port)
{
this.name = name;
server = new TcpListener(ip, port);
Clients = new List<Client>();
ThreadAcceptSocket = new Thread(new ThreadStart(_ThreadAcceptSocket));
}
/// <summary>
/// Запустить сервер.
/// </summary>
public bool Start()
{
if (isStarted == true) return false;
try
{
server.Start();
ThreadAcceptSocket.Start();
isStarted = true;
return true;
}
catch
{
isStarted = false;
return false;
}
}
/// <summary>
/// Остановить сервер.
/// </summary>
public void Dispose()
{
try
{
server.Stop();
ThreadAcceptSocket.Abort();
for (int n = 0; n < Clients.Count; n++)
{
Clients[n].Dispose();
}
}
catch
{
}
}
/// <summary>
/// Поток приема клиентов.
/// </summary>
void _ThreadAcceptSocket()
{
while (true)
{
Client newC = new Client("");
newC.client = server.AcceptTcpClient();
newC.reader = new BinaryReader(newC.client.GetStream());
newC.writer = new BinaryWriter(newC.client.GetStream());
Thread.Sleep(25);
newC.name = newC.reader.ReadString();
newC.writer.Write(name);
newC.ReciveData += new ClienReciveData(ClientResiveData);
Clients.Add(newC);
newC.ThreadReciveData.Start();
if (ClientJoint != null) ClientJoint.Invoke(newC);
}
}
/// <summary>
/// Прием данных от клиентов.
/// </summary>
/// <param name="client"></param>
void ClientResiveData(Client client)
{
if (ReciveData != null) ReciveData.Invoke(client);
}
/// <summary>
/// Получить клиента.
/// </summary>
/// <param name="name">Имя клиента</param>
/// <returns>Клиент, или null - если имя не найдено</returns>
public Client GetClient(string name)
{
for (int n = 0; n < Clients.Count; n++)
{
if (Clients[n].name == name) return Clients[n];
}
return null;
}
/// <summary>
/// Сервер запущен?
/// </summary>
public bool IsStarted
{
get
{
return isStarted;
}
}
}
} |
|
есть два станционарных компа , подключенных к одной wi-fi сети...можно в таких условиях проверить работоспособность чата ?или может лучше попробовать установить виртуальную машину на один комп?
Добавлено через 5 часов 15 минут
Блин, товарищи програмисты... проблема то нубская....разъясните пожалуйста че к чему....