簡體   English   中英

LibGDX:無法在Android上打開服務器套接字

[英]LibGDX: can't open server socket on android

我正在使用libGDX開發多人游戲,但我的問題是該代碼可在桌面上運行。 這會導致Android崩潰。 當我在android上啟動服務器線程時,發生以下錯誤:

FATAL EXCEPTION: YellowServer
com.badlogic.gdx.utils.GdxRuntimeException: Cannot create a server socket at port 4444.
at com.badlogic.gdx.net.NetJavaServerSocketImpl.<init>(NetJavaServerSocketImpl.java:63)
at com.badlogic.gdx.backends.android.AndroidNet.newServerSocket(AndroidNet.java:60)
at hu.hundevelopers.yellow.net.NetServer.<init>(NetServer.java:41)
at hu.hundevelopers.yellow.YellowServer.create(YellowServer.java:32)
at hu.hundevelopers.yellow.YellowServer.run(YellowServer.java:61)
Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)
at libcore.io.IoBridge.socket(IoBridge.java:583)
at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
at java.net.PlainServerSocketImpl.create(PlainServerSocketImpl.java:38)
at java.net.ServerSocket.<init>(ServerSocket.java:59)
at com.badlogic.gdx.net.NetJavaServerSocketImpl.<init>(NetJavaServerSocketImpl.java:46)
... 4 more
Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
at libcore.io.Posix.socket(Native Method)
at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
at libcore.io.IoBridge.socket(IoBridge.java:568)
... 8 more

好像我從清單xml文件中忘記了權限,但是它們在那里:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

NetServer.java:

package hu.hundevelopers.yellow.net;

import java.util.ArrayList;
import java.util.List;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Net;
import com.badlogic.gdx.net.ServerSocket;

import hu.hundevelopers.yellow.YellowServer;
import hu.hundevelopers.yellow.net.packet.Packet;

public class NetServer {
    public class ListenThread extends Thread {
        public NetServer net;

        public ListenThread(NetServer net) {
            super("ListenThread");
            this.net = net;
        }

        @Override
        public void run() {
            try {
                while (this.net.server.game.isHosting) {
                    NetServerClient client = new NetServerClient(this.net, this.net.socket.accept(this.net.server.game.socketHints));
                    this.net.clients.add(client);
                }
            } catch (Exception e) {

            }
        }
    }

    public YellowServer server;
    public ServerSocket socket;
    public List<NetServerClient> clients;

    public NetServer(YellowServer server, int port) {
        this.server = server;
        this.socket = Gdx.net.newServerSocket(Net.Protocol.TCP, port, this.server.game.serverSocketHints);
        this.clients = new ArrayList<NetServerClient>();
        new ListenThread(this).start();
    }

    public void sendToAll(Packet pkt) {
        for (NetServerClient client : this.clients)
            client.send(pkt);
    }

    public void sendToAllAndDispose(Packet pkt) {
        this.sendToAll(pkt);
        pkt.dispose();
    }

    public void update() {
        for (int i = 0; i < this.clients.size(); i++) {
            this.clients.get(i).update();
            if (!this.clients.get(i).connection) {
                this.clients.get(i).dispose();
                this.clients.remove(i--);
            }
        }
    }

    public void dispose() {
        for(NetServerClient client : this.clients)
            client.dispose();
        this.socket.dispose();
    }
}

編輯:

AndroidManifest.xml中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hu.hundevelopers.yellow.android"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/GdxTheme" >
        <activity
            android:name="hu.hundevelopers.yellow.android.AndroidLauncher"
            android:label="@string/app_name" 
            android:screenOrientation="landscape"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

AndroidLauncher.java:

package hu.hundevelopers.yellow.android;

import android.content.pm.PackageManager;
import android.os.Bundle;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;

import hu.hundevelopers.yellow.Yellow;

public class AndroidLauncher extends AndroidApplication {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        initialize(new Yellow(new String[]{}), config);
        if(getContext().checkCallingOrSelfPermission("android.permission.INTERNET") == PackageManager.PERMISSION_GRANTED) {
            Gdx.app.log("INFO", "PERMISSION GRANTED");
        } else {
            Gdx.app.log("ERROR", "PERMISSION DENIED");
        }
    }
}

我解決了問題。 我將所需的最低Android版本從8更改為10,現在一切正常。

異常指示其權限問題。 因此,在打包或部署步驟中可能會出現一些問題(或者清單未達到您的預期目的)。

您可以添加一些調試代碼以驗證您是否沒有權限。 請參閱如何在運行時檢查權限而不拋出SecurityException? 那應該有助於縮小問題的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM