我正在编写一个基本的海战游戏,以便通过 LAN 网络与朋友一起玩。在传递给问题之前,我将快速描述它是如何工作的:
- 我们决定使用 10x10 网格并使用字符串发送车队信息。
- 我们使用统一的客户端/服务器功能:在启动时,程序控制是否已经有服务器在侦听指定的 IP - 如果是这样,程序就像客户端一样,否则就像服务器一样。
- 之后在每台电脑上打开一个新框架。此帧包含一个 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) {}
}
}
}
我希望我的描述足够清楚。