サーバーとクライアントで二次元配列のデータ(int[][]board)を送りたいと考えていますが、
キャストのをする必要があるのか、boardをフィールドにおいているからなのか、サーバーからクライアントに情報を送信できていない状態です…。
クライアントからサーバーのタイミングも同様のエラーが発生し、
送信側は、NumberFormatException、受信側はそのデータが受け取れずNullPointerExceptionが発生してしまいます。
サーバークライアント間で二次元配列をやり取りする方法を教えていただければ幸いです。
Communicatorクラスにおけるsend(int[][])/receveboardでエラーが発生している現状です。
また現状のコードの該当箇所はこちらです。
java
1class Communicator implements AutoCloseable { 2 private BufferedReader reader; 3 private PrintWriter out; 4 5 Communicator(Socket s) throws IOException { 6 try { 7 reader = new BufferedReader(new InputStreamReader(s.getInputStream())); 8 out = new PrintWriter(s.getOutputStream(), true); 9 } catch (IOException e) { 10 close(); 11 } 12 } 13 14 void send(Point point) throws IOException { 15 out.println(point.col + "," + point.row); 16 } 17 18 void send(int[][] board) throws IOException { 19 out.println(board); 20 } 21 22 Point receive() throws IOException { 23 String line = reader.readLine(); 24 if (line == null) 25 return null; 26 String[] tokens = line.split(","); 27 return new Point(Integer.parseInt(tokens[0]), Integer.parseInt(tokens[1])); 28 } 29 30 @Override 31 public void close() throws IOException { 32 if (out == null) { 33 out.close(); 34 out = null; 35 } 36 if (reader == null) { 37 reader.close(); 38 reader = null; 39 } 40 } 41 42 public int[][] receiveboard() throws IOException { 43 String board = reader.readLine(); 44 int[][] board2 = new int[8][8]; 45 if (board == null) { 46 return null; 47 } 48 String[] board1 = board.split(","); 49 for (int i = 0; i < 8; i++) { 50 for (int j = 0; j < 8; j++) { 51 board2[i][j] = Integer.parseInt(board1[i * 8 + j]); 52 } 53 } 54 return board2; 55 } 56 57 58}
java
1class Servers { 2 3 static int[][] board = { //盤面 0=無し 1=黒 2=白 3=置ける 4 { 0, 0, 0, 0, 0, 0, 0, 0 }, 5 { 0, 0, 0, 0, 0, 0, 0, 0 }, 6 { 0, 0, 0, 0, 0, 0, 0, 0 }, 7 { 0, 0, 0, 1, 2, 0, 0, 0 }, 8 { 0, 0, 0, 2, 1, 0, 0, 0 }, 9 { 0, 0, 0, 0, 0, 0, 0, 0 }, 10 { 0, 0, 0, 0, 0, 0, 0, 0 }, 11 { 0, 0, 0, 0, 0, 0, 0, 0 } }; 12 13 public void runServer() { 14 ResourceBundle rb = ResourceBundle.getBundle("Pro"); 15 System.out.println("クライアントの接続待ち"); 16 try (ServerSocket ss = new ServerSocket(Integer.parseInt(rb.getString("server_port"))); 17 Communicator comm = new Communicator(ss.accept());) { 18 System.out.println("ゲームスタート"); 19 Point point = null; 20 while (true) { 21 point = comm.receive(); 22 comm.receiveboard(); 23 System.out.println("Client: 受信=" + point); 24 25 printboard(board); 26 27 comm.send(point); 28 comm.send(board); 29 30 } //mainループ 31 } catch (Exception e) { 32 e.printStackTrace(); 33 } finally { 34 } 35 } 36 } 37 38 39 40public class Server { 41 public static void main(String[] args) { 42 Servers sc = new Servers(); 43 sc.runServer(); 44 } 45} 46
java
1class Clients extends Servers { 2 void runClient() { 3 ResourceBundle rb = ResourceBundle.getBundle("Pro"); 4 System.out.println("サーバーの接続待ち"); 5 try (Communicator comm = new Communicator( 6 new Socket(rb.getString("server_id"), Integer.parseInt(rb.getString("server_port"))));) { 7 System.out.println("ゲームスタート"); 8 Point point = null; 9 while (true) { 10 System.out.println("Server: 送信=" + point); 11 comm.send(point); 12 comm.send(board); 13 14 point = comm.receive(); 15 comm.receiveboard(); 16 } 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } finally { 20 } 21 } 22 } 23} 24 25public class Client { 26 public static void main(String[] args) { 27 Clients s2 = new Clients(); 28 s2.runClient(); 29 } 30}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/03 05:13