【问题标题】:Problems in receiving data as a client in Python (TCP)在 Python (TCP) 中作为客户端接收数据的问题
【发布时间】:2018-02-24 23:49:55
【问题描述】:

我的客户端聊天应用程序有一个小问题,如果我尝试执行一项将数据与我用来发送数据的数据分开接收的功能,则基本上应用程序会崩溃。 基本上,如果我只有这个功能,它就可以工作:

def send_message (ip_address, port, message):
      #Connect to the server
      c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      c.connect((ip_address, port))
      #Convert message in bytes-like object
      message = message.encode("utf8")
      c.send(message)

      #Receive data
      data = c.recv(88888888888888)
      #Decode data from bytes-like object
      data = data.decode("utf8")
      return data

如果我尝试做两个功能,它不起作用,像这样:

def send_message (ip_address, port, message):
      #Connect to the server
      c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      c.connect((ip_address, port))
      #Convert message in bytes-like object
      message = message.encode("utf8")
      c.send(message)

def receive_message (ip_address, port, message):
      #Connect to the server
      c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      c.connect((ip_address, port))

      #Receive data
      data = c.recv(88888888888888)
      #Decode data from bytes-like object
      data = data.decode("utf8")
      return data

当我尝试从我的 GUI 调用 receive_message 函数时,应用程序停止工作。希望有人能帮忙

编辑:这是服务器代码:

import socket
import sys
from threading import Thread



def client_thread(conn, ip, port, MAX_BUFFER_SIZE = 4096):

# the input is in bytes, so decode it
input_from_client_bytes = conn.recv(MAX_BUFFER_SIZE)

# decode input and strip the end of line
input_from_client = input_from_client_bytes.decode("utf8").rstrip()

print("Result of processing is: {}".format(input_from_client))

vysl = res.encode("utf8")  # encode the result string
conn.sendall(vysl)  # send it to client
conn.close()  # close connection
print('Connection ' + ip + ':' + port + " ended")

def start_server():

import socket
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# this is for easy starting/killing the app
soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print('Socket created')

try:
    soc.bind(("127.0.0.1", 12345))
    print('Socket bind complete')
except socket.error as msg:
    import sys
    print('Bind failed. Error : ' + str(sys.exc_info()))
    sys.exit()

#Start listening on socket
soc.listen(10)
print('Socket now listening')

# for handling task in separate jobs we need threading
from threading import Thread

# this will make an infinite loop needed for 
# not reseting server for every client
while True:
    conn, addr = soc.accept()
    ip, port = str(addr[0]), str(addr[1])
    print('Accepting connection from ' + ip + ':' + port)
    try:
        Thread(target=client_thread, args=(conn, ip, port)).start()
    except:
        print("Terible error!")
        import traceback
        traceback.print_exc()
soc.close()

start_server() 

【问题讨论】:

标签: python python-3.x chat serversocket


【解决方案1】:

您不会显示连接另一端的内容。我猜它类似于echo,它会响应收到的消息。

在第一种情况下,您打开单个连接,首先写入它,然后读取响应。

在第二种情况下,您打开两个单独的连接。您写入第一个套接字,从第二个套接字读取。有人在第二个插座上写吗?我猜不会。

【讨论】:

  • 对不起,我也将服务器代码放入问题中,它们不在我的答案中,但在程序中是的
  • 首先,您的服务器代码不是有效的 Python - 您丢失了缩进。第二 - 我的回答完全正确。您的客户端在一个套接字上写入,尝试在另一个套接字上读取。由于您从未在第二个套接字上写入任何内容,因此服务器不会响应,因此第二个套接字在读取时会无限期阻塞。
  • 我和同学修改了很多代码,但还是有问题我开个新话题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多