質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

0回答

1746閲覧

TCP/IPでソケットプログラム

jinxin

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2019/12/18 10:15

前提・実現したいこと

TCP/IPで動作するプログラムを作成していて、ミニゲームを行いたい.
サーバにクライアントが接続したらゲームが開始されて、0-100の間に複数の当たり、外れ(今の所2個)を用意し任意タイミングで送信する.あたりを引くとその数字を引いたクライアントに点数が入る.サーバから情報が返され、当たりはずれとどれだけ近かったかなど.

発生している問題・エラーメッセージ

工夫点として送信できる値を最大4つまでに増やし、送信された数字のうち一番あたりはずれに近い数字をクライアントに表示する.
今の所値を一つしか送信受信できずどうすればいいのかわかりません.良ければやり方とサンプルコードを教えていただきたいです.

該当のソースコード

Java

1 2サーバ側 3public class Server1 { 4 5 static List<MultiServer1> list = new LinkedList<>(); 6 7 static int ans = 0; 8 static int ans1 = 0; 9 static int dam = 0; 10 static int dam1 = 0; 11 static Map<Byte, Integer> map = new HashMap<>(); 12 static boolean flg = true; 13 static boolean button = false; 14 15 public static void main(String[] args) throws IOException { 16 // TODO code application logic here 17 ans = new Random().nextInt(100); 18 Random r = new Random(); 19 ans1 = new Random().nextInt(100); 20 Random s = new Random(); 21 System.out.println("答え:" + ans + "," + ans1); 22 boolean flg03 = true; 23 while (flg03) { 24 int rN = r.nextInt(100); 25 int rN1 = s.nextInt(100); 26 if (rN != ans) { 27 dam = rN; 28 flg03 = false; 29 } 30 if (rN1 != ans1) { 31 dam1 = rN1; 32 flg03 = false; 33 } 34 } 35 System.out.println("はずれ:" + dam + "," + dam1); 36 Socket socket = null; 37 BufferedReader br = null; 38 PrintWriter pw = null; 39 40 int portNum = 10002; 41 ServerSocket servSock = new ServerSocket(portNum); 42 43 byte userID = (byte) 0b0000_0000; 44 45 while (flg) { 46 System.out.println("クライアント待ち"); 47 Socket clntSock = servSock.accept(); 48 MultiServer1 ml = new MultiServer1(clntSock); 49 ml.setUserID(userID); 50 list.add(ml); 51 map.put(userID, 0); 52 userID++; 53 Thread thread = new Thread(ml); 54 thread.start(); 55 } 56 } 57 58 public static boolean checkStart() { 59 if (list.size() > 0) { 60 return true; 61 } else { 62 return false; 63 } 64 } 65 66 public static void getData(InputStream in, byte[] data) { 67 try { 68 int count = 0; 69 int stock = 0; 70 while (count < data.length && (stock = in.read()) != -1) { 71 data[count++] = (byte) stock; 72 } 73 } catch (IOException iOException) { 74 System.out.println("受信時にエラーが発生しました"); 75 } 76 } 77 78 public static void showDataUnsigned(byte[] data) { 79 System.out.println("配列の値 10進数"); 80 for (byte b : data) { 81 System.out.print(Byte.toUnsignedInt(b) + " . "); 82 } 83 System.out.println("\n配列の値 2進数"); 84 ByteBuffer buf01 = ByteBuffer.wrap(data); 85 int s = buf01.getInt(); 86 byte[] t = new byte[data.length]; 87 ByteBuffer buf02 = ByteBuffer.allocate(data.length); 88 buf02.putInt(s); 89 t = buf02.array(); 90 int[] showdata = new int[data.length]; 91 for (int i = 0; i < data.length; i++) { 92 showdata[i] = Byte.toUnsignedInt(t[i]); 93 String str = Integer.toBinaryString(showdata[i]); 94 str = String.format("%8s", str).replace(' ', '0'); 95 System.out.print(str + " "); 96 } 97 System.out.println(); 98 } 99 100 //リトルエンディアン使用時,ByteBuffer使用時に確認するためのメソッド 101 public static void showDataUnsigned(ByteBuffer buf01, int size) { 102 int s = buf01.getInt(); 103 byte[] t = new byte[size]; 104 ByteBuffer buf02 = ByteBuffer.allocate(size); 105 buf02.putInt(s); 106 t = buf02.array(); 107 showDataUnsigned(t); 108 } 109 110 public static void checkingState(byte[] data) { 111 if (data.length == 4) { 112 int a = Byte.toUnsignedInt(data[0]); 113 switch (a) { 114 //ゲーム開始 115 case 0: 116 System.out.println("ゲーム開始"); 117 break; 118 //ゲーム終了 119 case 128: 120 System.out.println("ゲーム終了"); 121 break; 122 case 1: 123 System.out.println("判定"); 124 break; 125 } 126 } 127 } 128 129 public static void checkAns(byte userID, byte input) { 130 int k = Byte.toUnsignedInt(input); 131 int aa = Math.abs(k - ans); 132 int aa1 = Math.abs(k - ans1); 133 System.out.println("送信された値:"+k); 134 if ((aa == 0) || (aa1 == 0)) { 135 System.out.println("おめでとうございます!正解です"); 136 } else if(aa > aa1){ 137 System.out.println("正解との差:" + aa1); 138 }else if(aa < aa1){ 139 System.out.println("正解との差:"+aa); 140 } 141 int ad = Math.abs(k - dam); 142 int ad1 = Math.abs(k - dam1); 143 if (ad == 0 || ad1 == 0) { 144 System.out.println("残念です、外れを引いてしましました"); 145 } else if(ad > ad1){ 146 System.out.println("外れとの差:" + ad1); 147 }else if(ad < ad1){ 148 System.out.println("外れとの差:" + ad); 149 } 150 byte[] data = new byte[4]; 151 data[0] = (byte) 0b0000_0001; 152 data[1] = userID; 153 if (button == true) { 154 } 155 for (MultiServer1 multiServer : list) { 156 multiServer.sendResult(data); 157 } 158 159 if (aa == 0) { 160 gameEnd(); 161 } 162 public static int getAns() { 163 return ans; 164 } 165 166 public static int getDam() { 167 return dam; 168 } 169 170 public static void gameEnd() { 171 Map<Byte, Integer> stock = new HashMap<>(map); 172 LinkedList<Byte> userRank = new LinkedList<>(); 173 System.out.println("MAPdata"); 174 175 for (Map.Entry<Byte, Integer> entry : stock.entrySet()) { 176 System.out.println(entry.getKey() + " " + "獲得点数:" + entry.getValue()); 177 } 178 179 System.out.println("stocksize" + stock.size()); 180 int x = stock.size(); 181 for (int i = 0; i < x; i++) { 182 int max = -1; 183 byte user = 0; 184 for (Map.Entry<Byte, Integer> entry : stock.entrySet()) { 185 186 int value = entry.getValue(); 187 System.out.println(entry.getKey() + " " + "所持点数:" + value); 188 if (value > max) { 189 max = value; 190 user = (byte) entry.getKey(); 191 } 192 } 193 System.out.println("add:" + user); 194 userRank.add(user); 195 stock.remove(user); 196 } 197 System.out.println("RANK" + userRank.size()); 198 for (Byte byte1 : userRank) { 199 System.out.println(byte1); 200 } 201 202 for (MultiServer1 multiServer : list) { 203 multiServer.gameEnd(userRank); 204 } 205 } 206}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問