지난 시간 서버를 이용해 채팅하는 프로그래밍을 만들어봤다.
오늘은 이를 응용해 멀티채팅을 만들어 볼 것이다.
서버 코드 :
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 | |||
테이블이 불러와지지 않는 맥 동료들도 많았는데 난 다행히 불러와졌다.
주말 내 삽질해서 얻어낸 노하우를 다른 맥 동료들에게도 알려 무사히 수업에 따라감..
'2024_UIUX 국비 TIL' 카테고리의 다른 글
UIUX _국비과정 0605 [오라클DB SQL 쿼리문] (0) | 2024.06.24 |
---|---|
UIUX _국비과정 0604 [오라클DB SQL 쿼리문] (0) | 2024.06.24 |
UIUX _국비과정 0531 [문자기반 보조 스트림, 파일클래스, 네트워크] (0) | 2024.06.24 |
UIUX_국비과정 0530 [🍀 스트림] (0) | 2024.06.24 |
UIUX_국비과정 0529 [람다와 스트림] (0) | 2024.06.24 |