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

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

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

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

TCP

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

Q&A

解決済

1回答

638閲覧

スレッドとハッシュを使ったTCPプログラミング

yuyu9

総合スコア1

Java

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

TCP

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

0グッド

0クリップ

投稿2020/07/06 14:57

前提・実現したいこと

サーバ側は接続したら文字列を送り、その接続をスレッドに渡して多数のクライアントから接続できるようにしたいです。クライアントは送られた文字列を4つのスレッドを使い前方2バイトが0になるようにハッシュ値を探してその数字をサーバに送り返すようにしたいです。Judgeクラスはサーバーのスレッドでクライアントから送られたハッシュ値が正しいか判断するようにしたいです。NonceFinderクラスはクライアントのスレッドでハッシュ値を探すようにしたいです。大学の課題なのですが、色々調べながら自分で解決しようとしたのですがどうしても解決できなくなってしまったのでお力を借りたいと思い質問させてもらいました。

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

エラーメッセージは出ない状況なのですが、クライアントの35行目で数値が入ってるのは確認できていて、その後のJudgeクラスでは送られてこないという状態です。

エラーメッセージ

該当のソースコード

client

1package sp1; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6import java.io.PrintWriter; 7import java.net.Socket; 8import java.net.UnknownHostException; 9 10public class TcpSockClient { 11 public static void main(String args[]) { 12 String ipAddress = "127.0.0.1"; 13 int portNumber = 34567; 14 Socket socket = null; 15 int numOfThreads=4; 16 PrintWriter pw = null; 17 BufferedReader br = null; 18 19 20 try { 21 socket = new Socket(ipAddress, portNumber); 22 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 23 24 String message = br.readLine(); 25 26 int[] nonces = {0,0}; 27 NonceFinder[] NF =new NonceFinder[numOfThreads]; 28 for(int i=0;i<numOfThreads;i++) { 29 NF[i] = new NonceFinder(message,nonces); 30 NF[i].start(); 31 } 32 33 34 while(nonces[0] !=0) { 35 String as=Integer.toString(nonces[1]); 36 pw = new PrintWriter(socket.getOutputStream(), true); 37 pw.println(as); 38 39 break; 40 } 41 42 43 br.readLine(); 44 45 46 47 48 49 50 } catch(UnknownHostException e) { 51 e.printStackTrace(); 52 } catch(IOException e) { 53 e.printStackTrace(); 54 } 55 } 56} 57

NonceFinder

