1. 채팅
1:1 채팅
Client, SenderThread, ReceiverThread 하나
Server, SenderThread, ReceiverThread 하나
각 각 3개의 클래스로 구성해야 됨
여기에서 SenderThread, ReceiverThread은 공통으로 사용되기 때문에 하나만 올림.
클라이언트
package chat;
import java.net.Socket;
public class Client {
// Client 클래스(1:1채팅이기에 Clinet, Server 각각 한명씩 실행해야 한다.)
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("58.224.18.142", 9001); // 본인의 PC IP(cmd - ipconfig로 확인 가능)
// 연결할 서버쪽의 아이피를 작성해줘야 한다.
Thread thread1 = new SenderThread(socket);
Thread thread2 = new ReceiverThread(socket);
thread1.start();
thread2.start();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
서버
package chat;
import java.net.ServerSocket;
import java.net.Socket;
class Server {
// Client 클래스(1:1채팅이기에 Clinet, Server 각각 한명씩 실행해야 한다.)
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(9001);
socket = serverSocket.accept();
Thread thread1 = new SenderThread(socket);
Thread thread2 = new ReceiverThread(socket);
thread1.start();
thread2.start();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
serverSocket.close();
} catch (Exception ignored) {
}
}
}
}
공통 (SenderThread,ReceiverThread)
package chat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class SenderThread extends Thread {
Socket socket;
SenderThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
while (true) {
String str = reader.readLine();
if (str.equals("bye")) {
break;
}
writer.println(str);
writer.flush();
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
socket.close();
} catch (Exception ignored) {
}
}
}
}
package chat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReceiverThread extends Thread {
Socket socket;
ReceiverThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String str = reader.readLine();
if (str == null) {
break;
}
System.out.println("수신>" + str);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
2. 여러 사용자 채팅 프로그램
서버
package multichat;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerChat {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(9002);
while (true) {
Socket socket = serverSocket.accept();
Thread thread = new PerClientThread(socket);
thread.start();
}
} catch (Exception e) {
System.out.println();
}
}
}
서버 스레드(클라이언트 접속시 마다 생성)
package multichat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PerClientThread extends Thread {
static List<PrintWriter> list = Collections.synchronizedList(new ArrayList<PrintWriter>());
Socket socket;
PrintWriter writer;
PerClientThread(Socket socket) {
this.socket = socket;
try {
writer = new PrintWriter(socket.getOutputStream());
list.add(writer);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void run() {
String name = null;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
name = reader.readLine();
sendAll("#" + name + "가 왔단다 환영해줘라");
while (true) {
String str = reader.readLine();
if (str == null) {
break;
}
sendAll(name + ">" + str);
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
list.remove(writer);
sendAll("#" + name + "가 먼지속으로 사라짐");
try {
socket.close();
} catch (Exception ignored) {
}
}
}
private void sendAll(String str) {
for (PrintWriter writer : list) {
writer.println(str);
writer.flush();
}
}
}
클라이언트
package multichat;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("usager : java Client <user-name>");
return;
}
try {
Socket socket = new Socket("58.224.18.142", 9002);
Thread thread1 = new SenderThread(socket, args[0]);
Thread thread2 = new ReceiverThread(socket);
thread1.start();
thread2.start();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
package multichat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class SenderThread extends Thread {
Socket socket;
String name;
SenderThread(Socket socket, String name) {
this.socket = socket;
this.name = name;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println(name);
writer.flush();
while (true) {
String str = reader.readLine();
if (str.equals("bye")) {
break;
}
writer.println(str);
writer.flush();
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
socket.close();
} catch (Exception ignored) {
}
}
}
}
package multichat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ReceiverThread extends Thread {
Socket socket;
ReceiverThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String str = reader.readLine();
if (str == null) {
break;
}
System.out.println(str);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
'■ JAVA > Study' 카테고리의 다른 글
[JAVA] 스레드 - 3.Runnable인터페이스를 사용해서 만드는 방법(implements Runnable)★ (0) | 2020.04.29 |
---|---|
[JAVA] 스레드 - 1.설명, 2.상속해서 만드는 방법(extend Thread)★ (0) | 2020.04.29 |
[JAVA] StringBuffer(스트링버퍼) (0) | 2020.04.22 |
[JAVA] 예외 처리(Exception 처리) - 4.사용자 정의 예외 (0) | 2020.04.22 |
[JAVA] 예외 처리(Exception 처리) - 3.리소스 닫기, 예외 넘기기(Throw) (0) | 2020.04.21 |