**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 - 프로세스간의 통신을 담당합니다. InputStream과 OutputStream을 가지고 있다. 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());
}
}
}
}
}