1package sp1; 2 3import java.io.BufferedReader; 4import java.io.PrintWriter; 5import java.security.MessageDigest; 6import java.security.NoSuchAlgorithmException; 7import java.util.Random; 8 9public class NonceFinder extends Thread{ 10 11 12 private String message; 13 private MessageDigest md; 14 byte[] value; 15 int answer; 16 int[] nonces; 17 Random rand =new Random(); 18 int i=rand.nextInt(); 19 PrintWriter pw = null; 20 BufferedReader br = null; 21 22 23 public NonceFinder(String message,int[] nonces) { 24 this.message = message; 25 this.nonces =nonces; 26 } 27 28 public void run() { 29 try { 30 31 while(true) { 32 String input =message +i; 33 boolean ans =true; 34 md = MessageDigest.getInstance("SHA-1"); 35 value = md.digest(input.getBytes()); 36 for(int j=0;j<2;j++) { 37 if(value[j]==0) { 38 }else { 39 ans =false; 40 } 41 } 42 if(ans) { 43 nonces[0]=1; 44 nonces[1]=i; 45 break; 46 } 47 48 if(i < Integer.MAX_VALUE) { 49 i++; 50 } else { 51 i = Integer.MIN_VALUE; 52 } 53 } 54 55 56 57 58 59 } catch (NoSuchAlgorithmException e) { 60 // TODO 自動生成された catch ブロック 61 e.printStackTrace(); 62 } 63 return; 64 } 65}

Judge

1package sp1; 2 3 4import java.io.BufferedReader; 5import java.io.IOException; 6import java.io.PrintWriter; 7import java.net.Socket; 8import java.security.MessageDigest; 9import java.security.NoSuchAlgorithmException; 10 11public class Judge extends Thread { 12 13 private Socket socket; 14 private String answer; 15 16 private MessageDigest md; 17 byte[] value; 18 PrintWriter pw; 19 boolean as=true; 20 21 BufferedReader br; 22 23 24 public Judge(Socket socket,String answer,BufferedReader br,PrintWriter pw) { 25 this.socket = socket; 26 this.answer = answer; 27 this.br = br; 28 this.pw =pw; 29 } 30 31 public void run() { 32 33 try { 34 try { 35 36 37 38 //Thread.sleep(1000); 39 /*while(true) { 40 if(br.readLine() !=null) { 41 break; 42 } 43 }*/ 44 45 while(br.readLine() !=null) { 46 47 int nonce =Integer.parseInt(br.readLine()); 48 49 50 answer=answer+nonce; 51 md = MessageDigest.getInstance("SHA-1"); 52 value = md.digest(answer.getBytes()); 53 for(int i=0;i<2;i++) { 54 if(value[0]==0) { 55 56 }else { 57 as=false; 58 } 59 if(as) { 60 System.out.println(getId()+","+nonce); 61 pw.println("ok"); 62 }else { 63 System.out.print("s"); 64 pw.println("miss"); 65 } 66 } 67 68 69 socket.close(); 70 } 71 72 } catch(IOException e) { 73 e.printStackTrace(); 74 } catch (NoSuchAlgorithmException e) { 75 // TODO 自動生成された catch ブロック 76 e.printStackTrace(); 77 } 78 } catch (NumberFormatException e) { 79 // TODO 自動生成された catch ブロック 80 e.printStackTrace(); 81 } 82 return; 83 } 84}

server

1package sp1; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6import java.io.PrintWriter; 7import java.net.InetSocketAddress; 8import java.net.ServerSocket; 9import java.net.Socket; 10 11 12 13public class TcpSockServer { 14 public static void main(String[] args) { 15 String str = "Taro2Jiro100;John2Ken235"; 16 17 int portNumber = 34567; 18 19 ServerSocket serverSocket = null; 20 Socket socket = null; 21 PrintWriter pw = null; 22 BufferedReader br = null; 23 24 25 26 27 28 try { 29 30 serverSocket =new ServerSocket(); 31 32 serverSocket.bind(new InetSocketAddress(portNumber)); 33 34 35 36 37 while(true) { 38 socket =serverSocket.accept(); 39 pw = new PrintWriter(socket.getOutputStream(), true); 40 pw.println(str); 41 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 42 43 44 Judge judge = new Judge(socket,str,br,pw); 45 judge.start(); 46 47 } 48 49 } catch (IOException e) { 50 // TODO 自動生成された catch ブロック 51 e.printStackTrace(); 52 } 53 } 54}
ソースコード

Java

試したこと

printWriterがうまくいっていないのかと思い、バイナリ送受信も試してみましたがダメでした。

補足情報(FW/ツールのバージョンなど)

eclipseを使っています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Judgeクラス

java

1 while(br.readLine() !=null) { 2 3 int nonce =Integer.parseInt(br.readLine());

whileの継続条件の中でreadLine()しているので、クライアントから1行読み込みの入力を待ちます。
クライアントから1行入力したら、次の行でさらにreadLine()しているので、ここでもクライアントから1行データ送信されるのを待っています。
クライアント側のソースを見るかぎり1行送信してサーバからの受信待ちになるので、ここでお互いが永遠に相手の送信を待つことになります。

クライアントからは1行だけの読み込みであれば、ここでwhileを使った待ち合わせは必要ないのではないでしょうか。

投稿2020/07/09 06:39

hope_mucci

総合スコア4447

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

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

yuyu9

2020/07/09 09:12

ありがとうございます。確かにその部分はいりませんでした。error文がnullで読み取れないということがあったのでその部分を追加したのです。実際の問題は、処理が早くて、サーバーとクライアント側の対応がうまくいっていなかったようです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問