45일 차 - 서버/클라이언트 채팅 프로그램, 소켓(Socket) (23.02.28)

yvonne·2023년 2월 28일
0

📂Java

목록 보기
47/51
post-thumbnail

1. 서버-클라이언트 일대일 채팅 프로그램을 짜시오.

📌 TcpServer

import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;

		try {
			serverSocket = new ServerSocket(7777); // port 번호
			socket = serverSocket.accept(); // 클라이언트가 요청할 때까지 기다리는 코드

			Sender sender = new Sender(socket);
			Receiver receiver = new Receiver(socket);

			sender.start();
			receiver.start();

		} catch (Exception e) {
		}
	}
}

📌 TcpClient

import java.net.Socket;

public class TcpClient {

	public static void main(String[] args) {

			String serverIp = "127.0.0.1";		//일대일 채팅을 실행하고 싶을 때 상대방의 IP로 수정하여 활용
			try {
					
				Socket socket = new Socket(serverIp, 7777); 
				
				System.out.println("서버에 연결되었습니다.");
				
		        Sender   sender   = new Sender(socket);
		        Receiver receiver = new Receiver(socket);

		        sender.start();
		        receiver.start();
				
			} catch (Exception e) {
				e.printStackTrace();
			}		
		}
	}

💡 Sender

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

public class Sender extends Thread {
	Socket socket;
	DataOutputStream out;
	String name;

	public Sender(Socket socket) {
		this.socket = socket;
		try {
			out = new DataOutputStream(socket.getOutputStream());
			name = "[" + socket.getInetAddress() + ":" + socket.getPort() + "]";
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		Scanner scanner = new Scanner(System.in);
		while (out != null) {
			try {
				out.writeUTF(name + scanner.nextLine());
			} catch (Exception e) {
			}
		}
	}
}

💡 Receiver

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

public class Receiver extends Thread {
	Socket socket;
	DataInputStream in;

	public Receiver(Socket socket) {
		this.socket = socket;

		try {
			in = new DataInputStream(socket.getInputStream());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		while (in != null) {
			try {
				System.out.println(in.readUTF());
			} catch (Exception e) {
			}
		}
	}
}
  • 실행 시 TcpServer를 먼저 실행하여 서버에 접속하고 TcpClient를 실행하여 채팅을 시작
  • 상대방의 IP를 활용하여 일대일 채팅 사용 가능



2. 소켓(Socket)에 대해 설명하시오.

📌 Socket

  • 소프트웨어로 구현시킨 추상적인 포트로, 각 포트를 사용하여 통신을 수행하는 도구
  • 소켓을 통해 데이터를 주고받음
    • 포트는 출입구 역할, 소켓은 출입구를 통해 데이터를 직접 송수신하는 매체
  • 서버 소켓과 클라이언트 소켓으로 나뉨

📌서버 소켓: 클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신을 가능하게 함 (요청대기 소켓)

📌클라이언트 소켓: 대기하는 것 없이 바로 사용 가능하며 실제로 데이터 송수신이 일어나는 것 (데이터 송수신 소켓)


💡 Socket 관련 클래스와 함수
  • Socket: 클라이언트가 서버 연결 요청에 사용
  • SocketServer: 클라이언트의 연결요청을 받아 세션 형성
  • InputStream(): 데이터를 받기 위해서 사용되는 함수
  • OutputStream(): 데이터를 보내기 위해서 사용되는 함수
profile
개발 연습장

0개의 댓글