i am trying to build a chat! now my goal is to receive input from the user, (which will be fed to a function in a class), save it and send the object to the user over the net.
here is my code so far:
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");
}
}
}
}
i have everything saved in the binaryFormatter, how do i send it to the user to receive?
client side code:
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 v开发者_如何学Coid Words(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("RetrievedWord", allwords);
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
allwords = (String)info.GetValue("RetrievedWord", typeof(string));
}
}
Consider WCF.
It handles all communication issues including security, different protocols, etc. from a consistent high-level perspective.
It is pretty much the standard for communication in .Net and encompasses and supersedes the older more low-level technologies.
For a good tutorial of how to build a chat service using WCF see WCF / WPF Chat Application
In the ProcessClient method:
TcpClient client = (TcpClient) connection;
using(StreamWriter streamWriter = new StreamWriter(tcpClient.GetStream()))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(streamWriter, savedObject);
}
You could use a SOAP Arhitecture (use XML Serialization not Bynary serialization)it would be much easyer to implement. Or if you need a peer to peer chat code here .
精彩评论