소켓
EchoServer.java
import java.io.*;
import java.net.*;
public class EchoServer{
static final String enter = System.getProperty("line.separator");
ServerSocket serverSocket;
public EchoServer(int port) {
try {
serverSocket = new ServerSocket(port);
} catch(IOException e) {
e.printStackTrace();
System.exit(0);
}
while(true) {
try {
System.out.println("클라이언트를 요청을 기다리는 중");
Socket socket = serverSocket.accept();
System.out.println("클라이언트의 IP 주소 : " + socket.getInetAddress().getHostAddress());
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
String message = br.readLine();
System.out.println("수신메시지 : "+ message);
message = message + enter;
bw.write(message);
bw.flush();
br.close();
bw.close();
socket.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
new EchoServer(3000);
}
}
EchoClient.java
import java.io.*;//
import java.net.*;
public class EchoClient {
static final String enter = System.getProperty("line.separator");
public EchoClient(String ip, int port) throws IOException {
Socket socket = getSocket(ip, port);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.print("입력 : ");
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String str = input.readLine();
str += enter;
bw.write(str);
bw.flush();
str = br.readLine();
System.out.println("Echo Result : " + str);
input.close();
bw.close();
br.close();
socket.close();
}
public Socket getSocket(String ip, int port) {
Socket socket = null;
try {
socket = new Socket(ip, port);
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
return socket;
}
public static void main(String[] args) throws IOException {
new EchoClient("localhost", 3000);
}
}
테스트
EchoServer 를 먼저 실행한다.(이클립스에서 실행)
명령 프롬프트를 열고 EchoClient를 실행한다.
원격 서버에 접속한다면 EchoSever를 실행하는 컴퓨터는 3000번 포트를 개방해야 한다.
(제어판 - Windows 방화벽 - 예외 탭 선택 - 포트추가)
소스분석
EchoServer 가 실행되면 ServerSocket 생성된다.
serverSocket = new ServerSocket(port);
ServerSocket의 accept() 메소드에서 프로그램이 멈춘 상태로 클라이언트의 소켓접속을 기다린다.
Socket socket = serverSocket.accept();
EchoClient 가 실행되면 Socket 생성자(서버IP,포트번호)로 EchoServer에 소켓접속을 시도한다.
Socket socket = getSocket(ip, port);
이 시도를 ServerSocket의 accept() 메소드가 감지하면 클라이언트와 통신하는 소켓을 만들어진다.
Socket socket = serverSocket.accept();
EchoServer는 EchoClient가 보내는 메시지를 기다린다.
String message = br.readLine();
EchoClient에서 사용자에게 입력을 기다린다.
String str = input.readLine();
사용자가 입력한다.
입력한 문자열에 개행문자를 추가하고 소켓의 출력스트림을 이용해서 서버에 있는 소켓으로 보낸다.
그런 후 서버로부터 문자열이 오기를 기다린다.
str += enter;
bw.write(str);
bw.flush();
str = br.readLine();
EchoServer는 EchoClient에서 보낸 문자열을 받아서 개행문자를 추가하고 다시 클라이언트로 보낸다.
String message = br.readLine();
System.out.println("수신메시지 : "+ message);
message = message + enter;
bw.write(message);
그런 후 쓰였던 스트림과 함께 클라이언트와 연결된 소켓도 닫는다.
EchoClient는 EchoServer가 보낸 문자를 출력하고 프로그램을 종료한다.
명함관리(소켓,JDBC 이용)
위 소스를 이용해서 명함관리를 소켓통신을 하는 프로그램으로 변경해 본다.
소켓 프로그램을 하기 위해서는 우선 프로토콜부터 정해야 하는데 이런 식이다.
명함추가는 add$이름$회사$손전화$이메일
명함삭제는 del$번호
명함목록은 list
명함검색은 search$검색어
여기서 add,del,list,search 이 프로토콜이다.
서버측에서는 NamecardManager.java, Namecard.java 를 이용하고
클라이언트측에서 명함을 추가,삭제,목록보기,검색 결과를 소켓통신으로 출력되도록 구현한다.
소켓연결이 종료되지 않고 이어지도록 코드를 수정해 보자.
참고소스
참고문서
IT CookBook, 자바 5.0 프로그래밍: 차근차근 배우는 자바 AtoZ -한빛미디어
