簡體   English   中英

DataOutputStream-始終寫入服務器?

[英]DataOutputStream- Always writing to server?

出於簡單2D游戲的目的,我需要我的客戶端程序始終將坐標發送到服務器。

因此,我創建了一個測試,以查看是否可以通過從服務器發送和檢索值來使兩個玩家具有相同的速度。

package main;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class DataSender implements Runnable{

    private DataInputStream fromServer;
    private DataOutputStream toServer; 

    Player player;
    Player opponent;

    public DataSender(DataInputStream fromServer, DataOutputStream toServer, Player player, Player opponent){

        this.fromServer = fromServer;
        this.toServer = toServer; 

        this.player = player;
        this.opponent = opponent;   
    }

    @Override
    public void run() {

        while(true){

                try {
                    toServer.writeInt(player.velX);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                try {
                    opponent.velX = fromServer.readInt();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }   
    }
}

while(true)循環僅在創建線程時執行一次。 如何建立恆定的數據流?

您的readInt函數可能正在阻塞。 如果服務器沒有用對手的位置回復客戶端,則循環將停止,直到從服務器接收到4個字節為止。

或者,可能是writeInt調用。 確保禁用Nagle的算法。 發送如此少量的數據會導致不適當的延遲。 在Java中,其稱為TCP_NODELAY 這也可能是代碼的問題,因為沒有足夠的數據寫入導致傳輸,所以未發送正在寫入的字節。

更好的是,如果您完全願意在這里提出建議,請改用UDP。 UDP通常用於游戲編程中,因為所涉及的數據是實時的,並且僅在短時間內有用。 TCP減慢了速度,因為您可能正在確認數據包,或者等待接收不再關心的數據包,因為它們太舊了。 UDP使您可以控制。

另外,通常有一個用於發送的線程和一個用於接收網絡代碼的線程。 我建議您創建2個線程,這樣就不會出現此類問題。

在這種情況下,建議您使用單獨的線程來寫入數據。 例如,當速度通過用戶輸入改變時,發送速度/位置數據包。 使用這樣的線程不斷讀取(並阻止)對手的速度/位置。

暫無
暫無

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

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