소켓프로그래밍

JAVA 간단한 web서버 만들기

blackbearwow 2020. 9. 23. 12:03

처음에는 BufferedWriter를 이용해서 만들었지만 실패했다. 그리고 왜 안되는지 생각해보다가, 인터넷에서 DataOutputStream을 발견하고 사용했다. 그랬더니 해결.

참고: opentutorials.org/module/1181/7894

package javaweb1;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;

public class JavaWeb1 
{
    public static void main(String[] args) 
    {
        int max_size = 2048;
        String recvStr;
        String compareStr;
        char[] recvBuffer = new char[max_size];
        try{
            ServerSocket servSock=new ServerSocket(80);
            while(true)
            {
                Socket sock=servSock.accept();
                BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
                DataOutputStream out=new DataOutputStream(sock.getOutputStream());
                
                in.read(recvBuffer, 0, max_size);
                recvStr=new String(recvBuffer);
                System.out.println(recvBuffer);
                
                if(recvStr.contains("GET")==false){
                    SendMSG.SendErrorMSG(out);
                    System.out.println("not GET");
                    sock.close();
                    continue;
                }
                
                int beginIndex=recvStr.indexOf("/");
                int endIndex=recvStr.indexOf(" HTTP", 4);
                compareStr=recvStr.substring(beginIndex, endIndex);
                SendMSG.SendData(compareStr, out);
                sock.close();
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

class SendMSG
{
    static void SendData(String str, DataOutputStream out)
    {
        
        String protocol="HTTP/1.0 200 OK\r\n";
        String servName="Server:simple web server\r\n";
        String cntLen="Content-length:2048\r\n";
        String cntType="Content-type:text/html\r\n\r\n";
        String content="<html><head><title>NETWORK</title></head>"
                +"<body><h1>wow</h1></body></html>";
        String str2=protocol+servName+cntLen+cntType+content;
        char[] body=new char[2048];
        body=str2.toCharArray();
        try{
            out.writeBytes(str2);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    static void SendErrorMSG(DataOutputStream out)
    {
        String protocol="HTTP/1.0 400 Bad Request\r\n";
        String servName="Server:simple web server\r\n";
        String cntLen="Content-length:2048\r\n";
        String cntType="Content-type:text/html\r\n\r\n";
        String content="<html><head><title>NETWORK</title></head></html>";
        try{
            //out.write(protocol+servName+cntLen+cntType+content);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

하지만 알고보니, flush()를 해주면 해결되는 문제였다.

나는 BufferedWirter가 더 마음에 드니, flush()를 사용해서 해야겠다 ㅎㅎ

package javaweb1;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;

public class JavaWeb1 
{
    public static void main(String[] args) 
    {
        int max_size = 2048;
        String recvStr;
        String compareStr;
        char[] recvBuffer = new char[max_size];
        try{
            ServerSocket servSock=new ServerSocket(80);
            while(true)
            {
                Socket sock=servSock.accept();
                BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
                BufferedWriter out=new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
                
                in.read(recvBuffer, 0, max_size);
                recvStr=new String(recvBuffer);
                System.out.println(recvBuffer);
                
                if(recvStr.contains("GET")==false){
                    SendMSG.SendErrorMSG(out);
                    System.out.println("not GET");
                    sock.close();
                    continue;
                }
                
                int beginIndex=recvStr.indexOf("/");
                int endIndex=recvStr.indexOf(" HTTP", 4);
                compareStr=recvStr.substring(beginIndex, endIndex);
                SendMSG.SendData(compareStr, out);
                sock.close();
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

class SendMSG
{
    static void SendData(String str, BufferedWriter out)
    {
        
        String protocol="HTTP/1.0 200 OK\r\n";
        String servName="Server:simple web server\r\n";
        String cntLen="Content-length:2048\r\n";
        String cntType="Content-type:text/html\r\n\r\n";
        String content="<html><head><title>NETWORK</title></head>"
                +"<body><h1>wow</h1></body></html>";
        String str2=protocol+servName+cntLen+cntType+content;
        char[] body=new char[2048];
        body=str2.toCharArray();
        try{
            out.write(str2);
            out.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    static void SendErrorMSG(BufferedWriter out)
    {
        String protocol="HTTP/1.0 400 Bad Request\r\n";
        String servName="Server:simple web server\r\n";
        String cntLen="Content-length:2048\r\n";
        String cntType="Content-type:text/html\r\n\r\n";
        String content="<html><head><title>NETWORK</title></head></html>";
        try{
            out.write(protocol+servName+cntLen+cntType+content);
            out.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

그후로 더 해보다가 internet explorer과 chrome과 핸드폰chrome을 접속해보면서 바꾼 코드.

internet explorer는 한번만, chrome은 두번, 핸드폰chrome은 뭔놈이 3번인가 4번인가 아주그냥 tcp접속을 너무 많이한다. 하는데 애먹겠네

package javaweb1;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;

public class JavaWeb1 
{
    public static void main(String[] args) 
    {
        int max_size = 2048;
        String recvStr;
        String compareStr = null;
        boolean isChrome=false;
        char[] recvBuffer = new char[max_size];
        Socket sock=null, sock2=null;
        BufferedReader in=null, in2=null;
        BufferedWriter out=null, out2=null;
        try{
            ServerSocket servSock=new ServerSocket(80);
            while(true)
            {
                Thread.sleep(500);
                sock=servSock.accept();
                System.out.println("accept client");
                in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
                out=new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
                
                if(in.ready()==false)
                {
                    isChrome=true;
                    sock2=servSock.accept();
                    System.out.println("accept chrome");
                    in2=new BufferedReader(new InputStreamReader(sock.getInputStream()));
                    out2=new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
                    //SendMSG.IsChrome(servSock);
                    System.out.println("크롬인가?");
                    //SendMSG.SendData(compareStr, out);
                    //sock.close();
                    //continue;
                }
                if(in.ready()==true)
                    in.read(recvBuffer, 0, max_size);
                else{
                    //android chrome
                    if(isChrome){
                        isChrome=false;
                        in2.close();
                        out2.close();
                        sock2.close();
                    }
                    in.close();
                    out.close();
                    sock.close();
                }
                recvStr=new String(recvBuffer);
                System.out.println("리시브 데이터");
                
                if(recvStr.contains("GET")==false){
                    SendMSG.SendErrorMSG(out);
                    System.out.println("not GET");
                    sock.close();
                    continue;
                }
                
                int beginIndex=recvStr.indexOf("/");
                int endIndex=recvStr.indexOf(" HTTP", 4);
                compareStr=recvStr.substring(beginIndex, endIndex);
                SendMSG.SendData(compareStr, out);
                if(isChrome){
                    isChrome=false;
                    in2.close();
                    out2.close();
                    sock2.close();
                }
                in.close();
                out.close();
                sock.close();
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

class SendMSG
{
    static void IsChrome(ServerSocket servSock)
    {
        try{
            Socket sock=servSock.accept();
            System.out.println("accept chrome");
            BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
            BufferedWriter out=new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
            SendData(null, out);
            //in.close();
            //out.close();
            //sock.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    static void SendData(String str, BufferedWriter out)
    {
        
        String protocol="HTTP/1.0 200 OK\r\n";
        String servName="Server:simple web server\r\n";
        String cntLen="Content-length:2048\r\n";
        String cntType="Content-type:text/html\r\n\r\n";
        String content="<html><head><link rel=\"shortcut icon\" href=\"https://diotheworld.github.io/favicon/favicon.ico\">"
                + "<title>NETWORK</title></head><body><h1>wow</h1></body></html>";
        String str2=protocol+servName+cntType+content;
        char[] body=new char[2048];
        body=str2.toCharArray();
        try{
            out.write(str2);
            out.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    static void SendErrorMSG(BufferedWriter out)
    {
        String protocol="HTTP/1.0 400 Bad Request\r\n";
        String servName="Server:simple web server\r\n";
        String cntLen="Content-length:2048\r\n";
        String cntType="Content-type:text/html\r\n\r\n";
        String content="<html><head><title>NETWORK</title></head></html>";
        try{
            out.write(protocol+servName+cntType+content);
            out.flush();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}