当前位置: 首页 > 知识库问答 >
问题:

Python错误:不允许发送或接收数据的请求,因为Python中未连接套接字

闾丘高峰
2023-03-14

我想发送一个字符串从Android客户端到python即服务器。但是我发现了这个错误。请引导我!

不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址

客户端

import android.util.Log;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;

public class client {

    private String serverIpAddress = "172.**.*.***";
    private boolean connected = false;
    private int serverPort = 65534;



    protected void connect() {

        if (!connected) {
            if (!serverIpAddress.equals("")) {
                Thread cThread = new Thread(new ClientThread());
                cThread.start();
            }
        }
    }

    public class ClientThread implements Runnable {

        public void run() {
            try {
                InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                System.out.println("server addr " +serverAddr);
                Log.d("ClientActivity", "C: Connecting...");
                Socket socket = new Socket(serverIpAddress,serverPort);
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                String sendMessage = 2 + "\n";
                out.write(sendMessage);
                out.flush();
                System.out.println("Message sent to the server : "+sendMessage);
                socket.close();
                Log.d("ClientActivity", "C: Closed.");
            } catch (Exception e) {
                Log.e("ClientActivity", "C: Error", e);
                connected = false;
            }
        }
    }
}

服务器

import socket
import threading
import json

class ThreadedServer(object):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.bind((self.host, self.port))
        print("Listening.....")

    def listen(self):
        self.sock.listen(5)
        while True:
            client, address = self.sock.accept()
            print("Accepted from  :: "+str(address))
            data = self.sock.recv(1024)
            print ("received data:", str(data))


if __name__ == "__main__":
    ThreadedServer('172.**.*.***',65534).listen()

我被卡住了!

编辑1学分:j4ck

import socket
import threading
import socketserver

class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

    def handle(self):
        data = str(self.request.recv(1024), 'ascii')
        cur_thread = threading.current_thread()
        response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
        self.request.sendall(response)

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass  


if __name__ == "__main__":
    HOST, PORT = "localhost", 0

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    ip, port = server.server_address

    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.daemon = True
    server_thread.start()
    print("Server loop running in thread:", server_thread.name)

服务器将要关闭。如何使此服务器对所有请求都处于活动状态?我想使用套接字从Android发送请求。我想,一旦请求到达服务器,服务器应该使类的线程而不是函数。

共有1个答案

许承悦
2023-03-14

首先,您正在导入线程模块,但似乎根本没有使用它。

我建议您使用socketserver模块,因为它更方便,可以为您做一些事情。

线程版本将使用一个mixin,如下所示(来自上面链接的python文档):

import socket
import threading
import socketserver

class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

    def handle(self):
        data = str(self.request.recv(1024), 'ascii')
        cur_thread = threading.current_thread()
        response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
        self.request.sendall(response)

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass  

# This is a dummy client to show the functionality and is not required, should you choose to implement it
def client(ip, port, message):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((ip, port))
        sock.sendall(bytes(message, 'ascii'))
        response = str(sock.recv(1024), 'ascii')
        print("Received: {}".format(response))

if __name__ == "__main__":
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "localhost", 0

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    ip, port = server.server_address

    # Start a thread with the server -- that thread will then start one
    # more thread for each request
    server_thread = threading.Thread(target=server.serve_forever)
    # Exit the server thread when the main thread terminates
    server_thread.daemon = True
    server_thread.start()
    print("Server loop running in thread:", server_thread.name)

    client(ip, port, "Hello World 1")
    client(ip, port, "Hello World 2")
    client(ip, port, "Hello World 3")

    server.shutdown()
    server.server_close()
 类似资料:
  • 我正在Pygame中创建一个游戏,它需要多人游戏的客户端服务器部分。 首先,我正在检查是否有少于两个连接。如果是这种情况,客户端将显示一个屏幕,上面写着“等待连接”。 我已使客户端成功地向服务器发送“1”消息,如果服务器未满,服务器将以“1”响应。因此,如果服务器没有响应1,则服务器已满,客户端可以继续。 然而,我在标题中提到了这个错误。 服务器代码: 调用它的客户端代码: 服务器代码中的s.se

  • 我正在尝试使用WCF代码中的TCP套接字连接到远程外部服务器我的WCF服务是一个客户端,它的代码使用套接字连接到外部服务器。此代码向外部服务器发送请求并接收服务器响应 如果我使用相同的客户端代码创建一个windows应用程序以连接到远程服务器,则成功。我能够连接、发送和接收此错误仅在我将WCF带入图片时发生。代码在if(m_socket失败。连接)。因此无法成功连接。 非常感谢。

  • 我正在尝试使用套接字库在python中创建一个控制台聊天应用程序。 每当我向服务器发送消息时,服务器代码就会崩溃,并显示以下消息: OSError:[WinError 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址 服务器代码 客户端代码 我试图实现的是,每当我向服务器发送消息时,客户端脚本都应该打印发送的消息。我该怎么解决这

  • 完整错误代码: 我创建了SSL套接字服务器和客户端,但然后服务器尝试从客户端接收信息,它失败了,打印错误,这是上面的文本。 服务器: 客户:

  • 因此,我试图发送一个数据包,但我不断得到这个错误 任何帮助将是真棒! 谢谢! 错误消息:不允许发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未提供地址 代码: }

  • 我试图将文件从客户端传输到服务器。但由于错误,我没有收到任何文件。 这是我的server.py文件,但我得到这个错误,当我要从客户端接收文件。 这是我的客户。请看下面。但这并没有出现错误。 这是我的服务器错误。派克