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コードに移動しないと仮定します。
ChatClientThreadのコードがですか? –
参考のために、ここには働く[例](http://stackoverflow.com/a/3245805/230513)があります。 – trashgod
また、コンストラクタからスレッドを開始することは悪い習慣です。クライアントを構築してから起動します。しかし、私はなぜここに別々のスレッドが必要なのか分かりません。メインスレッドですべてをやってみませんか?そして、あなたはThread.stop()で大きな廃止予定の警告を見たことがありますか? –