클라이언트가 전송해주는 데이터를 그대로 되돌려 전송해 주는 기능을 가진 서버
ServerSocket server = null;// 1. 서버소켓 준비
try {
// 2. 서버소켓 생성(열어줄 포트 지정)
server = new ServerSocket(5001);
while(true) {// 3. 요청대기(접속 요청이 있을떄 까지)
System.out.println("요청 대기 중...");
Socket socket = server.accept(); // blocking 역활
// 4. 접속 요청이 오면 요청자 정보 출력
InetSocketAddress addr = (InetSocketAddress) socket.getRemoteSocketAddress();
System.out.println(addr.getAddress()+":"+addr.getPort());
//InputStream 사용하여 데이터 읽는 순서
//4-1. 스트림준비 - 주(socket 에서 뽑아올 예정)+보조
InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ObjectInputStream ois = new ObjectInputStream(bis);
//4-2. 읽어오기
String msg = ois.readUTF();
//4-3. 읽어온 데이터 처리(출력, 기타 등등...)
System.out.println("client message : "+msg);
//OutputStream 사용하여 데이터 쓰는 순서
//4-1. 스트림준비 - 주(socket 에서 뽑아올 예정)+보조
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
ObjectOutputStream oos = new ObjectOutputStream(bos);
//4-2. 쓰기(파일? 콘솔?)
oos.writeUTF("[당신이 보낸 메시지] "+msg);
//4-3. 자원 반납(flush)
oos.flush();
ois.close();
oos.close();
}
} catch (Exception e) {
e.printStackTrace();
// 5. 예외 발생시 종료
server.close();
}
// 1. 소켓생성(접속요청)
Socket socket = new Socket("192.168.70.138", 5001);
System.out.println("접속 완료!!");// 2. 예외발생하지 않으면 접속 완료
// 2-1. 메시지 보내기(아무거나 보내고 싶은거 보내보자)
// 주 + 보조 스트림 준비
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
ObjectOutputStream oos = new ObjectOutputStream(bos);
// 메시지 보내기
oos.writeUTF("안녕하세요, 서버님!");
oos.flush();// 자원 정리(flush)
// 2-2. 받은 내용 출력하기(syso 로 출력)
// 주+보조 스트림 준비
InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ObjectInputStream ois = new ObjectInputStream(bis);
// 메시지 읽기
String msg = ois.readUTF();
System.out.println(msg);
// 자원정리(close)
ois.close();
oos.close();
// 3. 할일이 끝나면 종료
socket.close();
기본적인 구조는 Echo 서버와 동일하나 Stream의 차이가 있다.
양쪽 모두 수신과 발신이 자유롭게 되는 양방향 통신을 구현하기 위해 Thread 를 사용해 일을 대행 시킨다.
// 1. 서버소켓 준비
ServerSocket server = null;
try {
server = new ServerSocket(5252);
//while 문을 두개 동시에 돌릴수 없으므로 대신 일을 할 Thread 를 생성하여 불러온다.
while(true) {
System.out.println("요청 대기"); // 2. 요청 대기
Socket socket = server.accept(); // 3. 요청 승인
System.out.println("승인완료");
// 받아온 소켓을 가지고 전송/수신 스레드를 올린다.
SenderThread sender = new SenderThread(socket);
RecvThread recv = new RecvThread(socket);
sender.start();
recv.start();
}
} catch (Exception e) { // 4. 예외 발생시 종료
e.printStackTrace();
server.close();
}
ServerSocket server = null;
try {
server = new ServerSocket(8080);
while(true) {
System.out.println("접속 요청 대기중...");
Socket socket = server.accept();
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
// 클라이언트가 보내온 메시지 받아오기
byte[] arr = new byte[65536];// http 프로토콜에서 정해준 최대 byte 수
dis.read(arr);
// 문자열화 해서 출력
String request = new String(arr); // header + body
System.out.println(request);
// 응답(response) 만들기
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
// header
ps.print("HTTP/1.1 200 \r\n");
ps.print("Content-Type: text/html \r\n");
ps.print("\r\n"); // header 와 body 를 구분짓는 빈 줄
//body
ps.print("<h3>Success Receive</h3>");
ps.flush();
// 자원반납
dis.close();
ps.close();
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
server.close();
}