2016-08-31 4 views
0

Androidクライアントからサーバーであるpythonに文字列を送信したいとします。しかし、このエラーが見つかりました。親切に私を導く!Pythonエラー:ソケットがPythonで接続されていないため、データの送受信ができませんでした

A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

クライアント

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() 

私はこだわっています!

EDIT1クレジット: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からソケットを使用してリクエストを送信したいと思います。私は、一度要求がサーバーに来ると、サーバーは関数のクラスではなくスレッドのスレッドを作成する必要があります。

+0

チェック以下の実装が問題を解決する場合に役立ちます。そうでなければ、Java側の問題である可能性が高いので、あなたの質問に 'java'タグを追加してください。 – nlsdfnbch

答えて

0

まず、threadingモジュールをインポートしていますが、まったく使用していないようです。

the socketserver moduleを使用することをお勧めします。これはもう少し便利で、いくつかのことがあります。

ネジ付きバージョンが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() 
+0

しかし、私はいつもサーバーを生き生きとしたい。クライアントがサーバーに来たら、サーバーはそのクライアント用に新しいスレッドを作成する必要があります。 – Humty

+0

'server.shutdown()'と 'server.server_close()'をスキップすると無限に実行されます。 'threading.Thread(target = server.serve_forver)'は 'ThreadedTCPServer'のビルトインメソッド' serve_forever() 'を実行します。これは名前が示す通りです。 – nlsdfnbch

+0

**編集1 **を参照してください。 – Humty

関連する問題