通过tcpclient发送/接收对象
我必须在我的C#.NET 4.0应用程序中发送/接收对象(由我制作的自定义类),我希望有一个很好的教程让我开始,因为我在Google上搜索过在序列化/反序列化方面似乎存在很多问题,虽然问题解决了,但还是有很多丑陋的黑客。通过tcpclient发送/接收对象
问候, 亚历Badescu
我做了一个运输,不只是这一点:
http://fadd.codeplex.com/SourceControl/changeset/view/58859#1054822
图书馆是正在进行的工作,但BinaryTransport工作。它也会尝试重新连接,如果它断开连接。
例子:
我做了一个新的框架
public class Example
{
private BinaryTransport<Packet> _client;
private ServerExample _server;
public void Run()
{
// start server
_server = new ServerExample();
_server.Start(new IPEndPoint(IPAddress.Loopback, 1234));
// start client
_client = new BinaryTransport<Packet>(new IPEndPoint(IPAddress.Loopback, 1234));
// send stuff from client to server
_client.Send("Hello world!");
// send custom object
_client.Send(new User { FirstName = "Jonas", LastName = "Gauffin" });
}
}
public class ServerExample
{
private readonly List<BinaryTransport<Packet>> _clients = new List<BinaryTransport<Packet>>();
private SimpleServer _server;
private void OnClientAccepted(Socket socket)
{
var client = new BinaryTransport<Packet>(socket);
client.Disconnected += OnDisconnected;
client.ObjectReceived += OnObject;
_clients.Add(client);
}
private void OnDisconnected(object sender, EventArgs e)
{
var transport = (BinaryTransport<Packet>) sender;
transport.Disconnected -= OnDisconnected;
transport.ObjectReceived -= OnObject;
}
private void OnObject(object sender, ObjectEventArgs<Packet> e)
{
Console.WriteLine("We received: " + e.Object.Value);
}
public void Start(IPEndPoint listenAddress)
{
_server = new SimpleServer(listenAddress, OnClientAccepted);
_server.Start(5);
}
}
[Serializable]
public class Packet
{
public object Value { get; set; }
}
[Serializable]
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
更新:http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net/
嗨,我引用了你 – 2010-10-31 16:49:39
我看到了,谢谢=)BinaryTransport是库中的另一个类,不过。 – jgauffin 2010-10-31 16:57:08
对于TCP/IP通信,我强烈建议Stephen Cleary's FAQ,您应该特别注意Message Framing。你可能也想看看他的NitoSockets实现。
所有假设你不能只使用WCF,当然。
你跟一个非托管的应用程序通信或者两个端点由您管理和控制?如果后者是这种情况,您可能需要考虑WCF(可能使用TCP/IP绑定) – 2010-10-31 14:29:33
注意:在SO上习惯性地忽略'hello'和'regards'。只是问问题:) – 2010-10-31 15:34:14
@ohadsc两个端点都由我管理@tykhyy我将它们留在将来:D – Alex 2010-10-31 16:12:53