Newer
Older
22a5021_NWP / src / j5 / ChatServer.java
@Motoki Miura Motoki Miura on 22 Sep 2020 3 KB first commit for NWP exp
package j5;

// チャットサーバChatServer.java
// このプログラムは,チャットのサーバプログラムです
// 使い方java ChatServer [ポート番号]
// ポート番号を省略すると,ポート番号6000 番を使います
// 起動の例java ChatServer
// 終了にはコントロールC を入力してください

// このサーバへの接続にはTelnet.javaなどを使ってください
// 接続を止めたいときには,行頭でquitと入力してください

// ライブラリの利用
import java.io.*;
import java.net.*;
import java.util.*;

// ChatServerクラス
public class ChatServer {
    static final int DEFAULT_PORT = 6000;//ポート番号省略時は6000 番を使います
    static ServerSocket serverSocket;
    static ArrayList<Socket> connections;

    // sendAllメソッド
    // 各クライアントにメッセージを送ります
    public static void sendAll(String t){
	if (connections != null){// コネクションがあれば実行します
	    for (Socket s : connections) {
		try {
		    PrintWriter pw = new PrintWriter(s.getOutputStream());
		    pw.println(t);
		    pw.flush();
		}catch (IOException ex){}
	    }
	}
	System.out.println(t);
    }

    // addConnectionメソッド
    // クライアントとの接続を追加します
    public static void addConnection(Socket s){
	if (connections == null){
	    connections = new ArrayList<Socket>();
	}
	connections.add(s);
    }

    // deleteConnectionメソッド
    // あるクライアントとのコネクションを削除します
    public static void deleteConnection(Socket s){
	if (connections != null){
	    connections.remove(s);
	}
    }

    // mainメソッド
    // サーバソケットを作り,クライアントからの接続を待ち受けます
    public static void main(String[] arg){
	int port = DEFAULT_PORT ;
	if (arg.length > 0) port = Integer.parseInt(arg[0]) ;
	try {
	    serverSocket = new ServerSocket(port);
	}catch (IOException e){
	    System.err.println(e);
	    System.exit(1);
	}
	while (true) {
	    try {
		Socket cs = serverSocket.accept();
		addConnection(cs);
		Thread ct = new Thread(new ClientProc(cs));
		ct.start();
	    }catch (IOException e){
		System.err.println(e);
	    }
	}
    }
}

// ClientProcクラス
// クライアント処理用スレッドのひな形です
class ClientProc implements Runnable {
    Socket s;
    BufferedReader in;
    PrintWriter out;
    String name = null;
    ChatServer server = null ;

    //コンストラクタ
    public ClientProc(Socket s) throws IOException {
	this.s = s;
	in = new BufferedReader(new InputStreamReader(s.getInputStream()));
	out = new PrintWriter(s.getOutputStream());
    }

    // スレッドの本体
    // 各クライアントとの接続処理を行います
    public void run(){
	try {
	    while (name == null){
		out.print("Input your name? : ");
		out.flush();
		name = in.readLine();
	    }
	    ChatServer.sendAll(name + " joined.");
	    String line = in.readLine();
	    while (!"quit".equals(line)){
		if (line != null) ChatServer.sendAll(name + "> " +line);
		line = in.readLine();
	    }
	    ChatServer.sendAll(name + " disconnected.");
	    ChatServer.deleteConnection(s);
	    s.close();
	}catch (IOException e){
	    try {
		s.close();
	    }catch (IOException e2){}
	}
    }
}