我是python的新手,也是socket编程的新手。
我对DECLARE @str VARCHAR(100)='300|2€&ÄÖÜ|This is text -> should be text|2015-12-31';
SELECT @str FOR XML PATH('');
/*
300|2€&ÄÖÜ|This is text -> should be text|2015-12-31
*/
DECLARE @Xml XML=(SELECT CAST('<x>' + REPLACE((SELECT @str FOR XML PATH('')),'|','</x><x>')+'</x>' AS XML));
SELECT @Xml.value('/x[1]','int') AS IntTypeSave
,@Xml.value('/x[3]','varchar(max)') AS VarcharTypeSave
,@Xml.value('/x[4]','datetime') AS DateTypeSave;
/*
300 This is text -> should be text 2015-12-31 00:00:00.000
*/
SELECT X.value('.','varchar(max)') AS EachX
FROM @Xml.nodes('/x') AS Each(X);
/*
300
2€&ÄÖÜ
This is text -> should be text
2015-12-31
*/
和socket.recvfrom()
我理解通常对于UDP,人们使用socket.recv()
而对于TCP,人们使用recvfrom()
。
例如,
recv()
如上例所示,我感到困惑的是数字。为什么2048和1024用于不同的协议?这些数字代表什么?请解释。我希望我很清楚。谢谢。
答案 0 :(得分:4)
你让他们换了。 TCP套接字应使用socket.recv
,UDP套接字应使用socket.recvfrom
。这是因为TCP是面向连接的协议。创建连接后,它不会更改。另一方面,UDP是无连接(“发送 - 忘记”)协议。您使用recvfrom
,因此您知道应该向谁发送数据。 Recvfrom不能以相同的方式在TCP套接字上工作。
对于1024/2048,这些表示您要接受的字节数。一般来说,UDP比TCP具有更少的开销,允许您接收更多数据,但这不是一个严格的规则,在这种情况下几乎可以忽略不计。您可以根据需要尽可能多地收到。 4096也是常见的(对于两者而言)。
答案 1 :(得分:2)
我认为人们通常会将recvfrom用于UDP。因为在TCP中,一旦建立连接,地址信息就不会改变,因此recvfrom总是为连接信息字段返回None。
在上面的代码中,它将在此行中出错:
message2, clientAddress2 = serverSocketTCP.recv(1024)
由于: recvfrom()返回(data,connection_information)和 recv()只返回数据。因此,它会引发ValueError,因为您正在尝试解压缩非元组值。
1024或2048只定义缓冲区大小,但它不会在返回之前等待那么多数据。例如:
#One side, 'receiver' is a socket
receiver.recv(2048)
#Second side, 'sender' is a socket
sender.send('abc'.encode('utf-8'))
显然,'sender'发送的数据远小于2048字节,但'recv'调用将在收到'sender'发送给它的数据后立即返回
答案 2 :(得分:2)
为什么2048和1024用于不同的协议?
这些是非常随意的数字,取决于正在实施的协议。即使TCP号有效,您提供的UDP号也很可能是错误的。
TCP实现了一个流协议,您可以在任何大小的块中读取它。您可以recv(1)
一次获取一个字节,如果要获取大块,可以recv(100000)
。 recv
可以自由地返回您要求的较小的块,因此您可能会获得与您想要的不同的大小。 1024非常小,你可以毫无问题地阅读更大的块。
UDP实现消息协议。您必须要求足够的字节来覆盖整个消息,否则它将被丢弃。这个大小取决于协议。它通常用于将消息限制为1500(标准以太网数据包的最大大小)的协议,但它可以是高达65535的任何内容。检查实际协议规格的最大值。