【问题标题】:Cannot connect to Java server from Android device无法从 Android 设备连接到 Java 服务器
【发布时间】:2017-07-12 16:42:33
【问题描述】:

我有两个项目,一个 Java server 和一个用 C# 编写的统一 client。当我运行 java server 时,统一应用程序已在 Windows 上成功连接。但是当我尝试在真正的 android 设备上连接时,它无法正常工作。Android 使用 USB 电缆连接到笔记本电脑。

简单的java代码

package main;


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1 {

    private static  final int portnumber=6422;
    public static void main(String[] args){
        ServerSocket serverSocket =null;
        try {
            System.out.println("Server starts on port"+portnumber);
            serverSocket = new ServerSocket(portnumber);

            //Client connecting
            System.out.println("Waiting for clients to connect");
            Socket socket = serverSocket.accept();
            System.out.println("A client has connected");

            System.out.println("server has ended");
        }catch (IOException e){
            e.printStackTrace();

        }
    }
}

客户端代码

using UnityEngine;
using System.Net.Sockets;
using System.IO;
using System;
public class Client : MonoBehaviour
{

    private bool socketready;
    private TcpClient socket;

    public void ConnectToServer()
    {

        //if already connected , ignore this function
        if (socketready)
            return;

        //my laptop private ip address.
        string host = "192.168.1.2";
        int port = 6422;
        //create the socket
        try
        {
            socket = new TcpClient(host, port);
            socketready = true;
        }
        catch (Exception e)
        {
            print("socket error: " + e.Message);
        }
    }}

统一我有按钮(将调用ConnectToServer)。问题是当我尝试单击此按钮时无法在java控制台中获得“客户端已连接”。

在 android studio 上显示“socket error: Connection timed out

【问题讨论】:

  • 放入 Debug.Log int ConnectToServer 函数以确保它完全被 Button 调用。
  • 好的。我错过了那部分。 “Android 使用 USB 电缆连接到笔记本电脑”...我认为这在这里没有用。您应该确保 Android 设备和运行 Java 服务器的计算机都连接到同一网络。
  • 既然您正在打印套接字错误,为什么不实际告诉我们错误是什么?您可以使用this 来获取错误,也可以简单地在屏幕上创建一个 UI 文本并在那里显示错误 (e.Message)。最好知道您使用的 Unity 版本和 Android 版本以防万一。
  • 好的。如果你确定运行Java程序的设备的IP是192.168.1.2并且你连接到同一个网络,你可以试试IPAddress.Parse("192.168.1.2");而不是直接使用192.168.1.2。例如socket = new TcpClient(IPAddress.Parse("192.168.1.2");, port);....
  • 还有一件事。我假设 Java 程序正在 Windows 上运行,请禁用该 Java 程序的防火墙。您可以谷歌“如何为应用程序禁用防火墙”

标签: java android unity3d server


【解决方案1】:

您的防火墙似乎阻止了来自 Android 设备的连接。只需 add 将已编译的 Java 应用程序添加到防火墙例外列表中,以确保它不会阻止和传入流量。


不相关,但您需要确保连接功能正在另一个线程中完成。还要确保您的接收代码也在另一个线程中完成。将接收代码放入连接Thread 也可以。

最后,请注意,您不能在另一个Thread 中使用 Unity 的 API。如果您使用来自另一个Thread 的Unity API,您将需要一种方法来在主Thread 中执行您的代码。请查看我为此制作的 this 包装器。

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多