Python简单套接字

2024-04-23 15:08:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用套接字在服务器和客户机之间创建一个简单的通信。cliend应该发送一条消息,然后服务器向客户端发送一条消息。你知道吗

这是我的客户代码:

import socket
s = socket.socket()
HOST = '127.0.0.1'
s.connect((HOST, 1234))
s.send('Hi')
print ('Client send')
print s.recv(1024)
s.close

这是我的服务器代码:

import socket
s = socket.socket()
HOST = '127.0.0.1'
s.bind((HOST, 1234))
s.listen(5)
while True:
    c, addr = s.accept()
    c.send('Hi client')
    c.close()

但它只打印“客户端发送”。你知道吗


Tags: 代码import服务器sendhost消息客户端close
3条回答

潜在的问题是,您将套接字视为消息总线(每次一条消息,总是完全接收),而实际上它们是字节流。你知道吗

没有人能保证发送X字节的数据会到达相反的方向。它可以是X1,X2,X3,Y1,其中X1+X2+X3=X,Y1是下一条消息Y的开始,以及所有其他类型的组合和错误。你知道吗

为了解决这个问题,现实世界中的客户机-服务器应用程序使用协议。以HTPP为例:请求总是以HTTP开始,以两行换行结束。在这个块中,有一个Content-Length头告诉客户端要读取多少字节,而不管块大小。你知道吗

因此,要真正解决您的问题,您要么编写一个完整的协议,要么构建一个为您实现这一点的库,例如Twisted、Nanomsg或ZeroMQ

在服务器中,发送“Hi client”后,必须等待客户端读取消息。你知道吗

你可以做两件事之一:

更新:在我的系统(MacOSX)上尝试过。启动了两个python解释器。将服务器代码一字不差地粘贴到一个服务器中;服务器现在已启动并正在运行并接受连接。你知道吗

在另一个python解释器客户机shell中,我执行了以下操作

>>> import socket
>>> HOST = '127.0.0.1'    
>>> def test():
...    s = socket.socket()
...    s.connect((HOST, 1234))
...    s.send('Hi')
...    print s.recv(1024)
...    s.close()       # <== Note function call here!
...                                                                                                                                 
>>> test()
Hi client
>>> test()
Hi client
>>> test()
Hi client
>>> test()
Hi client

这表明-至少在我的系统上-代码按预期工作。你知道吗

我不能责备你的问题,因此投票结束你的问题。你知道吗

以下是我使用的代码:

import socket
import threading

HOST = '127.0.0.1'
PORT = 12345

def client():
    s = socket.socket()
    s.connect((HOST, PORT))
    s.send('Hi')
    print ('Client send')
    print s.recv(1024)
    s.close()

def server():
    s = socket.socket()
    s.bind((HOST, PORT))
    s.listen(5)
    c, addr = s.accept()
    c.send('Hi client')
    c.close()

if __name__ == "__main__":
    server = threading.Thread(target=server)
    server.start()
    client()
    server.join()

我得到的结果是:

$ python test.py
Client send
Hi client

如果问题仍然存在,请在您的问题中添加更多详细信息,说明您的设置仍然无法工作的原因和方式。也许问题只是你如何运行程序。请添加有关此的详细信息。你知道吗

相关问题 更多 >