소켓은 컴퓨터 네트워크에서 데이터 통신을 가능하게 하는 중요한 소프트웨어 개념이다. 소켓은 네트워크 통신을 구현하고 관리하는데 사용되며, 주로 TCP/IP 기반의 네트워크에서 데이터를 주고받을 때 쓰인다.
소켓 프로그래밍은 네트워크 애플리케이션을 개발하는 데 필수적이며, 다양한 프로그래밍 언어에서 지원된다. 이를 통해 클라이언트와 서버 간에 데이터를 안전하게 교환하고 네트워크 애플리케이션을 구축할 수 있다.
서버 코드
import socket
# 서버 주소와 포트 번호 설정
server_address = ('127.0.0.1', 12345)
# 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버 소켓을 지정한 주소와 포트에 바인딩
server_socket.bind(server_address)
# 연결 대기
server_socket.listen(1)
print("서버가 연결을 기다립니다...")
# 클라이언트 연결 수락
client_socket, client_address = server_socket.accept()
print("클라이언트가 연결되었습니다:", client_address)
while True:
# 클라이언트로부터 데이터 수신
data = client_socket.recv(1024)
if not data:
break # 연결이 종료되면 루프를 빠져나옵니다.
# 수신한 데이터 출력
print(f"수신한 데이터: {data.decode()}")
# 클라이언트에 응답 보내기
response = "서버가 데이터를 받았습니다."
client_socket.send(response.encode())
# 연결 종료
client_socket.close()
server_socket.close()
클라이언트 코드
import socket
# 서버 주소와 포트 번호 설정
server_address = ('127.0.0.1', 12345)
# 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 서버에 연결
client_socket.connect(server_address)
while True:
# 사용자로부터 메시지 입력
message = input("메시지를 입력하세요 (종료하려면 'exit' 입력): ")
if message == 'exit':
break
# 메시지를 서버로 전송
client_socket.send(message.encode())
# 서버로부터 응답 받기
data = client_socket.recv(1024)
print(f"서버 응답: {data.decode()}")
# 연결 종료
client_socket.close()
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
int port = 12345;
try {
// 서버 소켓 생성
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("서버가 연결을 기다립니다...");
// 클라이언트 연결 대기
Socket clientSocket = serverSocket.accept();
System.out.println("클라이언트가 연결되었습니다.");
// 클라이언트와 통신할 입력 및 출력 스트림 생성
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while (true) {
// 클라이언트로부터 데이터 읽기
bytesRead = inputStream.read(buffer);
if (bytesRead == -1) {
break; // 연결이 종료되면 루프를 종료합니다.
}
String receivedData = new String(buffer, 0, bytesRead);
System.out.println("수신한 데이터: " + receivedData);
// 클라이언트에 응답 보내기
String response = "서버가 데이터를 받았습니다.";
outputStream.write(response.getBytes());
}
// 연결 종료
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}