Socket & Thread를 활용하여 채팅 프로그램 만들기
소켓과 스레드를 활용하여 java로 만든 console에서만 출력되는 채팅프로그램 입니다.
기본 문법만 사용하여 만든것으로 Socket과 Tread 사용해보기 좋습니다.
서버출력
클라이언트 출력
ChatServer
package ChattingMany;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ChatServer {
public static List<Handler> clients = new ArrayList<>();;
public void ServerRun() {
// 서버 소켓
ServerSocket serverSocket;
InputStream inputStream;
InputStreamReader reader;
BufferedReader br;
OutputStream outputStream;
PrintStream printStream;
Scanner sc;
try {
// 80번 포트로 서버 실행
serverSocket = new ServerSocket(80);
int i=1;
// 클라이언트가 접속하면 접속을 허용하는 코드
// clientSocket에 클라이언트와의 연결 정보 저장
while(true){
Socket clientSocket = serverSocket.accept();
// 클라이언트의 이름 읽기
BufferedReader readerName = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String name = readerName.readLine();
Handler chatHandler = new Handler(clientSocket, i, name);
clients.add(chatHandler);
chatHandler.start();
System.out.println("New client connected: " + clientSocket.getInetAddress().getHostAddress());
i++;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//메시지를 보낸 client를 빼고 다른 client에게 전송
public static void broadcastMessage(String message, int idx) {
for(int i=0; i<clients.size(); i++){
if(clients.get(i).idx != idx)
clients.get(i).sendMessage(message, idx);
}
}
public class Handler extends Thread{
private Socket clientSocket;
private InputStream inputStream;
private InputStreamReader reader;
private BufferedReader br;
private OutputStream outputStream;
private PrintStream printStream;
private Scanner sc;
private Integer idx;
private String name;
Handler(Socket socket, int idx, String name) {
this.clientSocket = socket;
this.idx = idx;
this.name = name;
}
public void run() {
try {
outputStream = clientSocket.getOutputStream();
printStream = new PrintStream(outputStream);
inputStream = clientSocket.getInputStream();
reader = new InputStreamReader(inputStream, "UTF-8");
br = new BufferedReader(reader);
sc = new Scanner(System.in);
printStream = new PrintStream(clientSocket.getOutputStream(), true);
//client의 전체 채팅내용 저장용
ReadThreadServer readThread = new ReadThreadServer(br, idx);
readThread.start();
//서버는 작성할 필요가 없음
//WriteThread writeThread = new WriteThread(printStream,sc,name);
//writeThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessage(String message, int idx){
printStream.println(message);
}
}
public static void main(String[] args) {
ChatServer chatServer = new ChatServer();
chatServer.ServerRun();
}
}
ChatClient
package ChattingMany;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class ChatClient1 {
public static void main(String[] args) {
Socket clientSocket;
InputStream inputStream;
InputStreamReader reader;
BufferedReader br;
OutputStream outputStream;
PrintStream printStream;
Scanner sc;
String name = "배부른춘식이";
try {
clientSocket = new Socket("192.168.0.19", 80);
outputStream = clientSocket.getOutputStream();
printStream = new PrintStream(outputStream);
inputStream = clientSocket.getInputStream();
reader = new InputStreamReader(inputStream, "UTF-8");
br = new BufferedReader(reader);
sc = new Scanner(System.in);
// 서버에 이름을 전송
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.println(name);
ReadThreadClient readThread = new ReadThreadClient(br);
readThread.start();
WriteThread writeThread = new WriteThread(printStream,sc,name);
writeThread.start();
System.out.print("채팅이 시작되었습니다\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
전체코드 깃허브
https://github.com/winter0123/basic-study/tree/main/src/main/java/ChattingMany
basic-study/src/main/java/ChattingMany at main · winter0123/basic-study
Contribute to winter0123/basic-study development by creating an account on GitHub.
github.com
'JAVA > 기타' 카테고리의 다른 글
[JAVA] 카카오페이 결제 API 포트원 연동 - kakao pay (0) | 2024.07.22 |
---|---|
[java] 카카오톡 로그인 연결하기 (2) | 2024.06.27 |
[java] MVC - Spring Boot 어노테이션 정리 (0) | 2024.06.21 |
[java] 스프링(Spring) , 스프링 부트(Spring Boot)란? (0) | 2024.06.20 |
[ java] Socket & Tread를 이용하여 1대1 채팅 프로그램 만들기 (0) | 2024.05.29 |