前提・実現したいこと
サーバ側は接続したら文字列を送り、その接続をスレッドに渡して多数のクライアントから接続できるようにしたいです。クライアントは送られた文字列を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を使っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/09 09:12