Java

웹 서버 만들기 기초

걷는 청년 2024. 7. 24. 11:55

테스트용 기초 웹서버 만들기

 

서버

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