간단한 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주소와 포트번호를 받아서 이름을 만들어주었다
스레드가 시작되면 한줄씩 입력받아서 이름과 함께 보낸다
서버에서는 클라이언트에게 응답하고
클라이언트에서는 서버에게 요청을 하게된다