我正在编写一个基本的海战游戏,通过局域网网络与朋友一起玩。在解决问题之前,我会快速描述它的工作原理:
当玩家确认他的船只位置时,该程序应该向另一个发送一个字符串,该字符串是通过在“f”附加“t”(如果船的一部分在该扇区上)而创建的(如果没有船只是在该部门)。在确认时,该字符串包含100个字符。
但是,当我们在每台电脑上点击确认时,两个程序都会冻结,根本不会进行通信。
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) {}
}
}
}
我希望我的描述足够清楚。
答案 0 :(得分:0)
我认为问题是由于流在接收方从未关闭而引起的。看看一些商品示例http://www.ase.md/~aursu/ClientServerThreads.html
答案 1 :(得分:0)
您是否每次都在套接字上写一个换行符?您正在使用readLine,这是一个阻塞操作,继续读取,直到它收到换行符。由于您的代码看起来是同步的,因此它将一直挂起,直到读取完成。