Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过套接字C发送对象_C#_Sockets_Object_Tcp - Fatal编程技术网

C# 如何通过套接字C发送对象

C# 如何通过套接字C发送对象,c#,sockets,object,tcp,C#,Sockets,Object,Tcp,我有一个对象列表,我想通过TCP套接字连接发送它。一种方法是获取对象列表并获取所有值,这些值通过comas和接收数据来分隔,另一端是对象中的值。我可以像在WCF web服务中那样发送对象列表吗。你能告诉我怎么做吗?谢谢 我已经为此创建了一个WCF服务,但由于它有一些无法解决的问题,所以对其进行了更改。因此,我正在创建这个客户机-服务器应用程序 此外,正在发送的数据每隔几秒钟刷新一次,许多用户都需要这些数据。经过一些研究,我发现这将是一个更好的选择 我有一个班级,我通过这个班级发送信息 publi

我有一个对象列表,我想通过TCP套接字连接发送它。一种方法是获取对象列表并获取所有值,这些值通过comas和接收数据来分隔,另一端是对象中的值。我可以像在WCF web服务中那样发送对象列表吗。你能告诉我怎么做吗?谢谢

我已经为此创建了一个WCF服务,但由于它有一些无法解决的问题,所以对其进行了更改。因此,我正在创建这个客户机-服务器应用程序

此外,正在发送的数据每隔几秒钟刷新一次,许多用户都需要这些数据。经过一些研究,我发现这将是一个更好的选择

我有一个班级,我通过这个班级发送信息

public void SendMessage(string text)
{
    Byte[] bytesSent = Encoding.UTF8.GetBytes(text);
    SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
    writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length);
    socket.SendAsync(writeEventArgs);
}
但我宁愿先序列化对象,然后再发送它。所以我有一个流,需要一个字节数组

这是我必须接收的数据:

void ReceiveData()
{
    try
    {
        int recv;
        string stringData;
        while (true)
        {
            recv = socket.Receive(data);
            stringData = Encoding.ASCII.GetString(data, 0, recv);
            if (stringData == "bye")
                break;
            ClientDataRecievedEventArgs sd = new ClientDataRecievedEventArgs(stringData);
            DataRecieved(this, sd);
        }
        stringData = "bye";
        byte[] message = Encoding.ASCII.GetBytes(stringData);
        socket.Send(message);
        socket.Close();
        this.Dispose();
        return;
    }
    catch (Exception)
    {
        socket.Close();
        this.Dispose();
    }

}
这是我正在使用的:

SoapFormatter formatter = new SoapFormatter();

foreach (Communication.Client Client in server.ClientList)
{
    foreach (ObjectLibrary.Model.PIP p in Repository.GlobalRepository.PIPInformation)
    {

        formatter.Serialize(stream, p);
        Client.SendMessage(stream);
    }
}
如何初始化流? 我需要将数据作为流来反序列化到对象


所以我有一个对象列表我可以序列化整个列表吗?

你必须序列化对象,然后在另一边反序列化它们。有关信息,请参阅


但是,您必须小心,如果在发送数据时连接出现问题,您可能没有足够的数据来完全重新创建对象,并且您的程序可能会在某些意外的地方失败。只有在收到所有内容时才创建对象。

您必须序列化对象,然后在另一端反序列化它们。有关信息,请参阅


但是,您必须小心,如果在发送数据时连接出现问题,您可能没有足够的数据来完全重新创建对象,并且您的程序可能会在某些意外的地方失败。只有在收到所有内容的情况下才能创建对象。

您有很多对象可以序列化,例如二进制、XML、JSON,但也有远程处理方法,更不用说您可以创建web服务。在最后两种情况下,“发送”和对象很简单,相当于将其作为参数放入方法签名中。

您有很多对象可以序列化,如二进制、XML、JSON,但也有远程处理方法,更不用说您可以创建web服务。在最后两种情况下,“发送”和对象很简单,相当于将其作为参数放在方法签名中。

为什么要自己通过套接字发送数据,而比TCP更高的协议已经证明了它们的价值

您必须创建一个协议来发送和接收数据,并实现这个协议,在这个协议中,您将花费大量时间在以前已经做过并且已经存在多年的事情上。更不用说花在调试一些枯燥的东西上的时间了,这些枯燥的东西可以用于编程中较酷的部分,为枯燥的部分使用一种语言和框架,并将它们联系起来解决您遇到的问题

您需要注意的是,例如,不同数据对象的分隔符和断开的连接—协议中的一种内容长度头,用于告诉接收方需要多少数据

为什么不简单地使用WCF作为SOAP、REST或JSON的包装器(如果另一方这么说)或者Net.TCP(如果要同时实现客户端和服务器)呢

然后,您可以简单地调用服务方法MyObject[]GetObjects:所有枯燥的东西都将由框架处理,您将收到客户端的MyObject数组。在后台,从HTTP头到序列化,再到检测断开的连接和抛出相关异常,一切都将为您完成。这节省了大量的时间和麻烦


