1

チャットを構築しようとしています!私の目標は、ユーザーからの入力を受け取り (クラス内の関数に渡されます)、それを保存し、オブジェクトをネット経由でユーザーに送信することです。

これまでの私のコードは次のとおりです。

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

3 に答える 3

2

WCFを検討してください。

一貫した高レベルの観点から、セキュリティ、さまざまなプロトコルなどを含むすべての通信の問題を処理します。

これは、.Netでの通信のほぼ標準であり、古い、より低レベルのテクノロジを包含し、それらに取って代わります。

WCFを使用してチャットサービスを構築する方法の優れたチュートリアルについては、WCF/WPFチャットアプリケーションを参照してください。

于 2011-01-27T10:12:25.527 に答える
1

ProcessClient メソッドで:

TcpClient client = (TcpClient) connection;

using(StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream()))
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(streamWriter, savedObject);
}
于 2011-01-27T09:33:30.653 に答える
0

SOAPアーキテクチャを使用できます(Bynaryシリアル化ではなくXMLシリアル化を使用します)。実装ははるかに簡単です。または、ここでピアツーピアチャットコードが必要な場合。

于 2011-01-27T09:41:10.500 に答える