gpt4 book ai didi

java - Java 套接字的问题(在井字游戏中)

转载 作者:搜寻专家 更新时间:2023-11-01 02:34:38 25 4
gpt4 key购买 nike

我使用套接字(无线程)用 Java 构建了一个两人井字游戏。我让它工作,除了在游戏结束时终止客户端。基本上,我将其设置为一旦游戏结束(服务器识别胜利或平局),服务器将向两个客户端发送消息。如果客户端读取了该特定消息,那么它们将“跳出”它们的 do-while 循环并关闭套接字连接。

问题是,每当一个客户端关闭时,另一个客户端就会“崩溃”——它会终止,但不会成功(它会抛出一条错误消息)。考虑打开三个终端——两个客户端和一个服务器。如果我在一个客户端上按“Ctrl-C”(退出),另一个客户端将停止。客户应该是完全独立的,我不明白为什么会这样。

我将发布我的服务器代码和我的客户端代码(在删除 Tic Tac Toe 逻辑之后)- 任何人都可以看到我做错了什么吗?谢谢!


更新:我在 try-catch 中添加了打印语句,但这并不能解决问题。我收到的错误是这样的:

 Exception in thread "main" java.lang.ClassCastException: java.lang.String
at Requester.run(Requester.java:32)
at Requester.main(Requester.java:142)

我更改了下面的代码以包含所有 Tic Tac Toe 逻辑。 Requester.java:32 是

 currentPlayer = (Integer) in.readObject();

...紧接在第一个 do-try 语句之后。任何人都可以看到发生了什么吗?

服务器


    import java.io.*;
import java.net.*;

