소켓프로그래밍
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();
}
}
}