我试图在python中使用TCP创建一个用于文件共享的客户机-服务器模型。
我面临两个问题。 1.如果先尝试使用菜单选项3,我的客户机代码不会在循环中运行,但是如果我先使用另一个选项,比如说1或2,它将以应有的方式在循环中运行。 2.在服务器端,我一直收到这个错误。 第71行,在列表文件中 服务器发送(path.encode()) OSError:[WinError 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址 据我所知,当使用TCP作为发送的一部分时,我们不需要发送地址。如果可以的话,请帮忙 这是到目前为止的代码 客户:我试图在python中使用TCP创建一个用于文件共享的客户机-服务器模型。,python,multithreading,python-3.x,Python,Multithreading,Python 3.x,我面临两个问题。 1.如果先尝试使用菜单选项3,我的客户机代码不会在循环中运行,但是如果我先使用另一个选项,比如说1或2,它将以应有的方式在循环中运行。 2.在服务器端,我一直收到这个错误。 第71行,在列表文件中 服务器发送(path.encode()) OSError:[WinError 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址 据我所知,当使用TCP作为发送的一部分时,我们不需要发送地址。如果可以的话,请帮忙 这
import socket
import sys
import os
import threading
IP = "127.0.0.1" #can be hardset to these values for testing
#IP = socket.gethostname()
port = 12000
if int(port) > 5000: # converts the string parameter to integer for comparison to check if it is greater than 5000
port = int(port)
else:
print("Port should be greater than 5000")
sys.exit()
def client_menu(): # this function presents a menu to the user and in turn calls different functions
print(" 1. Get files from the server \n 2. Put files on the server \n 3. List all files \n 4. Exit")
c = input("Enter an option to perform an action: ")
print("You entered: " + c) #user input drives the menu, it is sent to the server side as well to execute the required function
choice = int(c)
client_s.send(c.encode())
if choice == 1:
recv_from_server() # used to recieve files stored on the server
if choice == 2:
send_to_server() # used to send files from the client to the server
if choice == 3: # used to see the list of all files in a directory
list_files_c()
if choice == 4: # used to exit the system
print("You chose to exit")
sys.exit()
elif choice > 4: # tells the user incorrect prompt given
print("Command not understood")
sys.exit()
#funtion definitions for the functions used in the menu
def send_to_server(): # gets the current path to check if required files exist before opening the file to be read and sent to the server
path = os.getcwd()
fileName = "foo1.txt"
if os.path.exists(fileName):
print("Path exists, sending files")
fo_c=open(fileName, 'rb')
words=fo_c.read(102040)
print(words)
client_s.send(fileName.encode()) # sends the filedata alongwith the IP and port information to the server
client_s.send(words)
fo_c.close()
print("File: " + fo_c.name + " is being sent")
else:
print("Path not found")
def recv_from_server():
fileName = client_s.recv(2048) # gets the file information from the server, opens it to read and then saves it
print("Path found, recieving files")
fo_c = open(fileName, 'wb')
print(fo_c)
words = client_s.recv(10240)
print(words)
fo_c.write(words)
fo_c.close()
print("File: " + str(fileName) + "has been recieved")
print("Saved as received"+str(fileName))
def list_files_c(): # lists all the files in the directory where the user is
#path = os.getcwd()
path = client_s.recv(2048)
if os.path.exists(path):
print("Path received, the list of files is: ")
padir = os.listdir(path)
for file in padir:
print(file)
else:
print("Path not found")
client_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # creates a TCP socket to establish communication
client_s.connect((IP, port))
msg = ("Connected to the server")
print(msg)
#client_s.send(msg.encode())
#msg = client_s.recv(2048)
#print(msg.decode())
while True:
#client_menu()
threading.Thread(target=client_menu(), args=(client_s,)).start()
Server:
import socket
import sys
import os
port = 12000 #can be hardset to this value for testing
IP = "127.0.0.1"
#IP = socket.gethostname()
if int(port) > 5000: # converts the string parameter to integer for comparison to check if it is greater than 5000
port = int(port)
else:
print("Port should be greater than 5000")
sys.exit()
def server_menu():
c = msg.recv(2048) # recieves the option selected by the user to execute the specified function call
choice = int(c)
if choice == 1:
send_to_client() # used to send files to the client
if choice == 2:
recv_from_client() # used to receive files from the client
if choice == 3:
list_files_s() # used to print a list of files in the directory
if choice == 4: # used to exit the system
print("You chose to exit")
sys.exit()
elif choice > 4: # used to notify user of incorrect prompt
print("Command not understood")
sys.exit()
# definitions of the functions executed by the menu
def send_to_client(): # used to check if a file exists, then open to read before sending the encoded filedata
fileName = "foo3.txt"
if os.path.exists(fileName):
print("Path found, getting file from the client")
fo_s = open(fileName, 'rb')
words = fo_s.read(10240)
print(words)
server_s.send(fileName.encode())
server_s.send(words)
fo_s.close()
print("File: "+ fo_s.name +"is being sent")
else:
print("Path not found")
def recv_from_client():
fileName = server_s.recv(2048) # recieves the file information from the client over a certian port and IP
print("Path found, receiving files")
fo_s = open(fileName, 'wb') # opnes the files, and then saves it
print(fo_s)
words = server_s.recv(10240)
print(words)
fo_s.write(words)
fo_s.close()
print("File: " + str(fileName) + "has been received")
print("Saved as received_"+str(fileName))
def list_files_s(): # sends directory path for lisiting on client side
path = os.getcwd()
if os.path.exists(path):
print("Path found, sending path: " , path)
server_s.send(path.encode())
else:
print("Path not found")
server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # creates a UDP socket
server_s.bind((IP, port))
server_s.listen(5)
print ("The server is ready to recieve from port:", port)
while True:
msg, clientAddr = server_s.accept()
data = msg.recv(2048)
#msg1 = "Hello"
#msg, clientAddr = server_s.recv(2048)
#server_s.send(msg1.encode()) # sends the encoded string input by the user
while True:
server_menu()
此解决方案可帮助您解决[WinError 10057] 客户端套接字实际上存储在代码的
msg
中
但是您正在尝试向服务器套接字发送消息,这毫无意义,客户端将不会收到任何消息,因此如果需要从客户端接收消息,您需要将服务器更改为消息
while True:
msg, clientAddr = server_s.accept()
data = msg.recv(2048)
print("Path found, sending path: " , path)
server_s.send(path.encode())