Невозможно зарегестрировать объект дважды
22.10.2015, 20:05. Показов 611. Ответов 0
Пишу хаб, есть клиент, который отправляет на сервер свои данные (Никнейм, ип порт и статус), и получает ответ, либо он не подключен, либо он в сети и в результате чего клиент получает список всех пользователей в сети. Сервер сериализует лист структур клиентов и отправляет их клиенту, а он в свою очередь десериализует обратно. И проблема в том, что при обработке данных клиентом (десериализации), происходит ошибка "Невозможно зарегестрировать объект дважды ". В инете ничего внятного не нашел, на МС сайте просто цитируют данную ошибку. может кто нибуть может помочь ?
Вот код сервера
| 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
| namespace Trecker
{
//[Serializable]
//struct Client
//{
// public string NickName;
// public string Ip;
// public int Port;
// public bool Status;
// public Client(string NickName, string Ip, int Port, bool Status)
// {
// this.NickName = NickName;
// this.Ip = Ip;
// this.Port = Port;
// this.Status = Status;
// }
//}
public partial class Form1 : Form
{
System.Net.Sockets.TcpListener server;
bool flagForConnect = false;
IPHostEntry host;
List<Client> listOfClients;
int port;
public Form1()
{
InitializeComponent();
port = 49999;
host = Dns.GetHostByName(Dns.GetHostName());
//meEndPoint = new IPEndPoint(host.AddressList[0], port);
lblIpValue.Text = host.AddressList[0].ToString();
lblPortValue.Text = port.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
if (flagForConnect == false)
{
// 1 2 3 4
//Nick IP Port Status "
button1.Text = "Выключить";
flagForConnect = true;
Task.Run(() =>
{
try
{
server = new System.Net.Sockets.TcpListener(host.AddressList[0], port);
server.Start();
while (true)
{
//Получаем входное подключение
using (TcpClient client = server.AcceptTcpClient())
{
//MessageBox.Show("dfg");
//Получаем сетевой поток для чтения и записи
using (NetworkStream networkStream = client.GetStream())
{
byte[] dataFromClient = new byte[100];
networkStream.Read(dataFromClient, 0, dataFromClient.Length);
string[] message = Encoding.UTF8.GetString(dataFromClient).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
message[3] = message[3].Replace("\0", "");
#region Проверка ника
//Если нет подобных имен в списке и статус сообщения коннект, то добавляем его в базу и делаем видимым
if (message[3] == "Connect" && IsDublicate(message[0]) == false)
{
listOfClients = new List<Client>();
foreach (var item in listOfClients)
{
ListViewItem lvi = new ListViewItem(new string[] { item.NickName, item.Ip });
listView1.Items.Add(lvi);
}
listOfClients.Add(new Client(message[0], message[1], int.Parse(message[2]), true));
//string response = "This nickname already exists";
//byte[] data = Encoding.UTF8.GetBytes(response);
//Отправка сообщения
//networkStream.Write(data, 0, data.Length);
//Отправка сообщения
networkStream.Write(Serialization(listOfClients), 0, Serialization(listOfClients).Length);
// List<Client> qwe = Deserialization(Serialization(listOfClients));
}
//Если есть такое имя в списке
//if (message[3] == "Connect" && IsDublicate(message[0]) == true)
//{
// //Сообщене для отправки клиенту
// string response = "This nickname already exists";
// byte[] data = Encoding.UTF8.GetBytes(response);
// //Отправка сообщения
// stream.Write(data, 0, data.Length);
//}
#endregion
#region Удаление клиента и оповищение всех
if (message[3] == "disconnection")
{
for (int i = 0; i < listOfClients.Count; i++)
{
if (listOfClients[i].NickName == message[0])
{
listOfClients.RemoveAt(i);
break;
}
}
//Перерисовка view
foreach (var item in listOfClients)
{
ListViewItem lvi = new ListViewItem(new string[] { item.NickName, item.Ip });
listView1.Items.Add(lvi);
}
string response = string.Format("Remove: {0}", message[0]);
byte[] data = Encoding.UTF8.GetBytes(response);
//Отправка сообщения
foreach (var item in listOfClients)
{
using (TcpClient tcpclient = new TcpClient())
{
tcpclient.Connect(item.Ip, item.Port);
using (NetworkStream streamForObserver = tcpclient.GetStream())
{
streamForObserver.Write(data, 0, data.Length);
}
}
}
}
#endregion
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
else
{
flagForConnect = false;
button1.Text = "Включить";
server.Stop();
}
}
bool IsDublicate(string str)
{
if (listOfClients != null)
foreach (var item in listOfClients)
{
if (item.NickName == str)
return true;
}
return false;
}
byte[] Serialization(List<Client> clients)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, clients);
return stream.ToArray();
}
//List<Client> Deserialization(byte[] serializedAsByte)
//{
// MemoryStream stream = new MemoryStream();
// BinaryFormatter formatter = new BinaryFormatter();
// stream.Write(serializedAsByte, 0, serializedAsByte.Length);
// stream.Seek(0, SeekOrigin.Begin);
// return (List<Client>)formatter.Deserialize(stream);
//}
private void button2_Click(object sender, EventArgs e)
{
}
}
} |
|
Клиент
| 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
| namespace Client
{
//[Serializable]
// struct Client
// {
// public string NickName;
// public string Ip;
// public int Port;
// public bool Status;
// public Client(string NickName, string Ip, int Port, bool Status)
// {
// this.NickName = NickName;
// this.Ip = Ip;
// this.Port = Port;
// this.Status = Status;
// }
// }
public partial class Form1 : Form
{
string nickName, portOfServer, myPort, ip, status;
string connectStr;
IPHostEntry host;
List<Clients.Client> listOfClients;
bool flagForConnect = false;
System.Net.Sockets.TcpListener server;
public Form1()
{
InitializeComponent();
}
private void connect_Click(object sender, EventArgs e)
{
if (flagForConnect == false)
{
try
{
host = Dns.GetHostByName(Dns.GetHostName());
//определение строки подключения
ip = host.AddressList[0].ToString();
nickName = textBox3.Text;
portOfServer = textBox2.Text;
myPort = textBox4.Text;
status = "Connect";
connectStr = nickName + ' ' + ip + ' ' + myPort + ' ' + status;
using (TcpClient client = new TcpClient())
{
client.Connect(ip, int.Parse(portOfServer));
using (NetworkStream networkStream = client.GetStream())
{
networkStream.Write(System.Text.Encoding.UTF8.GetBytes(connectStr), 0, System.Text.Encoding.UTF8.GetBytes(connectStr).Length);
byte[] data = new byte[1000];
StringBuilder response = new StringBuilder();
//MessageBox.Show(response.Length.ToString());
//while (networkStream.DataAvailable)
//{
do
{
int bytes = networkStream.Read(data, 0, data.Length);
response.Append(Encoding.UTF8.GetString(data, 0, bytes));
} while (networkStream.DataAvailable);
//}
if (response.ToString() == "This nickname already exists")
{
MessageBox.Show("Данный никнейм уже существует");
//MessageBox.Show("if");
}
else
{
//MessageBox.Show("else");
connect.Text = "Connected";
flagForConnect = true;
label5.Text = "Status : connected";
//MessageBox.Show("Client");
byte[] mas = new byte[response.Length];
for (int i = 0; i < response.Length; i++)
{
mas[i] = (byte)response[i];
}
listOfClients = Deserialization(mas);
}
}
client.Close();
}
//Если коннект есть то ставим на послушку
if (flagForConnect == true)
{
server = new System.Net.Sockets.TcpListener(host.AddressList[0], int.Parse(textBox4.Text));
server.Start();
while (true)
{
using (TcpClient client = server.AcceptTcpClient())
{
using (NetworkStream networkStream = client.GetStream())
{
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
flagForConnect = false;
connect.Text = "Disconnected";
server.Stop();
}
}
List<Clients.Client> Deserialization(byte[] serializedAsByte)
{
MemoryStream stream = new MemoryStream(serializedAsByte);
BinaryFormatter formatter = new BinaryFormatter();
//stream.Write(serializedAsByte, 0, serializedAsByte.Length);
stream.Seek(0, SeekOrigin.Begin);
//formatter.Deserialize(stream);
List<Clients.Client> mas = (List<Clients.Client>)formatter.Deserialize(stream);
stream.Close();
return mas;
}
}
} |
|
0
|