0

我正在编写一个基本的海战游戏,以便通过 LAN 网络与朋友一起玩。在传递给问题之前,我将快速描述它是如何工作的:

  1. 我们决定使用 10x10 网格并使用字符串发送车队信息。
  2. 我们使用统一的客户端/服务器功能:在启动时,程序控制是否已经有服务器在侦听指定的 IP - 如果是这样,程序就像客户端一样,否则就像服务器一样。
  3. 之后在每台电脑上打开一个新框架。此帧包含一个 100 个 JButton 数组。每个玩家在那里部署他的舰队,并在完成后确认他的部署。

当玩家确认他的船只位置时,程序应该向对方发送一个字符串,该字符串通过附加“t”(如果船只的一部分在扇区上)和“f”(如果扇区上没有船只)创建)。在确认时,字符串包含 100 个字符。

但是,当我们在每台电脑上点击确认时,两个程序都会冻结并且根本无法通信。

使用 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();
}

发送接收方法

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

你每次都在套接字上写一个换行符吗?您正在使用 readLine,这是一个阻塞操作,它会继续读取,直到收到换行符为止。由于您的代码看起来是同步的,因此它将挂起,直到读取完成。

于 2013-05-28T16:00:37.617 回答
0

我认为这个问题是因为接收端的流永远不会关闭。看看一些商品示例http://www.ase.md/~aursu/ClientServerThreads.html

于 2013-05-28T15:48:05.643 回答