Python - 简单的套接字使用

时间:2015-03-11 14:06:10

标签: python sockets

我想使用套接字在服务器和客户端之间创建简单的通信。 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()

但它只打印"客户端发送"

3 个答案:

答案 0 :(得分:1)

在您的服务器中,在发送' 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

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

答案 1 :(得分:0)

我无法重新解决您的问题,因此投票结束您的问题。

这是我使用的代码:

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

如果问题仍然存在,请在您的问题中添加其他详细信息,说明您的设置仍然不起作用的原因和方式。也许问题只是关于你如何运行程序。请添加有关此内容的详细信息。

答案 2 :(得分:0)

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

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

为了解决这个问题,现实世界的客户端 - 服务器应用程序使用协议。以HTPP为例:一个请求始终使用HTTP启动,并以两个换行符结束。在这个块中,有一个Content-Length标头告诉客户端要读取多少字节 - 无论块大小如何。

因此,要真正解决您的问题,您必须编写完整的协议,或者基于为您执行此操作的库构建 - 例如Twisted,Nanomsg或ZeroMQ