Android Socket 连接 Python 服务器 - 超时

0 投票
2 回答
856 浏览
提问于 2025-04-18 14:32

我正在尝试写一个应用程序,这个程序可以把一段字符串发送到指定的IP地址和端口号。目标地址那边已经有一个服务器可以接收字符串,但不知道为什么,我的应用程序无法和服务器建立连接,总是超时。我只写了代码,如果我还需要在客户端或服务器端做其他设置,比如端口转发,请告诉我。

这个应用程序的目标是接收一个IP地址的字符串、一个端口号的字符串,以及一个要发送到目标的消息字符串。在按下发送按钮后,应用程序会把消息发送到指定的IP和端口,并显示服务器的响应。

这个应用程序还会用于两个场景:一个是在Android应用和Python服务器之间,另一个是在Android应用和自定义硬件之间。希望能找到一个适合这两种情况的解决方案。

客户端代码:

public static class PlaceholderFragment extends Fragment {

        TextView recieve;
        EditText addressText, portText, messageText;
        Button send;

        Socket socket = null;

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(
                    R.layout.fragment_customize_gateway, container, false);

            recieve = (TextView) rootView.findViewById(R.id.textView1);
            addressText = (EditText) rootView.findViewById(R.id.editText1);
            portText = (EditText) rootView.findViewById(R.id.editText2);
            messageText = (EditText) rootView.findViewById(R.id.editText3);

            send = (Button) rootView.findViewById(R.id.send);
            send.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    AsyncSend aSend= new AsyncSend(addressText.getText().toString(),Integer.parseInt(portText.getText().toString()), messageText.getText().toString());
                    aSend.execute();
                }
            });
            return rootView;
        }

        public class AsyncSend extends AsyncTask<Void, Void, Void> {
            String address;
            int port;
            String message;
            String response;
            AsyncSend(String addr, int p, String mes) {
                address = addr;
                port = p;
                message = mes;
            }

            @Override
            protected Void doInBackground(Void... params) {
                android.os.Debug.waitForDebugger();
                Socket socket = null;
                try {
                    System.out.println("Test");
                    socket = new Socket(address, port);
                    System.out.println("Test");
                    DataOutputStream writeOut = new DataOutputStream(socket.getOutputStream());
                    writeOut.writeUTF(message);
                    writeOut.flush();


                    ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(1024);
                    byte[] buffer = new byte[1024];

                    int bytesRead;
                    InputStream writeIn = socket.getInputStream();

                    while((bytesRead = writeIn.read(buffer)) != -1) {
                        writeBuffer.write(buffer,0,bytesRead);
                        response += writeBuffer.toString("UTF-8");
                    }
                } catch (UnknownHostException e){
                    e.printStackTrace();
                    response = "Unknown HostException: " + e.toString();
                    System.out.println(response);
                } catch (IOException e) {
                    response = "IOException: " + e.toString();
                    System.out.println(response);
                } finally {
                    if (socket != null) {
                        recieve.setText(response);
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                recieve.setText(response);
                super.onPostExecute(result);
            }
        }
    }

服务器代码:

import http.server
import socket
import threading
import socketserver

import pymongo

import smtplib

class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
    def handle(self):
        #Connect to database
        try:
            from pymongo import MongoClient
            dbclient = MongoClient()
            db = dbclient.WDI_database
            print("Database Connected")
        except pymongo.errors.ConnectionFailure as e:
            print("Database Failed: {}".format(e))

        col = db.users

        data2 = str(self.request.recv(1024), 'ascii')
        print("Server: {}".format(data2));
        data = data2.split("||")
        username, password, camunits, homunits = data[0], data[1], data[2], data[3]
        post = {"user": username,
                "pass": password,
                "cam": camunits,
                "disp": homunits}
        col.insert(post)
        print(col.count())

        cur_thread = threading.current_thread()
        response = bytes("{} Received data for: {}".format(cur_thread, username), 'ascii')
        self.request.sendall(response)

class ThreadedUDPRequestHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print("Recieved: " + data.decode("utf-8"))
        socket.sendto(data.upper(), self.client_address)

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

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

    tcpserver = ThreadedTCPServer((HOST, PORT-1), ThreadedTCPRequestHandler)
    server_thread = threading.Thread(target=tcpserver.serve_forever)
    server_thread.daemon = True
    server_thread.start()
    print("TCP serving at port", PORT-1)

    while True:
        pass
    tcpserver.shutdown()

2 个回答

1

使用Socket类对你来说太底层了,而且可能会遇到很多麻烦。我建议你用org.apache.http.client.HttpClient来代替。

0

可能是因为我没有设置端口转发,所以我的连接被路由器挡住了。我在路由器和Windows上都打开了这个端口。

撰写回答