2017-12-25 32 views
0

저는 Steamworks API를 사용하여 멀티 플레이어 게임을 만들고 있습니다. 최근 몇 가지 문제가 발생했습니다. 즉, 한 클라이언트에서 다른 클라이언트로 패킷을 보낼 수없는 것 같습니다. API가 올바르게 초기화되었지만 모든 것이 있지만 사용 가능한 패킷을 찾을 때 반환되는 패킷 크기는 항상 0입니다. Steamworks가 하나의 스팸 계정 만 가지고 있기 때문에 이것이 같다고 생각합니다. 따라서 Steamworks는 두 가지 모두에 동일한 스팀 ID를 사용하고 있습니다. 문제를 일으키는 클라이언트.하나의 Steam 계정으로 Steamworks P2P 응용 프로그램을 테스트하려면 어떻게합니까?

제 질문은 다음과 같습니다. 어떻게 서로 다른 스팀 ID를 사용해야하는 응용 프로그램을 테스트 할 수 있습니까? 패킷이 전송되지 않는 이유에 대해 알고 싶다면 알려주십시오. 모든 네트워킹 코드는 NetworkManager라는 하나의 클래스에 포함되어 있습니다. 여기서 간단하게 사용하지 않는 콜백 메소드는 무시합니다. connectToLobby()는 시작시 한 번 호출되며 모든 프레임에서 pollPackets()가 호출됩니다.) :

public class NetworkManager implements SteamMatchmakingCallback, SteamNetworkingCallback, SteamUserCallback, SteamUtilsCallback, SteamAPIWarningMessageHook { 

private static final String LOBBY_MATCHING_KEY = "[key:sandbox-lobby]"; 
private static final String LOBBY_MATCHING_VALUE = "[true]"; 

private static final int DEFAULT_CHANNEL = 1; 

private SteamMatchmaking matchmaking; 
private SteamNetworking networking; 
private SteamUser user; 
private SteamUtils utils; 

private Gson serializer; 

private SteamID host; 

private World world; 

public NetworkManager(World world) { 

    this.world = world; 

    matchmaking = new SteamMatchmaking(this); 
    networking = new SteamNetworking(this, API.Client); 
    user = new SteamUser(this); 
    utils = new SteamUtils(this); 

    serializer = new Gson(); 

    utils.setWarningMessageHook(this); 
} 

@Override 
public void onSteamShutdown() { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onWarningMessage(int severity, String message) { 

    System.out.println(message); 

} 

public void connectToLobby() { 

    System.out.println(user.getSteamID().getAccountID()); 

    matchmaking.addRequestLobbyListStringFilter(LOBBY_MATCHING_KEY, LOBBY_MATCHING_VALUE, LobbyComparison.Equal); 
    matchmaking.requestLobbyList(); 

} 

public void pollPackets() { 

    int packetSize; 
    while ((packetSize = networking.isP2PPacketAvailable(DEFAULT_CHANNEL)) > 0) { 

     System.out.println("Packet was received!"); 

     // A packet is available, so get it's contents 
     ByteBuffer buffer = ByteBuffer.allocateDirect(packetSize); 
     try { 
      while (networking.readP2PPacket(host, buffer, DEFAULT_CHANNEL) > 0) { 
      } 
     } catch (SteamException e) { 
      e.printStackTrace(); 
     } 

     byte[] bytes = new byte[buffer.position()]; 
     buffer.get(bytes); 

     String json = new String(bytes); 

     buffer = null; 
     bytes = null; 

     Packet packet = serializer.fromJson(json, Packet.class); 

     world.onPacketReceive(packet); 

    } 

} 

public void sendPacket(SteamID destination, Packet packet) { 

    byte[] bytes = serializer.toJson(packet).getBytes(); 
    ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length); 
    buffer.clear(); 
    buffer.put(bytes); 
    buffer.flip(); 

    try { 
     System.out.println(buffer.position()); 
     System.out.println(buffer.limit()); 
     if (networking.sendP2PPacket(destination, buffer, P2PSend.UnreliableNoDelay, DEFAULT_CHANNEL)) { 
      System.err.println("Failed to send packet!"); 
     } else { 
      System.out.println("Sent packet to " + destination.getAccountID() + " from " + user.getSteamID().getAccountID()); 
     } 
    } catch (SteamException e) { 
     e.printStackTrace(); 
    } 

    bytes = null; 
    buffer = null; 

} 

@Override 
public void onLobbyMatchList(int lobbiesMatching) { 

    if (lobbiesMatching == 0) { 

     // No open lobbies found, so create one 
     matchmaking.createLobby(LobbyType.Public, 2); 

    } else { 

     // Open lobby found, so join it 

     SteamID firstLobby = matchmaking.getLobbyByIndex(0); 
     matchmaking.joinLobby(firstLobby); 

    } 

} 

@Override 
public void onLobbyCreated(SteamResult result, SteamID steamIDLobby) { 

    if (result == SteamResult.OK) { 

     matchmaking.setLobbyJoinable(steamIDLobby, false); 

     if (!matchmaking.setLobbyData(steamIDLobby, LOBBY_MATCHING_KEY, LOBBY_MATCHING_VALUE)) { 
      System.err.println("Failed to set lobby matching data!"); 
      return; 
     } 

     matchmaking.setLobbyJoinable(steamIDLobby, true); 
     host = null; 

     System.out.println("Lobby creation successful!"); 

    } else { 
     System.err.println("Lobby creation failed: " + result); 
    } 

} 

@Override 
public void onLobbyEnter(SteamID steamIDLobby, int chatPermissions, boolean blocked, ChatRoomEnterResponse response) { 

    host = steamIDLobby; 
    System.out.println("Lobby join response: " + response); 

    sendPacket(steamIDLobby, new JoinPacket()); 
} 

@Override 
public void onP2PSessionRequest(SteamID steamIDRemote) { 

    System.out.println("Session request"); 

    // Accept any user that tries to send you messages 
    networking.acceptP2PSessionWithUser(steamIDRemote); 

} 

@Override 
public void onP2PSessionConnectFail(SteamID steamIDRemote, P2PSessionError sessionError) { 

    System.err.println("Session connect failed!"); 
    System.err.println(sessionError); 

} 

} 

패킷 클래스 :

public class Packet { 

public static final int PACKET_LOGIN = 0x0001; 

private final int type; 

protected final Map<String, String> data; 

public Packet(int type) { 

    this.type = type; 

    data = new HashMap<String, String>(); 
} 

public int getType() { 
    return type; 
} 

} 

내가 크게 패킷이 수신되지 왜 어떤 힌트를 감사하겠습니다, 또는 내가 두 개의 서로 다른 스팀 ID를 사용하여 두 개의 클라이언트를 실행하는 것입니다 방법에 대해 설명합니다.

답변

0

나는이 이유로 만 두 번째 Steam 계정을 만들었습니다. Steamworks 백엔드에 개발자 계정을 추가하고 베타 키를 사용하여 게임을 활성화했습니다.

적어도 내가 아는 한 양측이 자신의 Steam 클라이언트를 실행해야하기 때문에 테스트하기가 어렵습니다. 필자는 방금 두 대의 컴퓨터 (하나의 PC, 하나의 MacBook)를 사용하여 모든 코드 변경 사항을 동기화하도록 끊임없이 상기시켜야했습니다.