套接字模块,如何发送整数

时间:2015-11-25 09:53:04

标签: python sockets

我正在客户端读取一个值,并希望将其发送到服务器端,以便检查它是否为素数。我收到错误,因为服务器正在期待一个字符串

服务器端

import socket

tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsocket.bind( ("0.0.0.0", 8000) ) 

tcpsocket.listen(2)
(client, (ip,port) ) = tcpsocket.accept()

print "received connection from %s" %ip
print " and port number %d" %port

client.send("Python is fun!") 

客户端

import sys
import socket

tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

num = int(raw_input("Enter number: "))

tcpsocket.connect( ('192.168.233.132', 8000) ) 
tcpsocket.send(num)

错误必须是字符串或错误,而不是int。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:8)

永远不要在流上发送原始数据,而不定义如何解释接收字节的上层协议。

您当然可以以二进制或字符串格式发送整数

  • 以字符串格式,您应该定义字符串标记的结尾,通常是空格或换行符

    val = str(num) + sep # sep = ' ' or sep = `\n`
    tcpsocket.send(val)
    

    和客户方:

    buf = ''
    while sep not in buf:
        buf += client.recv(8)
    num = int(buf)
    
  • 以二进制格式,您应该定义一个精确的编码,struct模块可以帮助

    val = pack('!i', num)
    tcpsocket.send(val)
    

    和客户方:

    buf = ''
    while len(buf) < 4:
        buf += client.recv(8)
    num = struct.unpack('!i', buf[:4])[0]
    

这两种方法允许您甚至跨不同架构实际交换数据

答案 1 :(得分:2)

tcpsocket.send(num)接受stringlink to the api,因此请勿将您插入的数字转换为int

答案 2 :(得分:1)

我发现了一种通过套接字发送整数的超级简便的方法:

#server side:
num=123
# convert num to str, then encode to utf8 byte
tcpsocket.send(bytes(str(num), 'utf8'))

#client side
data = tcpsocket.recv(1024)
# decode to unicode string 
strings = str(data, 'utf8')
#get the num
num = int(strings)

相等地使用encode(),decode()而不是bytes()和str():

#server side:
num=123
# convert num to str, then encode to utf8 byte
tcpsocket.send(str(num).encode('utf8'))

#client side
data = tcpsocket.recv(1024)
# decode to unicode string 
strings = data.decode('utf8')
#get the num
num = int(strings)

答案 3 :(得分:0)

在 Python 3.7.2 中

shouldComponentUpdate