python客户端无法连接到java服务器

Posted

技术标签:

【中文标题】python客户端无法连接到java服务器【英文标题】:python client cant connect to java server 【发布时间】:2022-01-21 04:04:09 【问题描述】:

我试图在我的 java 应用程序和 python 客户端之间进行交流。但它似乎无法连接。 我不确定这是否是因为 IP 地址错误。因为我在某处读到您可以使用 PC 的 IP 连接到虚拟设备,但我也使用了虚拟设备的 10.0.x.x 地址,这似乎也不起作用。在 IntelliJ 中,我的代码似乎确实可以工作,只是不适用于应用程序。

我的python客户端代码:

import socket
HOST = "172.20.10.12"
PORT = 8080

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
print('connected')

sock.sendall(b'Hello!')
data = sock.recv(1024)
print("1", data, '\n')

sock.sendall(b'Bye\n')
data = sock.recv(1024)
print("2", data, '\n')

print("Socket closed")
sock.close()

这是我的应用程序的接收端:StartReceive.java:

package com.example.test;

import java.io.IOException;

class StartReceive implements Runnable 

    @Override
    public void run() 
        try 
            Receive.startReceive();
         catch (IOException e) 
            e.printStackTrace();
        
    

我的receive.java:

public class Receive 

    static String fromClient;
    static String toClient;

    public static void startReceive() throws IOException 

        ServerSocket server = new ServerSocket(8080);
        System.out.println("wait for connection on port 8080");

        boolean run = true;
        while (run) 
            Socket client = server.accept();
            System.out.println("got connection on port 8080");
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(client.getOutputStream(), true);

            fromClient = in.readLine();
            System.out.println("received: " + fromClient);

            if (fromClient != null) 
                toClient = "message is received on server";
                System.out.println("send: message is received");
                out.println(toClient);
                fromClient = in.readLine();
                System.out.println("received: " + fromClient);

                if (fromClient.equals("Bye")) 
                    toClient = "bye received on server";
                    System.out.println("send: bye received on server");
                    out.println(toClient);
                    client.close();
                    run = false;
                    System.out.println("socket closed");
                
            
        
    

然后我在我的 mainactivity 中这样称呼它:

【问题讨论】:

你能告诉我们在服务器端打印什么吗? @markspace 嗨,它会打印到:wait for connection on port 8080 如果您无法接受传入连接,则可能是您的防火墙。 @markspace 确实可以。你知道怎么解决吗? 【参考方案1】:

要调试连接问题,首先尝试在客户端将 IP 设置为“localhost”。

您还可以在服务器端打印 server.getInetAddress()。您可能没有监听您的客户想要连接的特定地址。


我会按如下方式调试:

    运行服务器

    在服务器 PC 上,键入命令“netstat -a -p tcp”(这是 Windows,对)并查找您认为是服务器的东西。 “虚拟安卓设备”必须出现在物理 PC 上,因为物理 PC 是物理连接到物理网络的东西。

    尝试使用某些实用程序或其他工具连接到该服务器;我更喜欢远程登录。 '远程登录'。您至少应该在服务器控制台输出中看到服务器的“已连接”消息。

如果一切顺利,您现在知道服务器基本上可以正常工作了。


一旦您的客户端连接上,您就会遇到另一个错误:

您正在发送 6 个字节,没有换行符。

sock.sendall(b'Hello!')

您希望收到由换行符终止的数据。

fromClient = in.readLine();

您的接收器仍在等待行尾。

【讨论】:

您好。使用 localhost 它似乎也不起作用。甚至关闭了windows的防火墙。我确实似乎没有找到问题所在。它适用于 IntelliJ,但不适用于应用程序。 你打印服务器中的监听地址了吗? (在初始化服务器套接字之后)。输出是什么?这是什么操作系统? 我正在我的 Windows 机器上运行 android 应用程序(虚拟设备)。客户端在我的树莓派上运行。 我在调试时得到了一些额外的信息,如果有帮助的话:服务器:“ServerSocket[addr=0.0.0.0/0.0.0.0,localport=8080]”。客户端:“Socket[addr=/172.20.10.10,port=47104,localport=8080]” 您的客户端绑定到本地端口 8080 并尝试连接到 服务器上的端口 47104?这似乎不正确,并且与发布的代码不匹配。你打错了吗?

以上是关于python客户端无法连接到java服务器的主要内容,如果未能解决你的问题,请参考以下文章

我无法从其他设备连接到Flask服务器(=不是从localhost)

无法在java中的2台PC套接字之间将客户端连接到服务器

无法从 Java WebService 连接到 MS Access 数据库

无法从 java 应用程序连接到 sqlserver

连接到公共 IP 地址的 Java 套接字

H2 客户端无法连接到服务器