我想建立一个聊天!现在我的目标是接收来自用户的输入(将被提供给类中的函数),保存并通过网络将对象发送给用户。
到目前为止,这是我的代码:
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));
}
}
答案 0 :(得分:2)
考虑WCF。
从一致的高层视角处理所有通信问题,包括安全性,不同协议等。
它几乎是.Net中通信的标准,涵盖并取代了较旧的更低级别的技术。
有关如何使用WCF构建聊天服务的详细教程,请参阅WCF / WPF Chat Application
答案 1 :(得分:1)
在ProcessClient方法中:
TcpClient client = (TcpClient) connection;
using(StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream()))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(streamWriter, savedObject);
}
答案 2 :(得分:0)
您可以使用SOAP架构(使用XML序列化而不是二进制序列化),它实现起来会更容易。或者,如果您需要点对点聊天code here。