Server (단일 채팅 서버)

hovi·2023년 5월 30일
0

JAVA

목록 보기
32/36

서버용 TCP 소켓 프로그래밍 순서

  1. 서버의 포트 번호를 정함
  2. 서버용 소켓 객체 생성 (ServerSocket)
  3. 클라이언트 쪽에서 접속 요청이 오길 기다림 (accept)
  4. 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체 생성
  5. 연결된 클라이언트와 입출력 스트림 생성
  6. 스트림을 통해 읽고 쓰기
  7. 통신 종료

ReceiveThread

클라이언트에서 온 데이터를 수신하는 스레드이다.

마찬가지로 별도의 Thread를 만들기위해 Thread클래스를 상속받아 run()메서드를 구현한다.

socket.getIntputStream()을 사용해서 클라이언트에게 데이터를 수신할 수 있다.

package 소켓서버;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;

public class ReceiveThread extends Thread {
    private final Socket socket;

    public ReceiveThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            DataInputStream tmpbuf = new DataInputStream(socket.getInputStream());
            String receiveString;
            while (true) {
                receiveString = tmpbuf.readUTF();
                System.out.println("상대방 : " + receiveString);
            }
        } catch (SocketException e1) {
            System.out.println("상대방 연결이 종료되었습니다.");
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }

}

SendThread

서버에서 클라이언트로 데이터를 전송하는 스레드이다.

별도의 Thread를 만들기위해 Thread클래스를 상속받아 run()메서드를 구현한다.

socket.getOutputStream()을 사용해서 클라이언트에게 데이터를 전송할 수 있다.

package 소켓서버;

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

public class SendThread extends Thread {
    private final Socket socket;
    private Scanner scanner = new Scanner(System.in);

    public SendThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            DataOutputStream sendWriter = new DataOutputStream(socket.getOutputStream());
            String sendString;
            while(true){
                sendString = scanner.nextLine();
                sendWriter.writeUTF(sendString);
                sendWriter.flush();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

SocketServer

클라이언트의 연결 요청을 기다리면서 연결 수락을 담당하는 클래스

package 소켓서버;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) throws IOException {
        int port = 8888;
        ServerSocket socketServer = new ServerSocket(port);
        while(true) {
            Socket sock = socketServer.accept();
            System.out.println("ip : " + sock.getInetAddress() + " 와 연결되었습니다.");
            ReceiveThread receiveThread = new ReceiveThread(sock);
            receiveThread.start();
            SendThread sendThead = new SendThread(sock);
            sendThead.start();
        }
    }
}
profile
풀스택 예비 개발자

0개의 댓글