Вопрос

Я пытаюсь построить поболтать! Теперь моя цель состоит в том, чтобы получить ввод от пользователя (который будет подаваться на функцию в классе), сохранить его и отправить объект пользователю через сеть.

Вот мой код до сих пор:

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), это было бы гораздо легко реализовать. Или, если вам нужен однозначный чат код здесь .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top