테스트용 기초 웹서버 만들기
서버
package pack;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Net4TestServer {
public static void main(String[] args) {
// 단순 서버
ServerSocket ss = null;
// 내 컴퓨터가 사용중인 port number 확인
// for(int i=0; i<65536; i++) {
// try {
// ss = new ServerSocket(i);
// ss.close();
// } catch (Exception e) {
// System.out.println(i + "번 포트는 사용중");
// }
// }
// System.out.println("확인 종료");
Socket socket = null; // TCP 기반의 통신용 클래스(파일)
try {
ss = new ServerSocket(9999);
System.out.println("서버 서비스 시작...");
socket = ss.accept(); // 서버 소켓으로부터 클라이언트 컴과 통신하기위한 개별 소켓 생성
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),StandardCharsets.UTF_8));
String data = reader.readLine();
System.out.println("수신자료 : " + data);
reader.close();
socket.close();
ss.close();
} catch (Exception e) {
System.out.println("서버 에러 : " + e);
}
}
}
클라이언트
package pack;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Net4TestClient {
public static void main(String[] args) {
try {
InetAddress ia = InetAddress.getByName("192.168.0.18");
//System.out.println(ia);
//Socket socket = new Socket(ia, 9999);
Socket socket = new Socket("192.168.0.18", 9999); // 서버와 접속
PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),StandardCharsets.UTF_8), true);
writer.println("Hi I'm Lee" + "\n"); // 서버로 자료 전송
writer.close();
socket.close();
} catch (Exception e) {
System.out.println("client error : " + e);
}
// 특정 컴의 접속 후 메세지 전달음
}
}
사용자의 말을 다시 띄워주는 에코서버 만들기
서버
package pack;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
// Echo Server : 클라이언트의 요청에 계속 반응을 보이는 서버
public class Net5EchoServer {
ServerSocket ss;
Socket socket;
PrintWriter out;
BufferedReader reader;
public Net5EchoServer() {
try {
ss = new ServerSocket(8888);
System.out.println("서버 서비스 중...");
socket = ss.accept(); // 클라이언트에 접속 대기
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8), true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
} catch (Exception e) {
System.out.println("Net5EchoServer error : " + e);
System.exit(0);
}
}
public void receiveSendData() {
try {
String msg = reader.readLine(); // 자료 수신
System.out.println("수신된 메세지 : " + msg);
out.println("서버가 보낸 메세지 : " + msg + " 잘 봤어");
} catch (Exception e) {
System.out.println("receiveSendData error : " + e);
} finally {
try {
reader.close();
out.close();
socket.close();
ss.close();
} catch (Exception e2) {
}
}
}
public static void main(String[] args) {
while (true) {
Net5EchoServer server = new Net5EchoServer();
server.receiveSendData();
}
}
}
클라이언트
package pack;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Net5Client {
Socket socket;
PrintWriter out;
BufferedReader reader;
public Net5Client() {
try {
socket = new Socket("192.168.0.18", 8888);
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8), true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
} catch (Exception e) {
System.out.println("Net5Client error : " + e);
}
}
public void sendReceiveData() {
try {
Scanner sc = new Scanner(System.in);
System.out.print("전송 메세지 입력 : ");
String data = sc.nextLine();
out.println(data); // 서버로 전송
String re_data = reader.readLine(); // 서버가 보낸 데이터 수신
System.out.println("수신된 자료는 : " + re_data);
} catch (Exception e) {
System.out.println("sendReceiveData error : " + e);
} finally{
try {
reader.close();
out.close();
socket.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
public static void main(String[] args) {
Net5Client client = new Net5Client();
client.sendReceiveData();
}
}
멀티 채팅 서버 만들기 (여러명이 들어와서 채팅칠 수 있는 서버)
서버
package pack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// 멀티 채팅 서버 : Thread + Socket
public class Net6CharServer {
private static final int PORT = 5000;
//private static List<Socket> clients = new ArrayList<Socket>();
// CopyOnWriteArrayList : 컨텐츠를 읽어 어딘가에 전달할 때 컨텐츠를 복사해서 전달함. 스레드에서 안심하고 처리가 가능(신뢰도가 높아지고 데이터 누수가 없음).
private static List<Socket> clients = new CopyOnWriteArrayList<Socket>();
// ExecutorService를 이용하면 thread pool을 생성해 병렬처리를 할 수 있다.
private static ExecutorService pool = Executors.newFixedThreadPool(4); // 4개의 스레드를 만들어서 병렬처리를 한다는 뜻
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("채팅 서버 서비스 시작 ...");
try {
while(true) {
Socket clientsocket = serverSocket.accept();
System.out.println("새 접속자와 연결 : " + clientsocket.getInetAddress());
clients.add(clientsocket);
// 스레드 풀 객체가 스레드를 실행
pool.execute(new ClientHandler(clientsocket));
}
} finally {
serverSocket.close();
}
}
static class ClientHandler implements Runnable{
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public ClientHandler(Socket socket) throws IOException{
this.socket = socket;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
}
@Override
public void run() {
try {
String name = in.readLine(); // 클라이언트 접속자명 받기
if(name == null) {
throw new IOException("클라이언트 연결이 끊어졌습니다.");
}
System.out.println(name + "님이 접속했습니다.");
broadcastMessage("우왕" + name + "님 입장 ^^");
String message;
while((message = in.readLine()) != null){ // 메세지 수신
broadcastMessage(name + "님 메세지 : " + message);
}
} catch (Exception e) {
System.out.println("접속자 연결 error : " + e.getMessage());
} finally {
try {
if(socket != null) {
socket.close();
clients.remove(socket);
}
} catch (Exception e2) {
// TODO: handle exception
}
}
}
private void broadcastMessage(String message) {
for(Socket client:clients) {
try {
if(client.isClosed()) {
// 클라이언트로 송신한 데이터를 위한 PrintWriter 객체를 생성해 송신 후 자동으로 flush함
PrintWriter clientOut = new PrintWriter(client.getOutputStream(), true); // true는 flush 한다는 뜻
clientOut.println(message);
}
} catch (Exception e) {
System.out.println("broadcastMessage error : " + e);
}
}
}
}
}
클라이언트
package pack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Net6ChatClient {
private static final String HOST = "192.168.0.21";
private static final int PORT = 5000;
public static void main(String[] args) throws IOException {
Socket socket = new Socket(HOST, PORT);
System.out.println("서버에 연결됐습니다.");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Scanner sc = new Scanner(System.in);
System.out.println("접속자명 입력 : ");
String name = sc.nextLine();
out.println(name); // 서버로 접속자명 전송
Thread readThread = new Thread(new Runnable() {
@Override
public void run() {
try {
String serverMessage;
while((serverMessage = in.readLine()) != null) {
System.out.println(serverMessage);
}
} catch (Exception e) {
System.out.println("수신데이터 error : " + e);
}
}
});
readThread.start();
String msg;
while((msg = sc.nextLine()) != null) {
if(msg.isEmpty()) {
out.println(msg); // 채팅 메세지 전송
}
}
socket.close();
sc.close();
}
}
심플한 http 웹서버 만들기
package pack;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
// Thread와 Socket을 사용해 간단한 웹 서버 작성
public class Net7SimpleHTTPServer {
private ServerSocket serverSocket;
private final int PORT;
public Net7SimpleHTTPServer(int port) {
this.PORT = port;
}
public void gogo() throws IOException {
serverSocket = new ServerSocket(PORT);
System.out.println("HTML Server started on port : " + PORT);
while(true) {
try {
Socket clientSocket = serverSocket.accept();
System.out.println("Received request from " + clientSocket.getRemoteSocketAddress());
ClientHandler clientHandler = new ClientHandler(clientSocket);
new Thread(clientHandler).start();
} catch (Exception e) {
System.out.println("gogo error : " + e);
break;
}
}
}
// 내부 클래스
private static class ClientHandler implements Runnable{
private Socket clientSocket;
public ClientHandler(Socket socket) {
clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String requestLine = in.readLine();
System.out.println("request : " + requestLine);
// HTTP response(HTTP 요청에 대한 응답)
out.println("HTTP/1.1 200 OK");
out.println("Content-Type:text/html;charset=UTF-8");
out.println("");
out.println("<html><head><title>연습</title></head>");
out.println("<body>");
out.println("<h1>홈페이지</h1>");
out.println("<a href='https://www.daum.net'>다음으로</a>출발<br>");
out.println("<a href='https://www.naver.com'>네이버로</a>가자");
out.println("</body>");
out.println("</html>");
out.close();
in.close();
clientSocket.close();
} catch (Exception e) {
System.out.println("client request error : " + e.getMessage());
}
}
}
public static void main(String[] args) {
int port = 8080; // 연습용 웹서버의 Default port
try {
Net7SimpleHTTPServer httpServer = new Net7SimpleHTTPServer(port);
httpServer.gogo();
} catch (Exception e) {
System.out.println("error : " + e);
}
}
}
'Java' 카테고리의 다른 글
| Servlet과 Cookie (0) | 2024.07.30 |
|---|---|
| html과 jsp 맛보기 (10) | 2024.07.24 |
| 네트워크, URL, 서버 (0) | 2024.07.24 |
| Stream, 람다식 DB 연동 활용 (1) | 2024.07.24 |
| 람다식 활용 (0) | 2024.07.24 |