或者,您可以使用普通HTTP,创建一个小型web应用程序,在该应用程序中,您可以以自己喜欢的序列化格式请求数据,并在通过web服务器接收数据后在客户端反序列化数据

为什么要自己通过套接字发送数据,而比TCP更高的协议已经证明了它们的价值

您必须创建一个协议来发送和接收数据,并实现这个协议,在这个协议中,您将花费大量时间在以前已经做过并且已经存在多年的事情上。更不用说花在调试一些枯燥的东西上的时间了,这些枯燥的东西可以用于编程中较酷的部分,为枯燥的部分使用一种语言和框架,并将它们联系起来解决您遇到的问题

您需要注意的是,例如,不同数据对象的分隔符和断开的连接—协议中的一种内容长度头,用于告诉接收方需要多少数据

为什么不简单地使用WCF作为SOAP、REST或JSON的包装器(如果另一方这么说)或者Net.TCP(如果要同时实现客户端和服务器)呢

那你就傻了 y可以调用服务方法MyObject[]GetObjects:所有枯燥的东西都将由框架处理,并且您可以像在客户端一样接收MyObject数组。在后台,从HTTP头到序列化,再到检测断开的连接和抛出相关异常,一切都将为您完成。这节省了大量的时间和麻烦



或者,您可以使用普通HTTP,创建一个小型web应用程序,在该应用程序中,您可以以自己喜欢的序列化格式请求数据,并在通过web服务器接收数据后在客户端反序列化数据

你试过你那边的代码吗?如果是,那么您可以具体说明在通过tcp套接字发送对象列表时遇到的问题。还可以查看此线程[通过套接字发送序列化对象][1][1]:@Taufiq:如果您有非常强的延迟要求,例如,您正在创建网络第一人称射击游戏或其他基于物理的实时游戏,或者正在尝试实现新的或现有的低级Internet协议,只有这样,我才能继续使用基于套接字的方法。否则,我会研究更简单、更高级的技术,比如WCF。就代码分解而言,它更加灵活,并且可以让您避免在大多数时候考虑大多数细节。Merlyn Morgan Graham我更新了我的问题,希望您能帮助我!你试过你那边的代码吗?如果是,那么您可以具体说明在通过tcp套接字发送对象列表时遇到的问题。还可以查看此线程[通过套接字发送序列化对象][1][1]:@Taufiq:如果您有非常强的延迟要求,例如,您正在创建网络第一人称射击游戏或其他基于物理的实时游戏,或者正在尝试实现新的或现有的低级Internet协议,只有这样,我才能继续使用基于套接字的方法。否则,我会研究更简单、更高级的技术,比如WCF。就代码分解而言,它更加灵活,并且可以让您避免在大多数时候考虑大多数细节。Merlyn Morgan Graham我更新了我的问题,希望您能帮助我!或者序列化列表中的所有对象,并将序列化的数据放在一个大缓冲区中,然后立即发送整个缓冲区;或者迭代lsit列表,序列化一个对象并立即发送它。如果需要发送整个列表,则第一种选择是最好的,如果出现错误,则第二种选择是可以发送部分列表。或者序列化列表中的所有对象,并将序列化的数据放在一个大缓冲区中,然后立即发送整个缓冲区;或者迭代lsit列表,序列化一个对象并立即发送它。如果您需要发送整个列表,第一种选择是最好的,如果出现错误,第二种选择是可以发送部分列表。您的WCF存在无法解决的问题,因此您开始创建自己的层?你最好多花点时间让WCF发挥作用。或者将数据托管在IIS中,让客户端通过HTTP轮询新数据。如果你看不出stringData==bye break有什么问题;我真的帮不了你。而且代码取自一个更简单的项目。这似乎工作得很好,我也是这个领域的电枢,所以如果stringData==bye break的代码;有个问题,我看不出来。请解释一下,谢谢。WCF的问题请帮助我,如果可以的话。我想你是指业余爱好者但你送别的一根弦永远不能保证能完整收到。您的数据完全有可能以多个数据包的形式接收。这不太可能,但理论上,由于网络拥塞、缓冲区满等等原因,你可能会收到三个数据包,B、y和e。那么你的程序就不起作用了。我来看看你的WCF问题。哦!问:为什么解决这个问题的正确方法是什么?您的WCF有无法解决的问题,所以您开始创建自己的层?你最好多花点时间让WCF发挥作用。或者将数据托管在IIS中,让客户端通过HTTP轮询新数据。如果你看不出stringData==bye break有什么问题;我真的帮不了你。而且代码取自一个更简单的项目。这似乎工作得很好,我也是这个领域的电枢,所以如果stringData==bye break的代码;有个问题,我看不出来。请解释一下,谢谢。WCF的问题请帮助我,如果可以的话。我想你是指业余爱好者但你送别的一根弦永远不能保证能完整收到。您的数据完全有可能以多个数据包的形式接收。这不太可能,但理论上,由于网络拥塞、缓冲区满等等原因,你可能会收到三个数据包,B、y和e。那么你的程序就不起作用了。我来看看你的WCF问题。哦!顺便问一下,为什么解决这个问题的正确方法是什么?