0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 8
|
|
1
|
Xml-сериализация при подключении к серверу более одного клиента (в документе xml (0 0) присутствует ошибка)
23.05.2018, 21:25. Показов 713. Ответов 0
Здравствуйте, практикую сетевое программирование, решил написать многопоточный проект клиент-сервера, который обменивается информацией в xml формате, но при подключении более одного клиента, выдает ошибку "в документе xml (0 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
| using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Xml.Serialization;
namespace queueserver
{
public class Queueanalyser
{
static IPAddress IpAddress = IPAddress.Parse("127.0.0.1");
static IPEndPoint iPEndPoint = new IPEndPoint(IpAddress, 11000);
static NetworkStream StreamInfo { get; set; }
static byte[] Bytesarray { get; set; }
static TcpClient handler { get; set; }
public Queueanalyser(TcpClient client)
{
handler = client;
}
public void GetConnection()
{
StreamInfo = handler.GetStream();
try
{
while (true)
{
Console.WriteLine("Жду соединения от банкомата");
if (handler.Connected == true)
Console.WriteLine($"Банкомат соединился с сервером, передается инфа... {handler.Client.LocalEndPoint}");
Console.WriteLine($"{handler.Client.RemoteEndPoint}");
Console.WriteLine();
GetUserInfo();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (StreamInfo != null)
StreamInfo.Close();
if (handler != null)
handler.Close();
}
}
public static void GetUserInfo()
{
XmlSerializer xaml = new XmlSerializer(typeof(SendingInfo));
do
{
using (MemoryStream memorystream = new MemoryStream())
{
Bytesarray = new byte[handler.ReceiveBufferSize];
StreamInfo.Read(Bytesarray, 0, Bytesarray.Length);
memorystream.Write(Bytesarray, 0, Bytesarray.Length);
try
{
memorystream.Position = 0;
//вот здесь происходит ошибка при подключении второго клиента
var deserializeableperson = xaml.Deserialize(memorystream) as SendingInfo;
Console.WriteLine($"{deserializeableperson.Id} \t {deserializeableperson.Name}");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
} while (StreamInfo.DataAvailable);
}
}
[Serializable]
public class SendingInfo
{
public int Id { get; set; }
public string Name { get; set; }
public SendingInfo()
{
}
}
} |
|
Main() сервера:
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
| using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace queueserver
{
class Program
{
static TcpListener listener;
static IPAddress IpAddress = IPAddress.Parse("127.0.0.1");
static IPEndPoint iPEndPoint = new IPEndPoint(IpAddress, 11000);
static void Main(string[] args)
{
listener = new TcpListener(iPEndPoint);
listener.Start();
Console.WriteLine("Ожидание подклyuчений...");
while (true)
{
TcpClient client = listener.AcceptTcpClient();
Thread clientthread = new Thread(new ThreadStart(new Queueanalyser(client).GetConnection));
clientthread.Start();
}
Console.ReadKey();
}
}
} |
|
Клиент:
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
| using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Xml.Serialization;
namespace bankomatapplication
{
public class Abc
{
static IPAddress iPAddress = IPAddress.Parse("127.0.0.1");
static IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, 11000);
static NetworkStream StreamInfo { get; set; }
static byte[] Bytesarray { get; set; }
static XmlSerializer xaml { get; set; }
static string value { get; set; }
static SendingInfo SendingInfo { get; set; }
static TcpClient tcpclient { get; set; }
public Abc()
{
xaml = new XmlSerializer(typeof(SendingInfo));
}
public void Choosefrommenu()
{
var OV = 0;
var OP = 0;
var RP = 0;
tcpclient = new TcpClient();
tcpclient.Connect(iPEndPoint);
StreamInfo = tcpclient.GetStream();
try
{
while (true)
{
Console.WriteLine("Что хотите сделать?");
var choose = Console.ReadLine();
using (MemoryStream memorystream = new MemoryStream())
{
memorystream.Position = 0;
switch (choose)
{
case "1":
if (OV == 100)
OV = 0;
OV++;
value = "ОВ-";
Console.WriteLine("Вы выбрали обмен валyuты");
Console.WriteLine($"Ваш номер: \t********************** {value}{OV} **********************\t");
xaml.Serialize(memorystream, SendingInfo = new SendingInfo() { Id = 1, Name = String.Concat(value, OV) });
Bytesarray = memorystream.ToArray();
StreamInfo.Write(Bytesarray, 0, Bytesarray.Length);
break;
case "2":
if (OP == 100)
OP = 0;
OP++;
value = "ОП-";
Console.WriteLine("Вы выбрали оплату платежей");
Console.WriteLine($"Ваш номер: \t********************** {value}{OP} **********************\t");
xaml.Serialize(memorystream, SendingInfo = new SendingInfo() { Id = 2, Name = String.Concat(value, OP) });
Bytesarray = memorystream.ToArray();
StreamInfo.Write(Bytesarray, 0, Bytesarray.Length);
break;
case "3":
if (RP == 100)
RP = 0;
RP++;
value = "РП-";
Console.WriteLine("Вы выбрали решение проблем с картой");
Console.WriteLine($"Ваш номер: \t********************** {value}{RP} **********************\t");
xaml.Serialize(memorystream, SendingInfo = new SendingInfo() { Id = 3, Name = String.Concat(value, RP) });
Bytesarray = memorystream.ToArray();
StreamInfo.Write(Bytesarray, 0, Bytesarray.Length);
break;
default:
Console.WriteLine("Такого пункта нет, выберите другой!");
break;
}
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
tcpclient.Close();
}
}
}
[Serializable]
public class SendingInfo
{
public int Id { get; set; }
public string Name { get; set; }
public SendingInfo()
{
}
}
} |
|
Main() клиента:
C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
| using System;
namespace bankomatapplication
{
class Program
{
static void Main(string[] args)
{
Abc abc = new Abc();
abc.Choosefrommenu();
Console.ReadKey();
}
}
} |
|
0
|