【问题标题】:Python Server & Client won't communicatePython 服务器和客户端无法通信
【发布时间】:2018-01-03 10:25:48
【问题描述】:

我一直在关注 Python 中服务器和客户端通信的示例,但我无法让服务器不断侦听新消息、打印它们并将它们发送回客户端以进行打印。任何想法我做错了什么? 服务器代码:

#Imports
import socket

#Define socket address
TCP_IP = '0.0.0.0'  # consider all incoming IPs 
TCP_PORT = 5000  # port# communicating with the client
BUFFER_SIZE = 1024  # buffer size for receiving data

#Create socket    IPv4            TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket created"


s.bind((TCP_IP, TCP_PORT))

s.listen(20)
print "Waiting for a Cli_socket..."

#Wait for Cli_sockect
while True:
    while True:
        # accept Cli_sockection 
        Cli_sock, addr = s.accept()
        print "Cli_sockected with " + addr[0] + " " + str(addr[1])
        # get message from client
        message = Cli_sock.recv(BUFFER_SIZE)
        print message
        # check that there is a message   
        if not message:
            break
        # send message to client
        Cli_sock.send(message)
        print "Sent message"

    s.close()
    print "Socket Closed"

客户端代码:

# a simple client socket
import socket

# define socket address
TCP_IP = '127.0.0.1'  # ip of connecting server
TCP_PORT = 5000  # port communicating server
BUFFER_SIZE = 1024  # buffer size receiving data


# create socket IPv4 & TCP protocol
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket created successfully."

# connect to server
s.connect((TCP_IP, TCP_PORT))
print "Established connection with the server."
data = s.recv(BUFFER_SIZE)

while True:
    print ("Message to send:")
    message = raw_input()
    s.send(message)
    print "Message sent to server: %s." % message
    print ("Message Recv:%s\n" % data)

【问题讨论】:

  • 您看到的行为是什么?它怎么行不通?是否有更具体的堆栈跟踪或其他信息可以分享?
  • 客户端在接收数据时卡在第 28 行,无法到达打印语句。不会发生错误。如果我在客户端的 while 循环中将 data = s.recv 放在 s.send(message) 之后,则循环发送消息但在再次到达 data = s.recv(Buffer_size) 后停止

标签: python tcp server client


【解决方案1】:

在发送任何内容之前,您的服务器正在等待来自客户端的数据:

Cli_sock, addr = s.accept()
print "Cli_sockected with " + addr[0] + " " + str(addr[1])
# get message from client
message = Cli_sock.recv(BUFFER_SIZE)

您的客户端在发送任何内容之前正在等待来自服务器的数据:

s.connect((TCP_IP, TCP_PORT))
print "Established connection with the server."
data = s.recv(BUFFER_SIZE)

因此,双方都在等待对方发送数据,但没有人这样做。这就是它挂起的原因。

【讨论】:

  • 这样做然后发现 Cli_sock, addr = s.accept() 在 server.py 中的循环第二次后使代码崩溃。现在可以了。
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多