gpt4 book ai didi

JAVA客户端-服务器软件,多台机器

转载 作者:行者123 更新时间:2023-12-01 15:16:10 25 4
gpt4 key购买 nike


我用java开发了一个客户端-服务器游戏(称为“SET”)。

在调试过程中我遇到了一个很尴尬的问题:
如果我在同一台机器上运行客户端和服务器(客户端连接到本地主机),则游戏运行得非常好(如果我运行服务器和很多客户端)。

但是,如果我在两台单独的机器上运行客户端和服务器,那么客户端和服务器都会卡在他们的 Inputstream readLine 方法中。

我会提到我正在使用 writeBytes 方法来写入数据,但我总是用\n 完成数据行(如上所述,系统在一台机器上完美运行!)

系统架构如下:

public SetServer(){
this.deck = initCardsList();
Collections.shuffle(this.deck);

shownCards = new Card[12];
for(int i = 0; i<12; i++){
Card c = this.deck.removeFirst();
shownCards[i]=c;
}
while(!isSetOnTable()){
Card c = this.deck.removeFirst();
this.deck.addLast(shownCards[0]);
shownCards[0]=c;
}

playersQueue = new LinkedList<String>();

clients = new LinkedList<ServerOperation>();
try{
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true)
{
if(currNumOfPlayers<5){
System.out.println("Waiting for connection...");
Socket connectionSocket = welcomeSocket.accept();
String line = (new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()))).readLine();
currNumOfPlayers++;
playersQueue.addLast(line);

ServerOperation client = new ServerOperation(connectionSocket,this, line);
clients.add(client);
Thread t = new Thread(client);
t.start(); //<--- This thread listens to client's request
notifyPlayersAdded(line,new DataOutputStream(connectionSocket.getOutputStream())); //<-----This method sends 3 lines of data
}

}
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
<小时/>

ServerOperation 的运行方法:

public void run(){
if(socket==null){
return;
}
else{
try{

// this.out.writeBytes("NewConnection:" + this.parent.STATUS+"\n");
// this.parent.notifyCards();
while(true){
String line = this.br.readLine();
String command = line.split(":")[0];
if(command.equals("SetRequest")){
String[] cards = line.substring(line.indexOf(':')+1).split(" ");
Card c1,c2,c3;
c1 = new Card(
CardShape.values()[(int)(cards[0].charAt(3)-'0')],
CardNumber.values()[(int)(cards[0].charAt(2)-'0')],
CardFill.values()[(int)(cards[0].charAt(1)-'0')],
CardColor.values()[(int)(cards[0].charAt(0)-'0')]);
c2 = new Card(
CardShape.values()[(int)(cards[1].charAt(3)-'0')],
CardNumber.values()[(int)(cards[1].charAt(2)-'0')],
CardFill.values()[(int)(cards[1].charAt(1)-'0')],
CardColor.values()[(int)(cards[1].charAt(0)-'0')]);
c3 = new Card(
CardShape.values()[(int)(cards[2].charAt(3)-'0')],
CardNumber.values()[(int)(cards[2].charAt(2)-'0')],
CardFill.values()[(int)(cards[2].charAt(1)-'0')],
CardColor.values()[(int)(cards[2].charAt(0)-'0')]);
this.parent.checkIfSetAndNotify(c1,c2,c3,this.playerId);
}


}
}

catch(Exception e){
System.out.println(e.getMessage());
}
}
<小时/>

客户代码:

    public SetClient()
{
String sentence;
this.myCards = new LinkedList<Card>();
try{
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
clientSocket = new Socket("10.0.0.3", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.flush();
String name = sayHelloAndGetUserName();
outToServer.writeBytes(name);
outToServer.flush();

sentence = inFromServer.readLine();
sayWelcome(sentence);
ClientOperation clnOper = new ClientOperation(clientSocket,this);
Thread t = new Thread(clnOper);
t.start(); //<---this thread listens to the server for messages (suppose
//to catch the first 3 lines. In practice, catches only the first one.

while(!GameOver)
{
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //<-----listens to the user's input
String line = br.readLine();
String[] choices = line.split(" ");
int c1 = Integer.parseInt(choices[0]);
int c2 = Integer.parseInt(choices[1]);
int c3 = Integer.parseInt(choices[2]);
sendSetMessage(outToServer,c1,c2,c3);
}
catch(Exception ex){
System.out.println("Error listening to system.in...");
}
}

}
catch(Exception e){
System.out.println(e.getMessage());
}
}
<小时/>

ClientOperation的代码:

public void run()
{
if(socket==null){
return;
}
else{
try{
this.br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

while(true){
String line = this.br.readLine();
String command = line.split(":")[0];
String value = line.split(":")[1];
if (command.equalsIgnoreCase("Deck"))
{
ConvertStringToCards(value);
this.parent.PopulateCards(shownCards);
}

else if (command.equalsIgnoreCase("Points"))
{
System.out.println("Points: " + value);
}

else if(command.equalsIgnoreCase("NewPlayer")){
System.out.println(value + " has joined the game !\n");
}

else if(command.equalsIgnoreCase("Hint")){
this.parent.printHint(ConvertStringToHint(value));
}
}
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
<小时/>

一般来说,客户端服务器项目在一台计算机上完美运行,但在两台单独的计算机上挂起的原因可能是什么?
附:当我在不同的机器上逐步调试客户端和服务器时,它也可以完美运行。

提前致谢,

最佳答案

如果不是本地主机的问题,那么很可能检查防火墙是否存在,禁用并再次检查,然后运行 ​​netstat 以检查您的服务器是否正在监听所有接口(interface),而不仅仅是环回。

在 Linux 上你可以尝试:

netstat -nat | grep 6789

它可能也可以在 Windows Power shell 中工作。如果服务器正在您的外部 IP 上运行/监听,并且客户端仍然无法连接并且防火墙被禁用,请安装wireshark并查看网络上发生了什么。

关于JAVA客户端-服务器软件,多台机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11575170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com