在Python中如何从同一套接字发送和接收?
我正在尝试用Python编写一个客户端程序,可以从同一个套接字发送和接收数据,但它总是给我相同的错误,地址已经在使用中。这是我要写的函数在Python中如何从同一套接字发送和接收?,python,sockets,Python,Sockets,我正在尝试用Python编写一个客户端程序,可以从同一个套接字发送和接收数据,但它总是给我相同的错误,地址已经在使用中。这是我要写的函数 def Login(): username=raw_input() password=raw_input() message=raw_input() array=[username,password,message] TCP_IP = '127.0.0.1' TCP_PORT = 5563 BUFFER
def Login():
username=raw_input()
password=raw_input()
message=raw_input()
array=[username,password,message]
TCP_IP = '127.0.0.1'
TCP_PORT = 5563
BUFFER_SIZE = 1024 # Normally 1024, but we want fast response
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((TCP_IP, TCP_PORT))
array_string=pickle.dumps(array)
sock.send(array_string)
sock.close()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((TCP_IP, TCP_PORT))
sock.listen(1)
conn, info = sock.accept()
while 1:
data = serverSocket.recv(1024)
if not data:break
conn.send(data)
conn.close()
这里有很多真正的新手错误
虽然您可能无法将套接字连接到自身以发送和接收数据,但您可以从下面的示例中学习,该示例受您尝试执行类似操作的代码的启发
import _thread
import pickle
import socket
import time
def main():
"""Run a server in a thread and start a client to talk to it."""
_thread.start_new_thread(run_server, ('', 5563))
run_client('localhost', 5563)
def run_server(host, port):
"""Handle all incoming connections by spawning worker threads."""
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen(5)
while True:
_thread.start_new_thread(handle_connection, server.accept())
def handle_connection(client, address):
"""Answer an incoming question from the connected client."""
print('Incoming connection from', address)
client.settimeout(0.1)
data = recvall(client)
client.shutdown(socket.SHUT_RD)
question = pickle.loads(data)
answer = '''len(username) = {}
len(password) = {}
len(message) = {}'''.format(*map(len, question))
client.sendall(answer.encode())
client.shutdown(socket.SHUT_WR)
client.close()
print('Finished with', address)
def recvall(connection):
"""Receive all data from a socket and return as a bytes object."""
buffer = bytearray()
while True:
try:
data = connection.recv(1 << 12)
except socket.timeout:
pass
else:
if data:
buffer.extend(data)
else:
return bytes(buffer)
def run_client(host, port):
"""Collect information from question and display returned answer."""
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
time.sleep(0.1) # wait for server to start listening for clients
client.connect((host, port))
time.sleep(0.1) # wait for handler thread to display connection
username = input('Username: ')
password = input('Password: ')
message = input('Message: ')
question = pickle.dumps((username, password, message))
client.sendall(question)
client.shutdown(socket.SHUT_WR)
answer = recvall(client)
client.shutdown(socket.SHUT_RD)
client.close()
print(answer.decode())
time.sleep(0.1) # wait for handler to cleanly terminate execution
if __name__ == '__main__':
main()
import\u线程
进口泡菜
导入套接字
导入时间
def main():
“”“在线程中运行服务器并启动客户端与之对话。”“”
_启动新线程(运行服务器,('',5563))
运行客户端('localhost',5563)
def run_服务器(主机、端口):
“”“通过生成工作线程来处理所有传入连接。”“”
服务器=socket.socket(socket.AF\u INET,socket.SOCK\u流)
server.bind((主机、端口))
服务器。听(5)
尽管如此:
_thread.start\u new\u线程(handle\u连接,server.accept())
def句柄_连接(客户端,地址):
“”“回答来自连接的客户端的传入问题。”“”
打印('来自'的传入连接',地址)
client.settimeout(0.1)
数据=recvall(客户端)
客户端关闭(套接字关闭)
问题=pickle.load(数据)
答案='''len(用户名)={}
len(密码)={}
len(消息)={}''。格式(*映射(len,问题))
client.sendall(answer.encode())
客户端关闭(套接字关闭)
client.close()
打印('已完成',地址)
def recvall(连接):
“”“从套接字接收所有数据并作为字节对象返回。”“”
缓冲区=字节数组()
尽管如此:
尝试:
data=connection.recv(1感谢您的帮助。是的,我是新手。您使用的不是同一个套接字。您使用的是两个连续的套接字。