티스토리 뷰
소켓 : 두 프로그램이 네트워크를 통해 서로 통신할 수 있도록 양쪽에 생성되는 링크의 단자
소켓이 연결되면 서로 다른 프로세스끼리 데이터를 전달할 수 있음
서버 | 클라이언트 |
socket() | socket() |
bind() | |
listen() | |
connect() | |
accept() |
서버, 클라이언트는 각각 socket을 생성하고 서버는 bind에서 포트번호를 할당한다
그 후에 listen()을 호출하여 클라이언트의 접속을 기다린다.
클라이언트는 connect()를 통해 서버에 접속을 시도한다.
클라이언트 요청이 오면 accept() 함수를 호출에 연결한다.
소켓이 연결되면 recv() / send() 함수를 통해 데이터를 전달하고
마지막에 close()를 호출하여 소켓을 종료한다.
C프로그래밍에서는 socket() -> bind() -> listen() 함수를 코드에서 직접 호출해줘야 된다.
자바에서는 socket.accept() 메서드만 호출하면 Socket클래스 내부에서 socket() -> bind() -> listen()을 호출해준다.
간단한 소켓통신 예제
서버 Class
public class SocketServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(11111);
Socket socket = serverSocket.accept();
//socket -> bind -> listen socket 클래스 내부에 구현되어있음
System.out.println("connect");
OutputStream outputStream = socket.getOutputStream();
for (int i = 0; i < 10; i++) {
String sendString = "hello";
outputStream.write(sendString.getBytes());
}
outputStream.write("exit".getBytes());
serverSocket.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
클라이언트 Class
public class SocketClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",11111);
InputStream inputStream = socket.getInputStream();
while (true) {
byte[] bytes = new byte[100];
inputStream.read(bytes);
String receive = new String(bytes);
System.out.println(receive);
if(receive.equals("exit")) {
break;
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
소켓통신으로 간단한 채팅만들기
서버 Class
public class SocketServer2 {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(11111);
while(true) {
Socket socket = serverSocket.accept();
ReceiveClass receiveClass = new ReceiveClass();
receiveClass.setSocket(socket);
SendClass sendClass = new SendClass();
sendClass.setSocket(socket);
receiveClass.start();
sendClass.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
서버 ReceiveThread
public class ReceiveClass extends Thread {
private Socket socket;
@Override
public void run() {
super.run();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String receiveString;
while(true) {
receiveString = bufferedReader.readLine();
if (receiveString == null) {
System.out.println("disconnect");
socket.close();
break;
} else {
System.out.println("상대방 : " + receiveString);
}
}
SocketServer2.main(null);
} catch (IOException e) {
e.printStackTrace();
}
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
서버 SendThread
public class SendClass extends Thread {
private Socket socket;
@Override
public void run() {
super.run();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
String sendString;
while (true) {
sendString = bufferedReader.readLine();
printWriter.println(sendString);
printWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
클라이언트 Class
public class SocketClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",11111);
ReceiveClientClass receiveClientClass = new ReceiveClientClass();
receiveClientClass.setSocket(socket);
SendClientClass sendClientClass = new SendClientClass();
sendClientClass.setSocket(socket);
sendClientClass.start();
receiveClientClass.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
클라이언트 ReceiveThread
public class ReceiveClientClass extends Thread {
private Socket socket;
@Override
public void run() {
super.run();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String receiveString;
while(true) {
receiveString = bufferedReader.readLine();
System.out.println("상대방 : " + receiveString);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
클라이언드 SendThread
public class SendClientClass extends Thread {
private Socket socket;
@Override
public void run() {
super.run();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
String sendString;
while (true) {
sendString = bufferedReader.readLine();
if(sendString.equals("exit")) {
break;
}
printWriter.println(sendString);
printWriter.flush();
}
bufferedReader.close();
printWriter.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setSocket(Socket socket) {
this.socket = socket;
}
}
'개발 > Java' 카테고리의 다른 글
Effective Java 3/E - 싱글턴을 만드는 방법 (0) | 2021.01.16 |
---|---|
Effective Java 3/E - 정적 팩터리 메서드 (0) | 2021.01.14 |
자바 스트림 -2 (0) | 2021.01.01 |
자바 스트림 -1 (0) | 2020.12.26 |
자바 람다식 (0) | 2020.12.19 |
댓글