**Socket 클래스 - 다른 컴퓨터와 연결하기 위한 클래스 


[생성자]

Soket() : 일반 소켓을 만들 때 사용하는 생성자 

Socket(InetAddress addr, int port) : addr 주소의 port에 접속하기 위한 소켓을 생성 

Socket(String addr, int port ) : addr 주소의 port에 접속하기 위한 소켓을 생성 - 주소를 문자열로 대입

Socket(InetAddress addr, int port ,InetAddress localAddr, int localPort) : addr 주소의 port에 접속하기 위한 소켓을 생성하는데 자신의 주소를 localAddr의 localPort로 설정해서 연결 


[ 메소드 ] 

void close() 소켓닫기 

IntputStream getInPutStream() : 상대방으로 데이터를 읽어 오기 위한 스트림을 만들어주는 메소드 


OutputStream getOutputStream () : 상대방에게 데이터를 보내기 위한 스크림을 만들어주는 메소드 

InetAddress getInetAddress() : 연결된 상대방의 주소 정보를 리턴하는 메소드 

int getPort() : 연결된 상대방의 포트 정보를 리턴하는 메소드 



**TCP 통신 


=> 항상 구동 중인 서버와 클라이언트 간의 통신 


[서버]


=> SocketServer 클래스의 생성자를 이용해서 서버를 생성하는데 이 때 포트번호를 설정할 수 있고, 접속 개수를 제한 할 수 있습니다. 

=>Socket accept ()를 호출해서 클라이언트의 접속을 대기합니다. 

클라이언트가 접속하면 클라이언트와 통신할 수 있는 Socket이 리턴됩니다. 


[ 클라이언트 ] 


=> Socket 클래스의 객체를 생성할 때, 서버의 Ip주소와 포트 번호를 설정해서 접속하면 됩니다. 



Socket -  프로세스간의 통신을 담당합니다. InputStreamOutputStream을 가지고 있다.  Input과 Output 스트림을 이용해서 프로세스간의 통신이 이루어집니다. 


ServerSocket  - 포트와 연결되어 대기 상태에 있다가 연결 요청이 들어오면, SocKet을 만들어서 서로간의 통신을 이루어지도록해줍니다. 




[ Tcp 연결방식]

연결기반 (connection - oriented)

-연결 후 통신(전화기 

1:1 통신방식 


[Tcp 특징]


- 데이터의 경계를 구분안함 Byte-stream

- 데이터의 전송 순서가 보장됨 

- 데이터의 수신여부를 확인하고 요청에 대해 클라이언트나 서버가 요청과 수락을 반복함 

- 신뢰성있는 데이터 전송 





package networkfolder;


import java.io.BufferedReader;


import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;


public class TCPserver {


public static void main(String[] args) {

// 서버는 서버 소켓과 클라이언트 소켓 2개가 필요

while (true) {

// 클라이언트의 요청을 받기 위한 소켓

ServerSocket serverSocket = null;

// 클라이언트와 통신을 하기 위한 소켓

Socket socket = null;


try {


serverSocket = new ServerSocket(15654);


// 클라이언트의 요청을 받을 수 있도록 포트를 갱방


System.out.println("서버 대기 중 .... ");


// 서버가 클라이언트의 접속을 대기

// 대기 시간은 클라이언트가 접속할 때 까지

// 통신은 소켓을 가지고 함

socket = serverSocket.accept();


// 전송되어온 데이터를 읽기 위한 스트림을 생성

// InputStreamReader 를 사용한 이유는 byte 기반의 스트림을 문자열로 변환을 해주기 때문이다.

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 한줄의 메시지를 읽어서 msg에 저장

String msg = br.readLine();


// 메시지를 전송하기 위한 스트림을 생성

PrintWriter pw = new PrintWriter(socket.getOutputStream());

// 메시지를 전송

pw.print("서버가 보내는 메시지 : ");

pw.close();

// 클라이언트한테 받은 메시지 출력

System.out.println("클라이언트 메시지 : " + msg);


// 스트림닫기

br.close();

pw.close();


} catch (Exception e) {

System.out.println("예외" + e.getMessage());

}


finally {

try {

if (serverSocket != null) {

serverSocket.close();

}

if (socket != null) {

socket.close();

}

} catch (Exception e) {

System.out.println("예외" + e.getMessage());

}

}

}

}

}



// 클라이언트 

public class TCPClient {


public static void main(String[] args) {

// 클라이언트는 서버와 통신할 소켓 1개만 있으면 됩니다.

while(true) {

Socket socket = null;


try {


// 접속할 서버의 주소를 생성

InetAddress addr = InetAddress.getByName("127.0.0.1");


// socket = new Socket()주소와 포트번호

// 서버에 접속

socket = new Socket(addr, 15654);

Scanner sc = new Scanner(System.in);


// 서버에게 메시지를 전송


PrintWriter pw = new PrintWriter(socket.getOutputStream());

String str = sc.nextLine();

pw.println(str);

pw.flush();


// 서버에서 온 메시지를 읽어서 출력하기

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String msg = br.readLine();

System.out.println("클라이언트에서 보내는 메세지 ");


// 스트림닫기

pw.close();

br.close();


} catch (Exception e) {

System.out.println("예외" + e.getMessage());

} finally {

try {


if (socket != null) {

socket.close();

}

} catch (Exception e) {

System.out.println("예외" + e.getMessage());

}

}

}

}


}

+ Recent posts