尝试使用套接字发送字符串时程序冻结

时间:2013-05-28 15:35:55

标签: java sockets jframe

我正在编写一个基本的海战游戏,通过局域网网络与朋友一起玩。在解决问题之前,我会快速描述它的工作原理:

  1. 我们决定使用10x10网格并用字符串发送车队信息。
  2. 我们使用统一的客户端/服务器功能:在启动时程序控制是否已经有服务器侦听指定的IP - 如果是这样,程序就像客户端一样,就像服务器一样。
  3. 之后,在每台电脑上打开一个新框架。该帧包含100个JButton数组。每个玩家都会处理他的舰队,并在完成后确认他的处置。
  4. 当玩家确认他的船只位置时,该程序应该向另一个发送一个字符串,该字符串是通过在“f”附加“t”(如果船的一部分在该扇区上)而创建的(如果没有船只是在该部门)。在确认时,该字符串包含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();
    }
    

    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) {}
            }
        }
    }
    

    我希望我的描述足够清楚。

2 个答案:

答案 0 :(得分:0)

我认为问题是由于流在接收方从未关闭而引起的。看看一些商品示例http://www.ase.md/~aursu/ClientServerThreads.html

答案 1 :(得分:0)

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