请教:如何通过Socket传递自定义的对象?

主  题:  请教:如何通过Socket传递自定义的对象?
作  者:  chinayuchen (雨辰)  
等  级:  ^
信 誉 值:  99
所属社区:  .NET技术 C#
问题点数:  50
回复次数:  8
发表时间:  2004-11-25 11:13:11

请大家给个相关的例子吧,谢谢!



回复人: jxzhang615(冰河) ( 四级(中级)) 信誉:100 2004-11-25 11:14:16 得分: 5

帮顶!

回复人: DotNetFreak() ( 一级(初级)) 信誉:100 2004-11-25 11:33:47 得分: 5

可以用.net 提供的 SoapFormatter 或者 BinaryFormatter 把你的object serialize
然后通过socket 传送
在接受方用同样的formatter deserialize 还原出来

回复人: DotNetFreak() ( 一级(初级)) 信誉:100 2004-11-25 11:57:53 得分: 20

[Serializable]
public class MyClass
{
    public string MyClassMember = "Hello World";
}

public void Send(Socket socket)
{
    MyClass obj = new MyClass();
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, obj);

    byte[] data = new byte[1024];

    while (ms.Read(data, 0, 1024) > 0)
    {
        sk.Send(data);
    }
}

public void Recieve(Socket socket)
{
    BinaryFormatter bf = new BinaryFormatter();
    byte[] data = new byte[1024];
    MemoryStream ms = new MemoryStream();

    while (sk.Receive(data) > 0)
    {
        ms.Write(data, 0, 1024);
    }

    MyClass obj = bf.Deserialize(ms) as MyClass;
}

回复人: yzh0523(水手) ( 四级(中级)) 信誉:100 2004-11-25 12:01:21 得分: 20

http://blog.csdn.net/roseguns/archive/2004/10/19/142408.aspx

回复人: chinayuchen(雨辰) ( 一级(初级)) 信誉:99 2004-11-25 14:40:57 得分: 0

请帮我看下一这个错误如何处理,谢谢

// 用于传递的类
[Serializable]
public class MyClass
{
    public string MyClassMember = "Hello World";
}

// 客户端
[Serializable]
public class MyClass
{
    public string MyClassMember = "Hello World";
}

public class Client
{
    static void Main()
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint ep = new IPEndPoint(Dns.GetHostByName("127.0.0.1").AddressList[0], 1000);

        try
        {
            sock.Connect(ep);
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            MyClass obj = new MyClass();
            bf.Serialize(ms, obj);

            ms.Position = 0;
            byte[] data = new byte[1024];
            while (ms.Read(data, 0, 1024) > 0)
                sock.Send(data);
        }
        catch { }
        finally
        {
            sock.Shutdown(SocketShutdown.Both);
            sock.Close();
        }
    }
}

// 服务器端
public class Server
{
    static void Main()
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint ep = new IPEndPoint(Dns.GetHostByName("localhost").AddressList[0], 1000);
        sock.Bind(ep);
        sock.Listen(1);
        Console.WriteLine("Server is Start...");

        Socket sc = sock.Accept();
        BinaryFormatter bf = new BinaryFormatter();

        byte[] data = new byte[1024];
        MemoryStream ms = new MemoryStream();

        while (sc.Receive(data) > 0)
            ms.Write(data, 0, 1024);

        MyClass obj = bf.Deserialize(ms) as MyClass;   // 这一行产生以下的异常信息
        Console.WriteLine(obj.MyClassMember);
    }
}

未处理的异常: System.Runtime.Serialization.SerializationException: 在分析完成之前就遇到流结尾。

回复人: chinayuchen(雨辰) ( 一级(初级)) 信誉:99 2004-11-25 14:42:17 得分: 0

请帮我看下一这个错误如何处理,谢谢
未处理的异常: System.Runtime.Serialization.SerializationException: 在分析完成之前就遇到流结尾。

回复人: chinayuchen(雨辰) ( 一级(初级)) 信誉:99 2004-11-25 15:27:44 得分: 0

唉,沉得这么快,再顶一下
大家帮忙呀,up 有分

回复人: DotNetFreak() ( 一级(初级)) 信誉:100 2004-11-25 17:34:00 得分: 0

你忘了在Deserialize 前把MemoryStream 的position = 0 了,就像客户端一样 ms.Position = 0;

该问题已经结贴 ,得分记录: jxzhang615 (5)、 DotNetFreak (5)、 DotNetFreak (20)、 yzh0523 (20)、

Contributors: FHL