我有两个项目,一个Java服务器和一个用C#编写的统一客户端。当我运行java服务器时,Unity应用程序已在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 上显示“套接字错误:连接超时
”
最佳答案
您的防火墙似乎阻止了来自 Android 设备的连接。只是add将编译的 Java 应用程序添加到防火墙异常(exception)列表,以确保它不会阻止传入流量。
<小时/>不相关,但您需要确保连接功能是在另一个线程中完成的。还要确保您的接收代码也在另一个线程中完成。将接收代码放在连接线程中也可以。
最后,请注意,您不能在另一个线程
中使用Unity的API。如果您从另一个线程
使用Unity的API,您将需要一种在主线程
中执行代码的方法。请查看this我为此制作了包装。
关于java - 无法从 Android 设备连接到 Java 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45042438/