Java/JAVA STUDY

JAVA 네트워크 _클라이언트/서버(client/server)

hansulin922 2021. 1. 29. 10:37

 

소켓 프로그래밍

Socket을 통해 client(사용자)와 server(예를 들면 구글, 네이버)를 연결

 

package exam01;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(5001); 
            //포트 번호. 운영체제는 프로세서를 포트번호로 관리. 
            //운영체제가 관리하는 프로세서의 고유번호.
            //1~1000이 운영체재 내부에서 수행되는 프로세서에 부여. 여기는 건드리지 말자. 
            //안정적으로 번호를 부여하기 위해 5000번대 할당.  
            		
			
			while(true) {//무한반복 //첫째줄에서 다음 사용자의 요청을 받아들임
				Socket socket = serverSocket.accept(); 
                //요청해올 때까지 기다리고 있음. 받는 순간 깨어남.
			    //소켓으로 오는 모든 정보를 heap 영역에 저장하고 있음. 
			
				
				ObjectInputStream inStream=
						new ObjectInputStream( socket.getInputStream()); 
                                                    //소켓에서 필요한 정보를 꺼내오기 위해 
                                                    //Stream 연결통로!
				               //인스턴스 꺼내오겠다. (+7개의 해더 정보 빼고)
				String msg = inStream.readUTF();//Reads a String in modified UTF-8format.
				System.out.println("Client가 전송해 온 메세지 : "+msg);
				
				ObjectOutputStream outStream=
						new ObjectOutputStream(socket.getOutputStream()); 
                        //출력용 연결 통로
				        //내가 보내려는 메세지를 오브젝트 형태로 담아주는 메모리 크기. 
                        //오브젝트 타입으로 할당
				
				outStream.writeUTF("Server Msg : "+msg+"님 반갑습니다."); 
                 //클라이언트에게 전달하고 싶은 메세지를 입력으로 
				outStream.flush(); //(버퍼가 쌓일 때까지 보내지 않으니까..) 
                                   //지금 바로 전송해줘!
				
				outStream.close();
				inStream.close();
				socket.close();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

 

package exam01;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class SocketClient {
	public static void main(String[] args) {
		String name = "사용자 이름";
		
		try {
			Socket socket = new Socket("localhost/*서버로사용할 IP주소*/", 5001);
            //IP 적어줌(localhost), 5001포트번호 가진 프로세서에 전달해 
			
			ObjectOutputStream outStream =
					new ObjectOutputStream(socket.getOutputStream());
			
			outStream.writeUTF(name); //소켓 메세지(name)에 담아 네트웍을 통해 서버로 전달
			outStream.flush();
			
			ObjectInputStream inStream=
					new ObjectInputStream(socket.getInputStream());
			
			String msg = inStream.readUTF();
			System.out.println("서버로부터 전송되어진 메세지 : \n"+msg);
			
			inStream.close();
			outStream.close();
			socket.close();
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}