2014-01-29 97 views
-1

我正在制作一个涉及两个客户端的游戏,一个为另一个托管服务器,然后他们可以一起玩。在我的代码中,我有一个客户端使用了一个serversocket,另一个使用了socketocket,然后serversocket通过serversocket.accept()获得了一个套接字。我的问题是,无论何时我使用PrintWriter.println(...)该消息不会被其他客户端收到。林不知道是否当我发送消息或收到时。这是主类:(我已删除大部分的GUI东西出来的样子)没有发送/接收消息的Java套接字

public class Base extends JPanel { 

PrintWriter pw; 
JButton host = new JButton("Host New Game"); 
JButton join = new JButton("Join Existing Game"); 
JButton ready = new JButton("Ready"); 
Base b = this; 
String ip; 
String port; 
String message; 
boolean otherready; 
int textip = 0; 
Socket s; 
int count = 0; 

public Base() { 

    Handler handler = new Handler(); 

    host.addActionListener(handler); 
    join.addActionListener(handler); 
    text.addActionListener(handler); 

} 

public void notifyOfPlayer() { 

    game = true; 
    setUpGame(); 

} 

public void sendMessage (String message) { 

    try { 

     if (!doneonce) { 

      pw = new PrintWriter(s.getOutputStream()); 
      doneonce = true; 

     } 

     pw.println(message); 
     pw.flush(); 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

public void setPlayer (Socket player) { 

    s = player; 

} 

private class Handler implements ActionListener, MouseListener, MouseMotionListener { 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 



    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     if (e.getSource() == host) { 

      remove(host); 
      remove(join); 
      text.setText("Server Mode, Waiting for player"); 
      text.setSize((int)text.getPreferredSize().getWidth(), 25); 
      text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
      Thread t = new Thread(new ServerMode(b)); 
      t.start(); 
      repaint(); 

     } else if (e.getSource() == join) { 

      remove(host); 
      remove(join); 
      text.setText("Enter IP"); 
      textip = 1; 
      /*text.setSize((int)text.getPreferredSize().getWidth(), 25); 
      text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
      */text.setEditable(true); 
      repaint(); 

     } else if (e.getSource() == text) { 

      if (textip == 1) { 

       textip ++; 
       ip = text.getText(); 
       text.setText("Enter Port"); 
       /*text.setSize((int)text.getPreferredSize().getWidth(), 25); 
       text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
       */ 
      } else { 

       textip = 0; 
       port = text.getText(); 
       text.setText("Joining Game..."); 
       text.setSize((int)text.getPreferredSize().getWidth(), 25); 
       text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 

       try { 

        s = new Socket(ip, Integer.parseInt(port)); 
        text.setText("Game Joined"); 
        remove(text); 
        game = true; 
        setUpGame(); 
        repaint(); 
        Thread t = new Thread(new RecieveHandler(b, s)); 
        t.start(); 

       } catch (Exception e1) { 

        text.setText("Could not connect"); 
        text.setSize((int)text.getPreferredSize().getWidth(), 25); 
        text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
        text.setEditable(false); 
        e1.printStackTrace(); 

       } 

      } 

     } else if (e.getSource() == ready) { 

      sendMessage("ready"); 

     } 

    } 

} 

public void setOtherReady() { 

    otherready = true; 
    JOptionPane.showMessageDialog(null, "Your opponent is ready!", "Ready!", JOptionPane.INFORMATION_MESSAGE); 

} 

}

这里是我的RecieveHandler:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.Socket; 


public class RecieveHandler implements Runnable { 

Base b; 
Socket s; 
BufferedReader r; 

public RecieveHandler(Base base, Socket socket) { 

    try { 

     b = base; 
     s = socket; 
     r = new BufferedReader(new InputStreamReader(s.getInputStream())); 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

@Override 
public void run() { 

    try { 

     while (true) { 

      String message = r.readLine(); 
      System.out.println("Recieved message: " + message); 
      if (message.equals("ready")) { 

       b.setOtherReady(); 

      } 

     } 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

} 

这里是ServerMode:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class ServerMode implements Runnable { 

ServerSocket ss; 
Base b; 
PrintWriter pw; 
BufferedReader r; 

public ServerMode (Base base) { 

    b = base; 

} 

@Override 
public void run() { 

    try { 

     ss = new ServerSocket(3602); 

     while (true) { 

      Socket s = ss.accept(); 
      pw = new PrintWriter(s.getOutputStream()); 
      pw.println("HI!!!"); 
      InputStreamReader isr = new InputStreamReader(s.getInputStream()); 
      r = new BufferedReader(isr); 
      b.notifyOfPlayer(); 
      b.setPlayer(s); 
      Thread t = new Thread(new RecieveHandler(b, s)); 
      t.start(); 

     } 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

} 

此代码对于两个客户端都是相同的。

我做错了什么?

+1

你冲洗作家吗?您也可以使用其他构造函数创建自动装填PrintWriter。 – Kayaman

+0

这解决了ServerMode pw.println(“HI !!”)部分,但没有其他工作至今:( – dodo

+1

“没有别的工作”并不真正描述您的问题。 – Kayaman

回答

0

我对我的代码做了一次极端彻底的检查,发现发送消息的按钮没有连接.addActionListener(...)。糟糕:|