Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我试图在python中使用TCP创建一个用于文件共享的客户机-服务器模型。_Python_Multithreading_Python 3.x - Fatal编程技术网

我试图在python中使用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作为发送的一部分时,我们不需要发送地址。如果可以的话,请帮忙 这

我面临两个问题。 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())