2012-02-05 15 views
2

Javaでチャットサーバークライアントプログラムを作成しようとしています。しかし、問題は、コード内のあるポイントの後に実行を停止し、私の人生のために、私は理由を理解できないということです。私はここにコードをつけています。私はマルチスレッドとソケットプログラミングに新しいので、エラーはかなり明白ですが、私は完全にそれを見逃しています。コード行の後にコード(java、multithreading)の実行が停止する

public class ChatClient implements Runnable 
{ private Socket socket    = null; 
private Thread thread1    = null; 
private ObjectOutputStream streamOut = null; 
private ChatClientThread client = null; 
private Message sendMsg = null; 
private String username = null; 
private DataInputStream console = null; 
private Scanner s = new Scanner(System.in); 
String text; 

public ChatClient(String serverName, int serverPort) 
{ System.out.println("Establishing connection. Please wait ..."); 
    try 
    { socket = new Socket(serverName, serverPort); 
    System.out.println("Connected: " + socket); 
    System.out.println("Enter your username:"); 
    username = s.nextLine(); 
    start(); 
    } 
    catch(UnknownHostException uhe) 
    { System.out.println("Host unknown: " + uhe.getMessage()); } 
    catch(IOException ioe) 
    { System.out.println("Unexpected exception: " + ioe.getMessage()); } 
} 

public void run() 
{ while (thread1 != null) 
    { try 
    { sendMsg = new Message(); 
     sendMsg.setMsg(s.nextLine()); 
     System.out.println(sendMsg.getMsg()+ " check"); 
     streamOut.writeObject(sendMsg); 
     streamOut.flush(); 
    } 
    catch(IOException ioe) 
    { System.out.println("Sending error: " + ioe.getMessage()); 
     stop(); 
    } 
    } 
} 

    public void handle(String user, Message msg) 
{ System.out.println("1"); 
    if (msg.getMsg().equals(".bye")) 
    { System.out.println("Good bye. Press RETURN to exit ..."); 
    stop(); 
    } 
    else 
    System.out.println(msg.getMsg()); 
    System.out.println("Msg received"); 
} 

    public void start() throws IOException 
{ 

    //console = new DataInputStream(System.in); 
    System.out.println("1"); 
    streamOut = new ObjectOutputStream(socket.getOutputStream()); 
    System.out.println("3"); 

    if (thread1 == null) 
    { client = new ChatClientThread(this, socket, username); 
    System.out.println("Started new ChatClientThread"); 
    thread1 = new Thread(this);     
    thread1.start(); 
    } 
    else 
     System.out.println("This code is stupid."); 
    } 

    public void stop() 
{ if (thread1 != null) 
    { thread1.stop(); 
     thread1 = null; 
    } 
    try 
    { if (console != null) console.close(); 
    if (streamOut != null) streamOut.close(); 
    if (socket != null) socket.close(); 
    } 
    catch(IOException ioe) 
    { System.out.println("Error closing ..."); } 
    //client.close(); 
    client.stop(); 
} 

    public static void main(String args[]) 

{ ChatClient client = null; 
    //if (args.length != 2) 
    // System.out.println("Usage: java ChatClient host port"); 
    //else 
    client = new ChatClient("localhost", 2008); 
} 
} 

だから、それが働いている方法は、それがメイン関数から始まり、あるコンストラクタに行くには、()を開始するためのユーザー名とすべてのものと進行になります。 1 & 3を印刷するので、私は開始作品を前提としていますが、それ以降はテキストを入力し続けますが、次のポイントに進むことはありません( "Started New ChatClientThread"という文字が印刷されないので分かります)。 ご協力いただければ幸いです。私はこのコードを何時間も作業してきましたが、なぜそこで実行が停止するのか分かりません。

public ChatClientThread(ChatClient _client, Socket _socket, String uname) 
    { System.out.println("Constructor started"); 
    client = _client; 
    socket = _socket; 
    username = uname; 
    System.out.println("1"); 
    open(); 
    System.out.println("2"); 
    start(); 
    System.out.println("3"); 

    } 

それは1を出力します。UPDATE

は、私は今、それが実際にChatClientThreadのコンストラクタを実行しないことを知っている

public void start() throws IOException 
    {  

    //console = new DataInputStream(System.in); 
    System.out.println("1"); 
    streamOut = new ObjectOutputStream(socket.getOutputStream()); 
    System.out.println("3"); 

    if (thread1 == null) 
    { 
     System.out.println("Started new ChatClientThread"); 
     client = new ChatClientThread(this, socket, username); 
     System.out.println("Started new ChatClientThread"); 
     thread1 = new Thread(this);     
     thread1.start(); 
    } 
    else 
     System.out.println("This code is stupid."); 
    } 

ChatClient.startコードを編集しましたChatClientThread.openに行きます:

public void open() 
    { try 
    {  streamIn = new ObjectInputStream(socket.getInputStream()); 

    } 
    catch(IOException ioe) 
    { System.out.println("Error getting input stream: " + ioe); 
    client.stop(); 
    } 
    } 

しかし、ここで再びスタックされます。 2を印刷するのではなく、ChatClientThread.startコードに移動しないと仮定します。

+2

ChatClientThreadのコードがですか? –

+0

参考のために、ここには働く[例](http://stackoverflow.com/a/3245805/230513)があります。 – trashgod

+2

また、コンストラクタからスレッドを開始することは悪い習慣です。クライアントを構築してから起動します。しかし、私はなぜここに別々のスレッドが必要なのか分かりません。メインスレッドですべてをやってみませんか?そして、あなたはThread.stop()で大きな廃止予定の警告を見たことがありますか? –

答えて

1

start()メソッドをオーバーライドしました。 「start()」メソッドを上書きしないでください。 start()メソッドをオーバーライドする場合は、メソッドの最後にsuper.start()を呼び出すことを忘れないでください。

start()メソッドは、run()を開始します。

詳細はthis questionthis answerを参照してください。

関連する問題