簡體   English   中英

通過套接字發送多個數據

[英]Sending multiple data over socket

我制作了一個多人蛇游戲,通過套接字將實際得分和生命值發送給對手。 問題是在比賽中,敵人的健康將取決於它的得分。 例如,敵人的生命值為90,得分為15。 當敵人得到1分時,它的生命值為16,而得分仍然為15。我認為問題出在服務器的某個位置:

private boolean listenForServerRequest() {
    Socket socket = null;
    try {
        socket = serverSocket.accept();
        dos = new DataOutputStream(socket.getOutputStream());
        dos2 = new DataOutputStream(socket.getOutputStream());
        dis = new DataInputStream(socket.getInputStream());
        dis2 = new DataInputStream(socket.getInputStream());
        accepted = true;
        System.out.println("Client has requested and joined the game");
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

private boolean connect() {
    try {
        socket = new Socket(ip, port);
        dos = new DataOutputStream(socket.getOutputStream());
        dos2 = new DataOutputStream(socket.getOutputStream());
        dis = new DataInputStream(socket.getInputStream());
        dis2 = new DataInputStream(socket.getInputStream());
        accepted = true;
    } catch (IOException e) {
        System.out.println("Unable to connect to the address: " + ip + ":" + port + " | Starting a server");
        return false;
    }
    System.out.println("Successfully connected to the server.");
    return true;
}

private void initializeServer() {
    try {
        serverSocket = new ServerSocket(port, 8, InetAddress.getByName(ip));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public boolean getConnected() {
    return this.connected;
}

public void sendHealth(SnakeHead snakeHead) {
    try {
        dos.writeInt(snakeHead.getHealth());
        System.out.println(snakeHead.getHealth());
        dos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void sendScore(SnakeHead snakeHead) {
    try {
        dos2.writeInt(Globals.getScore());
        System.out.println(snakeHead.getHealth());
        dos2.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public int getEnemyHealth() {
    try{if (dis.available() != 0 ) {
        try {
            enemyHealth = dis.readInt();
            return enemyHealth;
        } catch (IOException e) {
            e.printStackTrace();
        }

    }}catch (IOException e){
        e.printStackTrace();
    }
    return enemyHealth;
}
public int getEnemyScore() {
    try{if (dis2.available() != 0) {
        try {
            enemyScore = dis2.readInt();
            return enemyScore;
        } catch (IOException e) {
            e.printStackTrace();
        }

    }}catch (IOException e){
        e.printStackTrace();
    }
    return enemyScore;
}

希望有人能找到問題或有任何建議! 謝謝!

使用socket.getOutputStream()每次您必須在包含得分和運行狀況的struct中發送數據時,或者在按順序分別發送它們(如首先運行狀況然后是score或Vicevesa)時,都將獲得相同的流。

發送多個數據不是問題。 在此示例中,套接字以TCP模式工作,因此寫入順序=讀取順序。 為避免序列化,建議您以String形式發送分隔的值,並為此使用PrintWriter。 這樣可以“一次性”發送數據。請參見以下示例:

try (
    Socket echoSocket = new Socket(hostName, portNumber);
    PrintWriter out =
        new PrintWriter(echoSocket.getOutputStream(), true);
    BufferedReader in =
        new BufferedReader(
            new InputStreamReader(echoSocket.getInputStream()));

    // reading
    String userInput;
    while ((userInput = stdIn.readLine()) != null) {
        System.out.println("echo: " + in.readLine());
    }

    // writing
    out.println(int + "," + int); // multiple data
)

暫無
暫無

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

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