public class Provider {

TBoard board = new TBoard();

ServerSocket providerSocket;
Socket connection1 = null, connection2 = null;
ObjectOutputStream out, out2;
ObjectInputStream in, in2;
String message;
Boolean done = false;

int row;
int col;

Provider() {
}

void run() {
try {
providerSocket = new ServerSocket(20092);

System.out.println("Waiting for connection...");
connection1 = providerSocket.accept();
System.out.println("Connection received from Player 1 "
+ connection1.getInetAddress().getHostName());
connection2 = providerSocket.accept();
System.out.println("Connection received from Player 2 "
+ connection2.getInetAddress().getHostName());

out = new ObjectOutputStream(connection1.getOutputStream());
out2 = new ObjectOutputStream(connection2.getOutputStream());

in = new ObjectInputStream(connection1.getInputStream());
in2 = new ObjectInputStream(connection2.getInputStream());

do {

if (board.get_player() == 1) {
out.writeObject(board.get_player());
out.flush();
out.writeObject(board.print_board());
out.flush();
}
else {
out2.writeObject(board.get_player());
out2.flush();
out2.writeObject(board.print_board());
out2.flush();
}

sendMessage(board.get_player(),
"Please enter a row, press Enter, then enter a column: ");

if (board.get_player() == 1) {
int[][] c_array = (int[][]) in.readObject();
board.set_array(c_array);
}
else {
int[][] c_array = (int[][]) in2.readObject();
board.set_array(c_array);
}

if (board.get_player() == 1) {
board.set_player(2);
}
else {
board.set_player(1);
}

if (board.winner() != 0) {


System.out.print("The winner is...");

if (board.get_player() == 1) {
System.out.println("Player 2!");
}
else {
System.out.println("Player 1!");
}

out.writeObject("bye");
out.flush();
out2.writeObject("bye");
out2.flush();

done = true;


}
else {

if(board.get_player() == 2){
out.writeObject("nothing");
out.flush();
}
else{
out2.writeObject("nothing");
out2.flush();
}


}

} while (done != true);

}
catch (IOException ioException) {
ioException.printStackTrace();
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {

try {

in.close();
out.close();
in2.close();
out2.close();
providerSocket.close();
}
catch (IOException ioException) {
ioException.printStackTrace();
}
}
}

void sendMessage(int player, String msg) {
try {
if (player == 1) {
out.writeObject(msg);
out.flush();

}
else {
out2.writeObject(msg);
out2.flush();
}
}
catch (IOException ioException) {
ioException.printStackTrace();
}
}

public static void main(String args[]) {
Provider server = new Provider();
while (true) {
server.run();
}
}

客户:


    import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Requester {

TBoard board = new TBoard();

Socket requestSocket;
ObjectOutputStream out;
ObjectInputStream in;
String message;
String endmessage = "";
int row, col, currentPlayer;

Scanner scan = new Scanner(System.in);

Requester() {
}

void run() {
try {
requestSocket = new Socket("server2.xx.xxxx.xxx", 20092);
System.out.println("Connected to localhost in port 20092");

out = new ObjectOutputStream(requestSocket.getOutputStream());
in = new ObjectInputStream(requestSocket.getInputStream());

do {
try {

currentPlayer = (Integer) in.readObject();
board.set_player(currentPlayer);

int[][] b_array = (int[][]) in.readObject();
board.set_array(b_array);

for (int i = 0; i < 3; i++) {
System.out.println("");
for (int j = 0; j < 3; j++) {
if (b_array[i][j] == 1) {
System.out.print(" X");
}
else if (b_array[i][j] == 2) {
System.out.print(" O");
}
else {
System.out.print(" -");
}
}
}

System.out.println();

message = (String) in.readObject();
System.out.print(message);

row = scan.nextInt();
while (row < 0 || row > 2) {
System.out
.print("Row is invalid, please choose again (0-2): ");
row = scan.nextInt();
}

col = scan.nextInt();
while (col < 0 || col > 2) {
System.out
.print("Column is invalid, please choose again (0-2): ");
col = scan.nextInt();
}

while (!board.make_move(row, col)) {
System.out
.print("The move is not valid. Please choose another row (0-2): ");
row = scan.nextInt();

while (row < 0 || row > 2) {
System.out
.print("Row is invalid, please choose again (0-2): ");
row = scan.nextInt();
}

System.out.print("Please choose a column (0-2): ");
col = scan.nextInt();

while (col < 0 || col > 2) {
System.out
.print("Column is invalid, please choose again (0-2): ");
row = scan.nextInt();
}
}

for (int i = 0; i < 3; i++) {
System.out.println("");
for (int j = 0; j < 3; j++) {
if (b_array[i][j] == 1) {
System.out.print(" X");
}
else if (b_array[i][j] == 2) {
System.out.print(" O");
}
else {
System.out.print(" -");
}
}
}

System.out.println();

out.writeObject(board.print_board());
out.flush();

endmessage = (String) in.readObject();

}
catch (ClassNotFoundException classNot) {
System.err.println("data received in unknown format");
}
} while (!endmessage.equals("bye"));
}
catch (UnknownHostException unknownHost) {
System.err.println("You are trying to connect to an unknown host!");
}
catch (IOException ioException) {
ioException.printStackTrace();
}
finally {
try {
in.close();
out.close();
requestSocket.close();
}
catch (IOException ioException) {
ioException.printStackTrace();
}
}
}

void sendMessage(int msg) {
try {
out.writeObject(msg);
out.flush();
}
catch (IOException ioException) {
ioException.printStackTrace();
}
}

public static void main(String args[]) {
Requester client = new Requester();
client.run();
}

...任何帮助都会很棒,我已经被困在这个问题上好几天了。谢谢!

最佳答案

当两个用户之一关闭程序时。连接“中断”。然后 socket 类抛出一个 IOException,你会捕捉到它:

   ...
} catch (IOException ioException) {
ioException.printStackTrace();
}
...

但是抓到之后,你什么都不做。您必须添加一些消息并说明连接已断开。我认为您的程序不会崩溃,只是停止,因为他捕获了异常,而不是在 finnaly 中关闭流。

希望这对您有所帮助。

关于java - Java 套接字的问题(在井字游戏中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497900/

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