socket 학습 3 (Socket 에서 의 실시 간 교류)

4546 단어 socket
네트워크 의 위대 함 중 하 나 는 정보 공유 이다. 서버 는 모든 클 라 이언 트 에 게 자발적으로 소식 을 방송 할 수 있 고 클 라 이언 트 도 다른 클 라 이언 트 에 게 소식 을 발표 할 수 있다.실시 간 으로 메 시 지 를 전달 할 수 있 는 프로그램 을 개발 하 는 방법 을 살 펴 보 자.설계 원리: 서버 에서 클 라 이언 트 의 연결 요청 을 받 아들 이 고 이 연결 을 처리 하 는 라인 을 시작 합 니 다. 라인 은 끊임없이 클 라 이언 트 의 입력 을 읽 고 입력 을 대기 열 에 넣 고 처 리 를 기다 리 고 있 습 니 다.스 레 드 가 시작 되 는 동시에 스 레 드 를 대기 열 에 추가 하여 필요 할 때 위치 추적 과 꺼 낼 수 있 도록 합 니 다.import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.*;

public class Server extends ServerSocket{
	
	private static ArrayList User_List = new ArrayList();
	private static ArrayList Threader = new ArrayList();
	private static LinkedList Message_Array = new LinkedList();
	private static int Thread_Counter = 0;
	private static boolean isClear = true;
	protected static final int SERVER_PORT = 10000;
	protected FileOutputStream LOG_FILE = new FileOutputStream("d:/connect.log", true);
	
	public Server() throws FileNotFoundException, IOException{
		super(SERVER_PORT);
		new Broadcast();
		//append connection log
		Calendar now = Calendar.getInstance();
		String str = "[" + now.getTime().toString() + "] Accepted a connection1512";
		byte[] tmp = str.getBytes();
		LOG_FILE.write(tmp);
		try{
			while (true){
				Socket socket = accept();
				new CreateServerThread(socket);
			}
		}finally{
			close();
		}
	}
	
	public static void main(String[] args) throws IOException{
		new Server();
	}
	
	
	//--- Broadcast
	class Broadcast extends Thread{
		
		public Broadcast(){
			start();
		}
		
		public void run(){
			while (true){
				if (!isClear){
					String tmp = (String)Message_Array.getFirst();
					for (int i = 0; i < Threader.size(); i++){
						CreateServerThread client = (CreateServerThread)Threader.get(i);
						client.sendMessage(tmp);
					}
					Message_Array.removeFirst();
					isClear = Message_Array.size() > 0 ? false : true;
				}
			}
		}
	}

	//--- CreateServerThread
	class CreateServerThread extends Thread{
		
		private Socket client;
		private BufferedReader in;
		private PrintWriter out;
		private String Username;
		
		public CreateServerThread(Socket s) throws IOException{
			client = s;
			in = new BufferedReader(new InputStreamReader(client.getInputStream()));
			out = new PrintWriter(client.getOutputStream(), true);
			out.println("--- Welcome to this chatroom ---");
			out.println("Input your nickname:");
			start();
		}
		
		public void sendMessage(String msg){
			out.println(msg);
		}

		public void run(){
			try{
				int flag = 0;
				Thread_Counter++;
				String line = in.readLine();
				while (!line.equals("bye")){
					if (line.equals("l")){
						out.println(listOnlineUsers());
						line = in.readLine();
						continue;
					}
					if (flag++ == 0){
						Username = line;
						User_List.add(Username);
						out.println(listOnlineUsers());
						Threader.add(this);
						pushMessage("[< " + Username + " come on in >]");
					}else{
						pushMessage("<" + Username + ">" + line);
					}
					line = in.readLine();
				}
				out.println("--- See you, bye! ---");
				client.close();
			}catch (IOException e){
				e.printStackTrace();
			}finally{
				try{
					client.close();
				}catch (IOException e){
					e.printStackTrace();
				}
				Thread_Counter--;
				Threader.remove(this);
				User_List.remove(Username);
				pushMessage("[< " + Username + " left>]");
			}
		}
		
		private String listOnlineUsers(){
			String s ="-+- Online list -+-1512";
			for (int i = 0; i < User_List.size(); i++){
				s += "[" + User_List.get(i) + "]1512";
			}
			s += "-+---------------------+-";
			return s;
		}
		
		private void pushMessage(String msg){
			Message_Array.addLast(msg);
			isClear = false;
		}
	}
}
 

좋은 웹페이지 즐겨찾기