본문 바로가기
Java기초

Socket 통신 Unicast

by jackypark 2022. 9. 2.

Unicast? 

echo program 과 비슷하다. 

echo program 은 Client 가 Server로 메시지 전송 후 Server 가 Client로 메시지를 전송하면 그 즉시 Client는 종료해 버린다.

하지만 Unicast Program은 Client 가 Server 로 전송하고 Server 가 Client에게 다시 전송하여도 Client, Server는 종료하지 않고 계속적으로 서로 메시지를 전송할 수 있다. 

또한 echo program 은 오직 하나의 Client 에게만 전송할 수 있지만, Unicast 채팅은 한 Server 가 여러 대의 Client에게 1:1로 메시지를 전송할 수 있다. 

 

Server 부분 코드

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

public class UniServer {
	ServerSocket ss=null;
	
	public static void main(String[] args) {		
		UniServer server=new UniServer();
		Socket socket=null;
		try {
			server.ss=new ServerSocket(12345);
			System.out.println("Server > Server Socket is Created... ");
			while(true) {
				socket=server.ss.accept();				
				UniChat c=new UniChat(socket);
				c.start();
				
			}
			
		}catch(IOException e) {
			System.out.println("Server > 입출력예외 발생");
		}

	}

}

class UniChat extends Thread{
	Socket socket;
	private BufferedReader bufferR;
	private BufferedWriter bufferW;
	private InputStream is;
	private OutputStream os;
	
	UniChat(Socket _socket){
		this.socket=_socket;

	}
	
	public void run() {
		try {
			is=socket.getInputStream();
			os=socket.getOutputStream();
			while(true) {
				bufferR=new BufferedReader(new InputStreamReader(is));
				bufferW=new BufferedWriter(new OutputStreamWriter(os));
				String message = bufferR.readLine();
				System.out.println("수신메시지 : "+ message); 			
				message += System.getProperty("line.separator"); 
				bufferW.write(message); 
				bufferW.flush(); 	
				
			}
		}catch(Exception e) {
			
		}
		
	}
}

Client 부분 코드

import java.io.*; 
import java.net.*; 
public class UniClient {
	private String ip; 
	private int port; 
	private String str; 
	BufferedReader file;
	MsgListener msgListener=null;
	
	public UniClient(String ip, int port) throws IOException { 
		this.ip = ip; 
		this.port = port; 
		
		Socket tcpSocket = getSocket(); 
		OutputStream os_socket = tcpSocket.getOutputStream(); 
		msgListener=new MsgListener(tcpSocket);
		msgListener.start();
		BufferedWriter bufferW = new BufferedWriter( 
				new OutputStreamWriter(os_socket)); 
		while(msgListener.isAlive()) {

			System.out.print("입력 : "); 
			file = new BufferedReader( 
					new InputStreamReader(System.in)); 
			str = file.readLine(); 
//			str += System.getProperty("line.separator"); 구버전용 개행문자 
			str +=System.lineSeparator();
			
			bufferW.write(str);			
			bufferW.flush();
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}		
		}
	
	
	} 
	public Socket getSocket() { 
		Socket tcpSocket = null; 
		try { 
			tcpSocket = new Socket(ip, port); 
		} catch (IOException ioe) { 
			ioe.printStackTrace(); 
			System.exit(0); 
		} 
		return tcpSocket; 
	}
	public static void main(String[] args)throws IOException  {
		new UniClient("localhost", 12345); 

	}

}

class MsgListener extends Thread{
	Socket socket;
	private String str; 
	MsgListener(Socket _s){
		this.socket=_s;
	}
	
	public void run() {
		try {
			InputStream is_socket = socket.getInputStream();  
			BufferedReader bufferR = new BufferedReader( 
					new InputStreamReader(is_socket)); 
			
			while(true) {
				str = bufferR.readLine(); 
				if(str.equals("bye")) {
					System.out.println("소켓통신 종료하겠습니다.");
					break;
				}else {
					System.out.println("Echo Result : " + str); 
				}
	
				
			}
			
		}catch(Exception e) {
			System.out.println("err");
		}
	}
	
	
}

 

하지만 이방식은 객체지향적이지 못한거 같다,, 그러므로 객체지향적으로 짯을때 아래의 코드와 같다

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


public class UniServer {
    public static void main(String[] args) {

        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
        	
            serverSocket = new ServerSocket(55555);
            socket = serverSocket.accept();

            Thread thread1 = new SenderThread(socket);
            Thread thread2 = new ReceiverThread(socket);
            thread1.start();
            thread2.start();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                serverSocket.close();
            } catch (Exception ignored) {
            }
        }
    }
}
import java.io.*; 
import java.net.*; 

class UniClient{
    public static void main(String[] args) {
        Socket socket = null;
        try{
            socket = new Socket("localhost",55555);
            Thread thread1 = new SenderThread(socket);            
            Thread thread2 =new ReceiverThread(socket);
            thread1.start();
            thread2.start();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}

송신전용 쓰레드

import java.io.*;
import java.net.Socket;

public class SenderThread extends Thread {
    Socket socket;

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

    public void run() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            writer.flush();

            while (true) {
            	System.out.print("입력:");
                String str = reader.readLine();
                if (str.equals("bye"))
                    break;
                writer.println(str);
                writer.flush();
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                socket.close();
            } catch (Exception ignored) {

            }
        }
    }
}

수신전용 쓰레드

import java.net.*;
import java.io.*; 
public class ReceiverThread extends Thread{
    Socket socket;
    public ReceiverThread(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String str = reader.readLine();
                if(str == null)
                    break;
                System.out.println("from>" + str);
            }
        }catch(IOException e){
            System.out.println(e.getMessage());
        }
    }

}

댓글