【发布时间】: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.LogintConnectToServer函数以确保它完全被 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