지난 시간 서버를 이용해 채팅하는 프로그래밍을 만들어봤다.

오늘은 이를 응용해 멀티채팅을 만들어 볼 것이다.

 

서버 코드 :

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;

public class TcpIpMultichatServer {
	// 사용자의 이름과 클라이언트와 연결된 소켁 정보 관리 HashMap 사용

	HashMap clients;

	TcpIpMultichatServer() {
		clients = new HashMap();
		// HashMap에 동기화를 걸어 스레드가 동시에 접근하지 못하도록 한다
		// 기존 HashMap을 동기화처리가 안되어 있음. 필요할 때 직접 동기화 처리를 하도록
		Collections.synchronizedMap(clients); // 컬렉션의 동기화

	}

	// 서브소켓 생성, 클라이언트와 연결
	public void start() {

		ServerSocket serverSocket = null;
		Socket socket = null;

		try {

			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 시작되었습니다.");

			// 서버는 죽으면 안된다
			// 무한하게 클라이언트의 요청을 받기
			while (true) {
				socket = serverSocket.accept();
				System.out.println("[" + socket.getInetAddress() + ":" + socket.getPort() + "]" + "에서 접속했습니다.");

				// 현재 접속된 클라이언트의 정보를 넘긴다
				ServerReceiver thread = new ServerReceiver(socket);
				thread.start();
			}

			// 클라이언트의 정보가 들어오면 HashMap에 저장해야 한다

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		// 소켓을 여러 개 만들 수 있다면 멀티 가능
		// 콜렉션(ArrayList)을 이용해 소켓정보를 저장

		// command + option + up / down 한줄 복사
		// command + F11 샐행

		new TcpIpMultichatServer().start();

	}

	class ServerReceiver extends Thread {

		Socket socket;
		DataInputStream in;
		DataOutputStream out;

		public ServerReceiver(Socket socket) {
			this.socket = socket;

			try {
				in = new DataInputStream(socket.getInputStream());
				out = new DataOutputStream(socket.getOutputStream());
			} catch (IOException e) {

			}
		}

		void sendToAll(String msg) { // 현재 접속한 모든 클라이언트에게 메세지 전달
			Iterator it = clients.keySet().iterator();

			while (it.hasNext()) {
				try {
					DataOutputStream out = (DataOutputStream) clients.get(it.next());
					out.writeUTF(msg);
				} catch (Exception e) {

				}
			}
		}

		// 데이터를 받아서 연결된 클라이언트에게 보내는 작업
		// 클라이언트의 이름을 받아 그 사람이 접속했다는 것을 이름으로 알려주기
		@Override
		public void run() {
			String name = "";

			try {

				name = in.readUTF();
				sendToAll("#" + name + "님이 들어오셨습니다.");

				clients.put(name, out);
				System.out.println("현재 서버접속자 수는 " + clients.size() + "입니다.");

				while (in != null) {
					sendToAll(in.readUTF());
				}

			} catch (IOException e) {

				// 대화하다 클라이언트가 나갈 때
				// 클라이언트 삭제
			} finally {
				sendToAll("#" + name + "님이 나가셨습니다.");
				clients.remove(name);
				System.out.println("[" + socket.getInetAddress() + ":" + socket.getPort() + "]" + "에서 접속을 종료하였습니다.");
				System.out.println("현재 서버접속자 수는 " + clients.size() + "입니다.");
			}
		}

	}

}

 

클라이언트 코드 :

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TcpIpMultichatClient {

	public static void main(String[] args) {
		// 접속할 서버에 대한 정보 세팅

		// 서버의 정보를 문자열로 처리
		String serverIP = "192.168.105.80";

		Scanner sc = new Scanner(System.in);
		System.out.println("대화명 입력 >>");
		String name = sc.next();

		try {
			Socket socket = new Socket(serverIP, 7777);
			System.out.println("서버에 연결되었습니다");

			// 메세지 전송
			Thread sender = new Thread(new ClientSender(socket, name));

			// 메세지 수신
			Thread receiver = new Thread(new clientReceiver(socket));

			sender.start();
			receiver.start();

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	} // main end

	static class ClientSender extends Thread {

		Socket socket;
		DataOutputStream out;
		String name;

		public ClientSender(Socket socket, String name) {
			this.socket = socket;
			this.name = name;

			try {
				out = new DataOutputStream(socket.getOutputStream());
			} catch (Exception e) {

			}

		}

		// 문자메세지 입력
		@Override
		public void run() {
			Scanner sc = new Scanner(System.in);

			try {
				if (out != null) {
					out.writeUTF(name);
				}

				while (out != null) {
					out.writeUTF("[" + name + "]" + sc.nextLine());
				}

			} catch (Exception e) {

			}
		}

	}

	// 문자메세지 받기
	static class clientReceiver extends Thread {

		Socket socket;
		DataInputStream in;
		String name;

		public clientReceiver(Socket socket) {
			this.socket = socket;

			try {
				in = new DataInputStream(socket.getInputStream());
			} catch (Exception e) {

			}

		}

		@Override
		public void run() {
			while (in != null) {

				try {
					System.out.println(in.readUTF());
				} catch (IOException e) {
					e.printStackTrace();
				}

			}
		}

	}

}

 

 

오라클 DB

scott 계정까지 생성완료.

 

table = 객체 (어떤 정보를 표현하고자 하는 대상) → 속성과 기능

프로그래밍에서 객체라는 말이 나오면 최우선적으로 속성과 기능을 떠올릴 것.

데이터베이스에서는 속성을 떠올릴 것.

이 속성을 표현한 것이 컬럼, 여러개의 컬럼이 모여 한 객체의 정보를 나타낸다

 

컬럼 가로 한 줄을 ‘레코드’라고 한다 = 튜플이라고도 함. 

컬럼명1      
       
       

 

테이블이 불러와지지 않는 맥 동료들도 많았는데 난 다행히 불러와졌다.

주말 내 삽질해서 얻어낸 노하우를 다른 맥 동료들에게도 알려 무사히 수업에 따라감..

+ Recent posts