前提・実現したいこと
現在、Javaでソケット通信を行っていました。
発生している問題・エラーメッセージ
エラーメッセージは出ていない 2度同じサーバーにアクセスしたら実行結果が出ない
該当のソースコード
Java
1package org.jyl.base; 2 3public interface SocketUtil 4{ 5 public void down(); 6 7 public boolean isConnect(); 8 9 public String receive() throws JylException; 10 11 public boolean send( String message ); 12 13 public boolean setUp(); 14}
package org.jyl.base; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class JylClient implements Runnable, SocketUtil { private boolean connect = false; private Socket sc = null; private BufferedReader br = null; private PrintWriter pw = null; public JylClient( final String HOST, final int PORT ) throws JylException { try{ sc = new Socket( HOST, PORT ); }catch( IOException ie ){ try{ if( sc != null ) sc.close(); }catch( IOException ie2 ){ throw new JylException( ie2 ); } } } @Override public void down() { if( br != null ) br = null; if( pw != null ) pw = null; if( sc != null ) sc = null; connect = false; } @Override public boolean isConnect() { return connect; } @Override public String receive() throws JylException { if( br == null || sc == null ) return ""; String str = ""; try{ str = br.readLine(); }catch( IOException ie ){ throw new JylException( ie ); } return str; } @Override public boolean send( String message ) { if( pw == null || sc == null ) return false; pw.println( message ); pw.flush(); return true; } @Override public boolean setUp() { try{ // 実装の都合上バッファをクリアのみ br = new BufferedReader( new InputStreamReader( sc.getInputStream() ) ); pw = new PrintWriter( new BufferedWriter( new OutputStreamWriter( sc.getOutputStream() ) ) ); Thread th = new Thread( this ); th.start(); connect = true; }catch( IOException ie ){ connect = false; } return isConnect(); } @Override public void run(){} }
package org.jyl.base; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class JylServer implements Runnable, SocketUtil { private boolean connect = false; // 接続できたか isConnect() private ServerSocket ss = null; private Socket sc = null; private BufferedReader br = null; // クライアントからのデータを受け取るバッファ private PrintWriter pw = null; // サーバーから送るデータのバッファ public JylServer( final int PORT ) throws JylException { try{ ss = new ServerSocket( PORT ); }catch( IOException ie ){ try{ if( ss != null ) ss.close(); }catch( IOException ie2 ){ throw new JylException( ie2 ); } } } @Override public void down() { // この関数実行後に送ったりしようとするとエラーになるようにしている if( br != null ) br = null; if( pw != null ) pw = null; if( sc != null ) sc = null; if( ss != null ) ss = null; connect = false; } @Override public boolean isConnect() { return connect; } @Override public String receive() throws JylException { if( br == null || sc == null ) return ""; String str = ""; try{ str = br.readLine(); }catch( IOException ie ){ throw new JylException( ie ); } return str; } @Override public boolean send( String message ) { if( pw == null || sc == null ) return false; pw.println( message ); pw.flush(); return true; } @Override public boolean setUp() { while( !isConnect() ){ try{ sc = ss.accept(); // 接続されるまで待つ // 読み込み、書き込みバッファーを用意 br = new BufferedReader( new InputStreamReader( sc.getInputStream() ) ); pw = new PrintWriter( new BufferedWriter( new OutputStreamWriter( sc.getOutputStream() ) ) ); Thread th = new Thread( this ); th.start(); connect = true; }catch( IOException ie ){ connect = false; } } return isConnect(); } @Override public void run(){} }
テストクラス
package org.jyl.base.test; import org.jyl.base.JylClient; import org.jyl.base.JylException; public class JylClientTest extends JylClient { public static final String HOST = "localhost"; public static final int PORT = 10000; public static void main( String[] args ) { try{ new JylClientTest(); }catch( JylException e ){ e.printStackTrace(); } } public JylClientTest() throws JylException { super( HOST, PORT ); System.out.println( "接続を開始します..." ); setUp(); } @Override public void run() { try{ while( true ){ System.out.println( receive() ); } }catch( JylException e ){ e.printStackTrace(); } } }
package org.jyl.base.test; import org.jyl.base.JylException; import org.jyl.base.JylServer; public class JylServerTest extends JylServer { public static final int PORT = 10000; public static void main( String[] args ) { try{ new JylServerTest(); }catch( JylException e ){ e.printStackTrace(); } } public JylServerTest() throws JylException { super( PORT ); System.out.println( "接続を開始します..." ); setUp(); } @Override public void run() { while( true ) send( "Hello Server!" ); } }
試したこと
ソケット通信について調べてみた
デバッグ用メッセージを設置して実行してみた
Findbugs(プラグイン)でバグ検索をしてみた
サーバーを初期化しなければいけない?
補足情報(FW/ツールのバージョンなど)
eclipseの3.8を使用しています。
OSはlinux系統です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。