Socketマルチスレッド練習
このプログラムは今から見ればまるで弱爆だ...参考にならない
socket、マルチスレッド関連の練習を書きます.
古典的なクライアントサーバチャットの例です
書き方を見ても,どれが正しいのかわからない
サーバ側で要求リストが維持され、各クライアントの要求サーバ側に新たにThreadが開始される.
クライアントが終了するとthreadがlistから除去されます
いつ削除すればいいのか、どのように削除すればいいのか...いいえ
皆さん、教えてください.ありがとうございます.
socket、マルチスレッド関連の練習を書きます.
古典的なクライアントサーバチャットの例です
書き方を見ても,どれが正しいのかわからない
サーバ側で要求リストが維持され、各クライアントの要求サーバ側に新たにThreadが開始される.
クライアントが終了するとthreadがlistから除去されます
いつ削除すればいいのか、どのように削除すればいいのか...いいえ
皆さん、教えてください.ありがとうございます.
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ChatServer {
List<Client> clients = new ArrayList<Client>();
public static void main(String[] args) {
new ChatServer().start();
}
public void start() {
boolean started = false;
ServerSocket ss = null;
try {
ss = new ServerSocket(8888);
started = true;
} catch (BindException e) {
System.out.println(" , !");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
try {
while (started) {
Socket s = ss.accept();
Client c = new Client(s);
clients.add(c);
System.out.println("a client connected!");
new Thread(c).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* <br>
*/
private class Client implements Runnable {
Socket socket = null;
DataInputStream dis = null;
DataOutputStream dos = null;
boolean connected = false;
Client(Socket s) {
try {
this.socket = s;
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while (connected) {
try {
Iterator<Client> it = clients.iterator();
String msg = dis.readUTF();
while (it.hasNext()) {
Client c = it.next();
c.send(msg);
}
} catch (EOFException eof) {
connected = false;
// client ,
//
// Collection remove ,
// java.util.ConcurrentModificationException
// iterator remove
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void send(String str) throws IOException {
dos.writeUTF(str);
}
}
}