簡體   English   中英

如何通過網絡發送序列化對象?

[英]How do you send a serialized object over net?

我正在嘗試建立聊天! 現在,我的目標是從用戶那里接收輸入(將輸入輸入到類中的函數),將其保存並通過網絡將對象發送給用戶。

到目前為止,這是我的代碼:

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));
    }
}

考慮WCF。

它從一致的高層角度處理所有通信問題,包括安全性,不同的協議等。

它幾乎是.Net中通信的標准,它包含並取代了較舊的更底層技術。

有關如何使用WCF構建聊天服務的良好教程,請參閱WCF / WPF聊天應用程序。

在ProcessClient方法中:

TcpClient client = (TcpClient) connection;

using(StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream()))
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(streamWriter, savedObject);
}

您可以使用SOAP Arhitecture(使用XML序列化而不是Bynary序列化),這將易於實現。 或者,如果您需要此處的點對點聊天代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM