저는 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를 사용하여 두 개의 클라이언트를 실행하는 것입니다 방법에 대해 설명합니다.