Я работаю над проектом сервера/клиента. Клиент будет просить у сервера информацию, и сервер передаст их обратно клиенту
Информация может быть строкой, числом, массивом, списком, arraylist или любым другим объектом. Решение, которое я нашел до сих пор, состоит в том, чтобы сериализировать объект (данные) и отправить его, затем десериализовывают его для обработки.
Вот серверный код:
public void RunServer(string SrvIP,int SrvPort)
{
try
{
var ipAd = IPAddress.Parse(SrvIP);
/* Initializes the Listener */
if (ipAd != null)
{
var myList = new TcpListener(ipAd, SrvPort);
/* Start Listeneting at the specified port */
myList.Start();
Console.WriteLine("The server is running at port "+SrvPort+"...");
Console.WriteLine("The local End point is :" + myList.LocalEndpoint);
Console.WriteLine("Waiting for a connection.....");
while (true)
{
Socket s = myList.AcceptSocket();
Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
var b = new byte[100];
int k = s.Receive(b);
Console.WriteLine("Recieved...");
for (int i = 0; i < k; i++)
Console.Write(Convert.ToChar(b[i]));
string cmd = Encoding.ASCII.GetString(b);
if (cmd.Contains("CLOSE-CONNECTION"))
break;
var asen = new ASCIIEncoding();
// sending text
s.Send(asen.GetBytes("The string was received by the server."));
// the line bove to be modified to send serialized object?
Console.WriteLine("\nSent Acknowledgement");
s.Close();
Console.ReadLine();
}
/* clean up */
myList.Stop();
}
}
catch (Exception e)
{
Console.WriteLine("Error..... " + e.StackTrace);
}
}
вот клиентский код, который должен возвратить объект
public object runClient(string SrvIP, int SrvPort)
{
object obj = null;
try
{
var tcpclnt = new TcpClient();
Console.WriteLine("Connecting.....");
tcpclnt.Connect(SrvIP, SrvPort);
// use the ipaddress as in the server program
Console.WriteLine("Connected");
Console.Write("Enter the string to be transmitted : ");
var str = Console.ReadLine();
Stream stm = tcpclnt.GetStream();
var asen = new ASCIIEncoding();
if (str != null)
{
var ba = asen.GetBytes(str);
Console.WriteLine("Transmitting.....");
stm.Write(ba, 0, ba.Length);
}
var bb = new byte[2000];
var k = stm.Read(bb, 0, bb.Length);
string data = null;
for (var i = 0; i < k; i++)
Console.Write(Convert.ToChar(bb[i]));
//convert to object code ??????
Console.ReadLine();
tcpclnt.Close();
}
catch (Exception e)
{
Console.WriteLine("Error..... " + e.StackTrace);
}
return obj;
}
Я должен знать, что польза сериализирует/сериализирует и как интегрировать ее в решение выше.
Обновление (8 лет спустя)
Существует несколько способов отправки данных по сети. Обычно это включает в себя некоторую форму сериализации на одном конце и десериализацию на другом. Хотя мой исходный ответ будет работать, я думаю, что gRPC будет лучшим решением, поскольку он позволяет клиенту и сервер должен быть написан на разных языках. Более того, он предлагает возможности потоковой передачи и множество плагинов сообщества (для показателей, трассировки, ведения журнала и т. Д.) По возможности старайтесь не изобретать колесо заново ...
Исходный ответ
рассматривали ли вы возможность использования служб Windows Communication Foundation ? WCF предоставляет расширяемый API, который поддерживает наиболее распространенные протоколы из коробки. Более того, WCF имеет встроенную сериализацию / десериализацию.
Если вы не хотите использовать WCF, вы можете использовать двоичную сериализацию .
Это пример использования двоичной сериализации:
private Stream SerializeMultipleObjects()
{
// Initialize a storage medium to hold the serialized object
Stream stream = new MemoryStream();
// Serialize an object into the storage medium referenced by 'stream' object.
BinaryFormatter formatter = new BinaryFormatter();
// Serialize multiple objects into the stream
formatter.Serialize( stream, obOrders );
formatter.Serialize( stream, obProducts );
formatter.Serialize( stream, obCustomers );
// Return a stream with multiple objects
return stream;
}
private void DeSerializeMultipleObject(Stream stream)
{
// Construct a binary formatter
BinaryFormatter formatter = new BinaryFormatter();
// Deserialize the stream into object
Orders obOrders = (Orders)formatter.Deserialize( stream );
Products obProducts = (Products)formatter.Deserialize( stream );
Customers obCustomers = (Customer)formatter.Deserialize( stream );
}
Вот вся статья о двоичной сериализации .
-Павел
Вы можете сериализовать свои объекты в json, используя JavaScriptSerializer .. Он очень легкий и простой в использовании. Только не забудьте добавить ссылку на System.Web.Extensions.dll
, например:
var js = new JavaScriptSerializer();
var data = js.Deserialize<MyClass>(receivedString);
и в другом классе
var js = new JavaScriptSerializer();
var serializedData = js.Serialize(dataObject);