Как отправить сериализованный объект через сеть?
-
25-10-2019 - |
Вопрос
Я пытаюсь построить поболтать! Теперь моя цель состоит в том, чтобы получить ввод от пользователя (который будет подаваться на функцию в классе), сохранить его и отправить объект пользователю через сеть.
Вот мой код до сих пор:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TcpListener server = new TcpListener(IPAddress.Any, 5000);
server.Start();
Console.WriteLine("Server started");
int a = 0;
while (true)
{
TcpClient connection = server.AcceptTcpClient();
Console.WriteLine("connection accepted");
ThreadPool.QueueUserWorkItem(ProssecClient, connection);
}
}
public static void ProssecClient(object o)
{
TcpClient connection = o as TcpClient;
if (connection == null)
return;
StreamReader sr = new StreamReader(connection.GetStream());
StreamWriter sw = new StreamWriter(connection.GetStream());
string word = "";
savedObject saved = new savedObject();
try
{
while (true)
{
sw.WriteLine(sr.ReadLine());
sw.Flush();
// here the server should read and retrieve,
// everything that it gets to every user that logs in.
}
}
catch
{
Console.WriteLine("client left");
}
}
}
}
У меня все сохранено в BinaryFormatter, как мне отправить его пользователю для получения?
Код на стороне клиента:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
TcpClient connection = new TcpClient("127.0.0.1", 5000);
StreamReader sr = new StreamReader(connection.GetStream());
StreamWriter sw = new StreamWriter(connection.GetStream());
savedObject saved = new savedObject();
Stream stream = File.Open("EmployeeInfo.osl", FileMode.Create);
BinaryFormatter bformatter = new BinaryFormatter();
string word = "";
string allwords = "";
Thread Listen = new Thread(deserialise);
Listen.Start();
while (true)
{
word = Console.ReadLine();
allwords = saved.AllWords(word);
sw.WriteLine(allwords);
sw.Flush();
Console.WriteLine(sr.ReadLine());
//Serialize
//bformatter.Serialize(stream, saved);
//stream.Close();
//sw.WriteLine(saved);
}
}
}
public static void deserialise()
{
//Deserialize
//if (File.Exists("EmployeeInfo.osl"))
//{
// stream = File.Open("EmployeeInfo.osl", FileMode.Open);
// bformatter = new BinaryFormatter();
// saved = (savedObject)bformatter.Deserialize(stream);
// stream.Close();
//}
}
}
[Serializable()]
class savedObject : ISerializable
{
public string allwords;
public string AllWords(string words)
{
allwords += words + " ";
return allwords;
}
public void Words(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("RetrievedWord", allwords);
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
allwords = (String)info.GetValue("RetrievedWord", typeof(string));
}
}
Решение
В методе ProcessClient:
TcpClient client = (TcpClient) connection;
using(StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream()))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(streamWriter, savedObject);
}
Другие советы
Рассмотрим WCF.
Он занимается всеми проблемами связи, включая безопасность, различные протоколы и т. Д. С постоянной точки зрения высокого уровня.
Это в значительной степени стандарт связи в .NET и охватывает и заменяет более старые более низкие технологии.
Для хорошего учебного пособия о том, как создать службу чата, используя WCF. Приложение чата WCF / WPF
Вы могли бы использовать архитектуру мыла (использовать сериализацию XML, а не сериализацию Bynary), это было бы гораздо легко реализовать. Или, если вам нужен однозначный чат код здесь .