[java] Socket
in Java
Socket
Socket ?
์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์์ผ์ ์ด์ฉํ ํต์ ํ๋ก๊ทธ๋๋ฐ์ ๋ปํ๋๋ฐ, ์์ผ์ด๋ ํ๋ก์ธ์ค๊ฐ์ ํต์ ์ ์ฌ์ฉ๋๋ ์์ชฝ ๋๋จ(endPoint)์ ์๋ฏธํ๋ค. ํ๋ก์ธ์ค๊ฐ์ ํต์ ์ ์ํด์๋ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ๊ณ ์ด๊ฒ์ด ์์ผ์ด๋ค.
- ์์ผ โ ํ๋กํ ์ฝ, ip์ฃผ์, ํฌํธ๋๋ฒ๋ก ์ ์ ๋จ.
- ๋จ์ด์ ธ ์๋ ๋ ํธ์คํธ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๋๊ตฌ๋ก์จ ์ธํฐํ์ด์ค ์ญํ .
- ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ๊ตฌ์กฐ์ฒด๋ก ์์ผ์ ํตํด ๋ฐ์ดํฐ ํต๋ก๊ฐ ๋ง๋ค์ด ์ง๋ค.
- ์์ผ์ ์ญํ ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ ์์ผ, ์๋ฒ์์ผ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
TCP
- ์๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ ์ก, ์ฐ๊ฒฐ ์งํฅ์ฑ
- ์ค๋ฅ ์์ , ์ ์ก ์ฒ๋ฆฌ, ํ๋ฆ์ ์ด ๋ณด์ฅ
- ์ก์ ๋ ์์์ ๋ฐ๋ผ ์ค๋ณต๋์ง ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ โ ์ค๋ฒํค๋ ๋ฐ์
- ์๋์ ๋ฐ์ดํฐ๋ณด๋ค ๋๋์ ๋ฐ์ดํฐ์ ์ ํฉ
UDP
- ๋น์ฐ๊ฒฐํ ์์ผ
- ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์ ํ์ด ์์.
- ํ์คํ๊ฒ ์ ๋ฌ์ด ๋ณด์ฅ๋์ง ์์. โ ๋ฐ์ดํฐ๊ฐ ์์ค๋๋ ์ค๋ฅ ๋ฐ์ ์๋จ.
- ์ค์๊ฐ ๋ฉํฐ๋ฏธ๋์ด ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฃผ๋ก ์ฌ์ฉ โ ์ ํ
Server Socket API
ServerSocket์ ํด๋์ค๋ ์๋ฒ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์๋ฒ ํ๋ก๊ทธ๋จ์ ๊ณผ์ ์ Step1 ~ Step 6์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
Step 1. ์๋ฒ ์์ผ ์์ฑ, ํฌํธ ๋ฐ์ธ๋ฉ
Step 2. ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ (Connect Listen) ์์ฒญ์ด ์ค๋ฉด ์๋ฝ
Step 3. ํด๋ผ์ด์ธํธ ์์ผ์์ ๊ฐ์ ธ์จ InputStream(ํด๋ผ์ด์ธํธ ์ชฝ์์๋ OuputStream ์ด ๋ฉ๋๋ค)์ ์ฝ์
Step 4. ์๋ต์ด ์๋ค๋ฉด OutputStream์ ํตํด ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋
Step 5. ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ ๋ซ์
Step 6. ์๋ฒ ์ข ๋ฃ
์ฌ์ฉ ๋ชฉ์ ์ด๋ ์ฉ๋์ ๋ฐ๋ผ์ 3~4๋จ๊ณ๋ ๋ฐ๋ณต ๋ ์ ์์ต๋๋ค.
์ค๋ช ๋๋ฆด ํต์ ์ ์์๋
Create a Server Socket Listen for a connection Read data from the client Send Data to the Client Close the client Connection Terminate the Server
์ ๋๋ค.
Step 1. Create a Server Socket
๋ค์ ์์ฑ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ServerSocket ํด๋์ค์ ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
-ServerSocket(int port) : ์ง์ ๋ ํฌํธ ๋ฒํธ์ ๋ฐ์ธ๋ฉ ๋ ์๋ฒ ์์ผ์ ๋ง๋ฌ (์ฐ๊ฒฐ ๋๊ธฐ์ด ์ต๋ ์ 50)
- ServerSocket(int port, int backlog): ์ง์ ๋ ํฌํธ ๋ฒํธ์ ๋ฐ์ธ๋ ๋ ์๋ฒ ์์ผ์ ๋ง๋ค๊ณ ๋๊ธฐ์ค์ธ ์ต๋ ์ฐ๊ฒฐ ์๋ฅผ backlog ๋งค๊ฐ๋ณ์๋ก ์ง์
- ServerSocket(int port, int backlog, InetAddress bindAddr) : ์๋ฒ ์์ผ์ ๋ง๋ค๊ณ ์ง์ ๋ ํฌํธ ๋ฒํธ์ ๋ก์ปฌ IP ์ฃผ์์ ๋ฐ์ธ๋ฉ
๊ฐ๋จํ ์ฌ์ฉ ์ ์ ๋๋ค. ์๋ฒ ์์ผ์ ํฌํธ๋ฒํธ 8000์ ๋ฐ์ธ๋ฉํ๋ ์ ์ ๋๋ค.
ServerSocket serverSocket = new ServerSocket(8000);
์ด๋ฌํ ์์ฑ์๋ ์์ผ์ ์ด ๋ I/O Exception์ด ์ผ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณ ๋ ค ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
Step 2. Listen for a connection
์ฐ๊ฒฐ ์์ ์ ์ ์ ๋๋ค.
Socket socket = serverSocket.accept();
Step 3. Read data from the Client
Socket ๊ฐ์ฒด๊ฐ ๋ฐํ ๋๋ฉด (์ฐ๊ฒฐ์ด ๋๋ฉด) InputStream์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์์ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
InputStream input = socket.getInputStream();
InputStream์ ๋ฐ์ดํฐ๋ฅผ byte ๋ฐฐ์ด๋ก ์ฝ๊ธฐ ๋๋ฌธ์, ์์ ๋ ๋ฒจ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ ค๋ฉด InputStreamReader๋ก ์ฝ์ด์ค๋๋ค.
InputStreamReader reader = new InputStreamReader(input);
int character = reader.read(); // reads a single character
๋ํ BufferedReader์ InputStream์ ๋ํํ์ฌ ๋ฐ์ดํฐ๋ฅผ String์ผ๋ก ์ฝ์ด์ต๋๋ค.
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = reader.readLine(); // reads a line of text
Step 4. Send Data to the client
Socket๊ณผ ์ฐ๊ฒฐ ๋ ํด๋ผ์ด์ธํธ์๊ฒ OutputStream์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๋๋ค.
OutputStream output = socket.getOutputStream();
PintWriter๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
PrintWriter writer = new PrintWriter(output, true);
writer.println(โThis is a message sent to the serverโ);
Step 5. Close the client Connection
Socket ํต์ ์ด ์๋ฃ ๋๋ฉด, close() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ ์ข ๋ฃํฉ๋๋ค.
socket.close();
close() ๋ฉ์๋๋ ์์ผ์ InputStream๊ณผ OutputStream์ ๋ซ์ ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
Step 6. Terminate the Server
์๋ฒ๋ ํด๋ผ์ด์ธํธ์์ ๋ค์ด์ค๋ ์์ฒญ์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ํญ์ ์คํ๋์ด ์์ด์ผ ํฉ๋๋ค.
์๋ฒ๋ฅผ ์ค์ง ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ServerSocket ์ธ์ฝํด์ค์ close() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์๋ฒ๋ฅผ ์ข ๋ฃ ํด ์ค๋๋ค.
Client Connection์ ์ข ๋ฃํ๋ ๋ฉ์๋์ ๋ช ์นญ์ด ๊ฐ์ง๋ง, Client์์ ์ฐ๊ฒฐ์ ๋๋ ๊ฒ์ด ์๋๋ผ โ์๋ฒโ๋ฅผ ์ค์งํ๋ ์ญํ ์ ํฉ๋๋ค.
serverSocket.close();
Java Server Socket Example
- Client ์ฝ๋
package com.woolbro.dev.socket.Client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TimeClient {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("#######Need More Arguments #########");
return;
}
String hostname = args[0];
int port = Integer.parseInt(args[1]);
for (int i = 0; i < 10; i++) {
try (Socket socket = new Socket(hostname, port)) {
OutputStream out = socket.getOutputStream();
String realStr = "This is woolbro dev Test";
out.write(realStr.getBytes());
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String time = reader.readLine();
System.out.println(time);
} catch (UnknownHostException ex) {
System.out.println("Server not found: " + ex.getMessage());
} catch (IOException ex) {
System.out.println("I/O error: " + ex.getMessage());
}
}
}
}
- Server ์ฝ๋
package com.woolbro.dev.socket.Server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class TimeServer {
public static void main(String[] args) {
if (args.length < 1) {
System.out.println("######## Argument is Null ########");
return ;
}
int port = Integer.parseInt(args[0]);
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is listening on port " + port);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("[ "+socket.getInetAddress()+" ] client connected");
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
writer.println(new Date().toString());
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
System.out.println("###### msg : "+reader.readLine());
}
} catch (IOException ex) {
System.out.println("Server exception: " + ex.getMessage());
ex.printStackTrace();
}
}
}
reference
https://woolbro.tistory.com/29
https://mainpower4309.tistory.com/25?category=774615
https://cbts.tistory.com/84
https://wonos.tistory.com/388