【发布时间】:2012-12-09 23:56:36
【问题描述】:
我一直在研究 Python 套接字,希望了解如何更好地完成网络编程。现在我正在尝试设置一个连接到服务器的客户端,并且可以在关闭之前向它发送任意数量的消息。我仍然不太了解所有内容,我只能让它发送一条消息。对于有套接字编程经验的人来说,这可能是显而易见的。有人可以向我解释如何让它发送多条消息吗?也许为我提供一个很好的资源来解释连接、绑定、关闭、接收和所有主要的套接字功能是如何工作的? (我发现的大多数资源只是告诉我何时使用它们。)
客户
# !usr/bin/python
import socket
import sys
def main():
host = ""
port = 8934
message = "Hello World!"
host = raw_input("Enter IP: ")
#Create Socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
print "Failed to create socket. Error code: %s Error Message: %s"%(str(msg[0]),msg[1])
sys.exit()
print "Socket created"
#Connect to server
s.connect((host,port))
while message != "/e":
#Send Data
message = raw_input("Send >> ")
try:
s.sendall(message)
except socket.error, msg:
print "ERROR %s"%(msg[1])
print "Failed to send."
s.close()
if __name__ == "__main__":
main()
服务器
# !usr/bin/python
import socket
import sys
HOST = ""
PORT = 8934
s = socket.socket()
class BoServer:
def __init__(self):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error,msg:
print "Unable to create socket"
sys.exit()
print "Socket created."
def bind(self):
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.bind((HOST,PORT))
except socket.error,msg:
print "Bind failed. Closing..."
sys.exit()
print "Socket bound."
def run(self):
while True:
s.listen(10)
print "Socket Listening"
conn, addr = s.accept()
print "Connected to %s:%s"%(addr[0],addr[1])
income = conn.recv(4096)
if income != "":
print income
def main():
serv = BoServer()
serv.bind()
serv.run()
if __name__ == "__main__":
main()
【问题讨论】:
-
你应该只
listen和accept一次,然后只在conn.recv上循环。 -
在您接受()套接字后,您只从新套接字读取一次,然后服务器关闭套接字。
-
要记住的一件事:即使在您修复此问题之后,您也不能依赖每个
recv获得恰好一个send的结果。在本地测试时,它似乎在 99.999% 的时间内都可以工作,但是一旦您部署到 Internet,它就会一直失败。您可能会得到半个send,或 2-1/2sends。如果您需要单独的消息,则需要使用分隔符(例如,换行符)、长度/类型/任何前缀(例如,网络字符串)或一些自分隔的消息类型(例如,JSON-RPC),并且您需要 @987654330 @ 放入缓冲区并解析它。 -
另外,如果消息是行,反之亦然,并且缓冲和解析听起来太复杂,请考虑使用
makefile,它可以让您调用readline或for line in f或其他任何东西,就像一个常规文件。
标签: python sockets networking