처음부터 시작하는 Java
  • TCP Socket프로그래밍
    2021년 04월 05일 12시 46분 22초에 업로드 된 글입니다.
    작성자: 원2
    728x90
    반응형

    ServerSocket

     

    import java.net.*;
    import java.io.*;
    import java.util.*;
    import java.text.SimpleDateFormat;
    
    public class Ex16_6 {
    
    	public static void main(String[] args) {
    		ServerSocket serverSocket = null;
    		try {
    			serverSocket = new ServerSocket(7777);
    			// 서버소켓을 생성하여 7777번 포트와 결합시킨다.
    			System.out.println(getTime()+"서버가 준비되었습니다."); // getTime 현재시간
    		} catch (IOException e) { e.printStackTrace(); }
    		
    		while (true) { // 무한반복
    			try {
    				System.out.println(getTime()+ "연결 요청을 기다립니다.");
    				
    				Socket socket = serverSocket.accept();
    				// 서버소켓은 클라이언트의 연결요청이 올 때까지 실행을 멈추고 계속 기다린다.
    				// 클라이언트의 연결요청이 오면 클라이언트 소켓과 통신할 새로운 소켓을 생성한다.
    				// 3way handshake를 처리  // 대기상태, 블록킹, 서버소켓의 특권
    				System.out.println(getTime()+ socket.getInetAddress() +//상대의 Ip 가져옴
    																"로 부터 연결요청이 들어왔습니다");
    				OutputStream out = socket.getOutputStream(); 
    				DataOutputStream dos = new DataOutputStream(out); // dos 출력용
    				// 소켓을 출력 스트림을 얻는다.
    				
    				//dos.writeUTF("[Notice] Test Message1 form Server.");
    				System.out.print("전송할 메세지 : ");
    				Scanner aScanner = new Scanner(System.in);
    				dos.writeUTF(aScanner.nextLine()); // UTF 유니코드를 위한 문자 인코딩방법
    				// 원격 소켓에 데이터를 보낸다.
    				//객체명.writeUTF(객체명.nextLine) 원래 사용법.
    				
    				dos.writeUTF("[Notice] Test Message1 form Server.");
    				System.out.println(getTime() + "데이터를 전송했습니다.");
    				
    				dos.close();
    				socket.close(); // 스트림과 소켓을 닫아준다.
    			} catch (IOException e) {
    				e.printStackTrace(); 
    			}
    		}
    	}
    	static String getTime() {
    		SimpleDateFormat f = new SimpleDateFormat("[hh:mm:ss]");
    		return f.format(new Date()); //현재시간을 문자열로 반환하는 함수
    	}
    }
    

    서버와 클라이언트를 연결
    클라이언트소켓

    import java.net.*;
    import java.io.*;
    public class Ex16_7 {
    
    	public static void main(String[] args) {
    		try {
    			String serverIp = "127.0.0.1"; // 
    			// localhost, 루프백, 규약으로 정해둔것. 나와 나를 연결한다. 자신의 컴퓨터를 의미.
    			System.out.println("서버에 연결중입니다. 서버 IP :" + serverIp);
    			Socket socket = new Socket(serverIp, 7777);
    			// 소켓을 생성하여 연결을 요청
    			// accept(); 와 연결을 요청하는것이 밑의 부분. 
    			
    			InputStream in = socket.getInputStream();
    			DataInputStream dis = new DataInputStream(in);
    			// 소켓의 입력스트림을 얻는다.
    			
    			System.out.println("서버로부터 받은 메시지 : " + dis.readUTF()); 
    			// 서버로 부터 UTF를 읽어온다.
    			System.out.println("연결을 종료합니다.");
    			//소켓으로 부터 받은 데이터를 출력
    			
    			dis.close();
    			socket.close();
    			System.out.println("연결이 종료되었습니다.");
    			
    		} catch (ConnectException ce) {
    			ce.printStackTrace();
    		} catch (IOException ie) {
    			ie.printStackTrace(); 
    		} catch (Exception e) {
    			e.printStackTrace();
    		}// 스트림과 소켓을 닫는다.
    	}
    
    }
    

    UTF는 유니코드로 문자 저장방식

    void writeUTF(String str)


    String nextLine()


    객체명.writeUTF(객체명.nextLine()) 원래 writeUTF쓰는 법.

    728x90
    반응형

    'Language > Java' 카테고리의 다른 글

    채팅의 쓰레드화 04번  (0) 2021.04.06
    전이중방식 채팅  (0) 2021.04.06
    패키지로 묶어서 소켓 돌리기  (0) 2021.04.05
    TCP UDP  (0) 2021.04.05
    InetAddress 클래스  (0) 2021.04.05
    교착상태  (0) 2021.04.02
    댓글