Lonely Snowman
 

TCP 채팅기능 구현 예제

간단한 1:1 채팅기능을 구현해보았다

이번에도 내 컴퓨터로 IP설정해서 테스트해봤다

 

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

public class TcpChatServer {
   public static void main(String[] args) {
      
      ServerSocket server = null;
      Socket socket = null;
      
      try {
         server = new ServerSocket(7777);
         System.out.println("채팅서버 대기 중...");
         socket = server.accept();
         
         System.out.println("클라이언트와 연결되었습니다.");
         
         Sender sender = new Sender(socket);
         sender.start();
         
         Receiver recv = new Receiver(socket);
         recv.start();

      } catch (IOException ex) {
         ex.printStackTrace();
      }
   }
}

이번에는 try-catch문으로 예외처리해주었다

채팅을 보내고 받는 부분은 스레드로 처리해주었다

 

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

public class TcpChatClient {
   public static void main(String[] args) throws IOException {
      
      Socket socket = new Socket("localhost", 7777);
      
      System.out.println("챗서버에 연결되었습니다.");
      
      Sender send = new Sender(socket);
      send.start();
      
      Receiver recv = new Receiver(socket);
      recv.start();
      
      // socket.close();
   }
}

클라이언트도 채팅을 보내고 받는 부분은 스레드로 처리해주었고 예외는 던졌다

채팅을 계속 보내고 받고 할거니까 socket을 닫지 않았다

 

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

public class Receiver extends Thread{
   private DataInputStream dis;
   
   public Receiver(Socket socket) {
      try {
         dis = new DataInputStream(socket.getInputStream());
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   
   @Override
   public void run() {
      while(dis != null) {
         try {
            System.out.println(dis.readUTF());
         } catch (IOException ex) {
            ex.printStackTrace();
         }
      }
   }
}

Receiver 스레드는 소켓을 매개변수로 받도록 했다

Receiver 객체가 생성되면 보내는 채팅을 받을 DataInputStream 객체를 생성하도록 하고

스레드가 시작되면 한줄씩 읽는다

접속에 문제가 생기면 catch문으로 넘어간다

while문은 객체가 생성되었으면 무한루프를 돌게한다

 

서버에서는 클라이언트의  요청을 받고

클라이언트에서는 서버의 응답을 받게된다

 

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

public class Sender extends Thread{
   private Scanner scan;
   private String name;
   private DataOutputStream dos;
   
   public Sender(Socket socket) {
      
      scan = new Scanner(System.in);
      
      name = "[" + socket.getLocalAddress() + " : " + socket.getLocalPort() + "]";
      
      try {
         dos = new DataOutputStream(socket.getOutputStream());
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   
   @Override
   public void run() {
      while(dos != null) {
         try {
            dos.writeUTF(name + " >>> " + scan.nextLine());
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
}

Sender 스레드도 소켓을 매개변수로 받아서 생성자에서 DataOutputStream 객체를 생성하고

채팅에 이름을 출력하기 위해 IP주소와 포트번호를 받아서 이름을 만들어주었다

스레드가 시작되면 한줄씩 입력받아서 이름과 함께 보낸다

 

서버에서는 클라이언트에게 응답하고

클라이언트에서는 서버에게 요청을 하게된다