0

LAN ネットワークを介して友人とプレイするための基本的な海戦ゲームをコーディングしています。問題に移る前に、それがどのように機能するかを簡単に説明します。

  1. 10x10 グリッドを使用し、フリート情報を文字列で送信することにしました。
  2. 統一されたクライアント/サーバー機能を使用します。プログラムの起動時に、指定された IP でリッスンしているサーバーが既に存在するかどうかを制御します。存在する場合、プログラムはクライアントのように動作し、そうでない場合はサーバーのように動作します。
  3. その後、各 PC で新しいフレームが開かれます。このフレームには、100 個の JButton 配列が含まれています。そこで各プレイヤーは自分の艦隊を配置し、終了したら配置を確認します。

プレーヤーが自分の船の位置を確認すると、プログラムは、「t」(船の一部がセクターにある場合) と「f」(セクターに船がない場合) を追加して作成された文字列を相手に送信することになっています。 )。確認時、文字列は 100 文字です。

ただし、各 PC で確認を押すと、両方のプログラムがフリーズし、まったく通信しません。

frmSend で文字列を送信する

private position.frmDeck deck;
public static String myFleet;
private gioco.frmInterface interface;
private setup.frmStart start;

public frmSend(){
    initComponents();
}

public frmSend(posiziona.frmDeck f, setup.frmStart a, String s) {
    initComponents();
    deck=f;
    start=a;
    myFleet=s;
    f.setEnabled(false);
}

private void Continua(java.awt.event.ActionEvent evt) {                          
    try{
        start.sendReceive(stringaCampo);
        start.setDatoPassato(null);
        while(start.getDatoPassato().equals(null))
        {
            start.sendReceive(null);
        }
    }
    catch(Exception e){System.out.println(e.getMessage());}
    interface=new game.frmInterface(start);
    interface.setVisible(true);
    deck.dispose();
    dispose();
}

sendReceive メソッド

public Socket sktC,sktS; //S stands for server, C for client
public ServerSocket s;
public InputStream iC,iS;
public OutputStream oC,oS;
public BufferedReader rC,rS;
public BufferedWriter wC,wS;
public boolean isClient=false;
private String sentString;
public void sendReceive (String s){
    if(s==null){
        //null parameter, i receive data
        if(isClient){
            try {
                sentString=rC.readLine();
            } catch (IOException ex) {}
        }
        else{
            try {
                sentString=rS.readLine();
            } catch (IOException ex) {}
        }
    }
    else{
        //i send the string
        if(isClient){
            try {
                wC.write(s);
            } catch (IOException ex) {}
        }
        else{
            try {
                wS.write(s);
            } catch (IOException ex) {}
        }
    }
}

私の説明が十分に明確であることを願っています。

4

2 に答える 2

0

受信側でストリームが閉じられていないために問題が発生していると思います。商品の例をいくつか見てみましょうhttp://www.ase.md/~aursu/ClientServerThreads.html

于 2013-05-28T15:48:05.643 に答える
0

毎回ソケットに改行文字を書いていますか? 改行文字を受け取るまで読み取りを続けるブロッキング操作である readLine を使用しています。コードは同期しているように見えるため、読み取りが完了するまでハングします。

于 2013-05-28T16:00:37.617 に答える