JAVA/NetWork

Chat(1:1 채팅프로그램)

lavender1122 2024. 2. 16. 19:52

서버소켓을 만들고, 클라이언트가 접속하면 만들어진 소켓을 사용하여 클라이언트와 데이터를 주고받는다.

TcpChatServer

1. ServerSocket,Socket 객체 생성 & accept() 클라이언트 접속 대기

  • 서버에서는 port를 지정해서 소켓과 바인딩 시킴 
    이후 클라이언트의 요청을 기다리고 요청이 들어오면 데이터 송수신 스레드 만들어서 통신
ServerSocket 변수명 = null;
Socket 변수명 = null;
	try {
	ServerSocket_변수명 = new ServerSocket(포트번호);
	Socket_변수명 = ServerSocket_변수명.accept();
    } catch (IOException e) {
	  e.printStackTrace();
	}

2. Sender클래스 객체 생성

Sender 변수명 = new Sender(Socket_변수명);
Sender_변수명.start();
  • 예시
더보기
Sender sender = new Sender(socket);
sender.start();

3. Receiver클래스 객체 생성

Receiver 변수명 = new Receiver(Socket_변수명);
Receiver_변수명.start();
  •  예시
더보기
Receiver recv = new Receiver(socket);
recv.start();

 


Sender extends Thread :  데이터 전송

1. 필드 선언

  • Socket_변수명. getOutputStream() 사용해서 클라이언트에게 데이터 전송
private Scanner 변수명;
private DataOutputStream 변수명;
  •  예시
더보기
private Scanner scan;
private String name;
private DataOutputStream dos;

2. 생성자 생성

public Sender(Socket socket) {
		
	Scanner_변수명 = new Scanner(System.in);
		
     //이름으로 사용
	String_변수명 = "[" + Socket_변수명.getLocalAddress() + " : " + Socket_변수명.getLocalPort() + "]";
		
	try {
		DataOutputStream_변수명 = new DataOutputStream(Socket_변수명.getOutputStream());
	} catch (IOException e) {
		e.printStackTrace();
	}
}
  •  예시
더보기
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();
		}
	}

 

3. 스레드 생성

	@Override
	public void run() {
		while (DataOutputStream_변수명 != null) { //무한 루프
			try {
				//메세지 보냄
				DataOutputStream_변수명.writeUTF(String_변수명 + ">>>"+ Scanner_변수명.nextLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
  •  예시
더보기
	@Override
	public void run() {
		while (dos != null) { //무한 루프
			try {
				//메세지 보냄
				dos.writeUTF(name + ">>>"+ scan.nextLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}

 


Receiver extends Thread  : 수신

1. 필드선언

  • Socket_변수명.getInputStream()을 사용해서 클라이언트에게 데이터 수신
private DataInputStream 변수명;
  •  예시
더보기
private DataInputStream dis;

2. 생성자 생성

public Receiver(Socket socket) {
		try {
			DataInputStream_변수명 = new DataInputStream(Socket_변수명.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
  •  예시
더보기
public Receiver(Socket socket) {
		try {
			dis = new DataInputStream(socket.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

3. 스레드 생성

@Override
	public void run() {
		while (DataInputStream_변수명 != null) { //무한루프
			try {
				//상대방이 문자로 보낼때까지 기다림
				System.out.println(DataInputStream_변수명.readUTF());
			} catch (IOException e) {
			e.printStackTrace();
			}
		}
	}
  •  예시
더보기
	@Override
	public void run() {
		while (dis != null) { //무한루프
			try {
				//상대방이 문자로 보낼때까지 기다림
				System.out.println(dis.readUTF());
			} catch (IOException e) {
			e.printStackTrace();
			}
		}
	}

TcpCharClient

  • 서버의 IP주소와 port를 사용해 connection 맺는다
    이후 데이터 송수신 스레드 실행

1. Socket 객체 생성 & 접속

Socket 변수명 = new Socket("IP주소",포트번호);
  •  예시
더보기
Socket socket = new Socket("192.168.144.~",7777);

2. Sender클래스 객체 생성

Sender 변수명 = new Sender(Socket_변수명);
Sender_변수명.start();
  •  예시
더보기
Sender sender = new Sender(socket);
		sender.start();

3. Receiver클래스 객체 생성

Receiver 변수명 = new Receiver(Socket_변수명);
Receiver_변수명.start();
  •  예시
더보기
Receiver recv = new Receiver(socket);
		recv.start();

원본

TcpChatServer

더보기
package kr.or.ddit.tcp;

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 e) {
			e.printStackTrace();
		}
	
	}
}

 

TcpCharClient

더보기
package kr.or.ddit.tcp;

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

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

Sender

더보기
package kr.or.ddit.tcp;

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();
			}
			
		}
	}

}

Receiver

더보기
package kr.or.ddit.tcp;

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 e) {
			e.printStackTrace();
			}
		}
	}

}