这是我需要做的事情
编写使用套接字模块的python程序。 编写客户端和服务器。 客户端将读取整数并将该整数发送到服务器。 服务器将测试整数是否为prime并向客户端返回True或False。 服务器还将打印它收到的整数,以及它收到的整数。 然后客户端将报告(例如) “服务器说17是素数”或者 “服务器说18不是素数” 然后客户端要求测试另一个整数。 这将一直持续到用户输入0。
这是我到目前为止所拥有的
服务器脚本
#!/usr/bin/python
import socket
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsocket.bind( ("0.0.0.0", 8000) )
tcpsocket.listen(2)
(client, (ip,port) ) = tcpsocket.accept()
value = int(client.recv(2048))
MESSAGE1 = "The number %s is not a prime number" %value
MESSAGE2 = "The number %s is a prime number" %value
print "received connection from %s" %ip
print " port is number %d" %port
print " number value received is number %d" %value
for i in range(2,value):
if (value % i) == 0:
client.send(MESSAGE1)
else:
client.send(MESSAGE2)
客户端
#!/usr/bin/python
import socket
import sys
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
num = []
while num != 0 :
num = raw_input("Enter number: ")
tcpsocket.connect( ('192.168.233.132', 8000) )
tcpsocket.send(num)
print tcpsocket.recv(2048)
tcpsocket.close()
所以这对于一个数字似乎工作正常但是当我放入循环然后它要求第二个数字但我得到这个错误
Enter number: 3
The number 3 is a prime number
Enter number: 2
Traceback (most recent call last):
File "./socketclient.py", line 14, in <module>
tcpsocket.connect( ('192.168.233.132', 8000) )
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
File "/usr/lib/python2.7/socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor
我足够接近,但需要它继续运行,直到用户输入0
任何想法?
答案 0 :(得分:0)
我看到两个问题。
首先,您的服务器只接受一个连接,但您的客户端每次尝试通过其循环尝试建立新连接。所以循环的第一次迭代工作,但服务器永远不会接受另一个连接。您可以通过将tcpsocket.connect()
移到循环之前来解决此问题,但之后您可能会遇到第二个问题。
第二个问题是TCP将数据作为字节流发送。可以以不同于发送的块的形式接收数据。例如,如果您的循环执行tcpsocket.send('3')
然后tcpsocket.send('5')
,则服务器对client.receive(2048)
的调用可能会返回'35'。 (使用上面的客户端,由于使用人工输入导致调用send
的延迟,这是不太可能的,但是您的服务器不应该依赖于此。)此外,发送'12345'可能是收到'123'然后'45'。对于TCP,您需要定义一些用于检测消息结束的协议。使用换行符作为分隔符是常见的。