제가 생각한 HTTP통신은 TCP통신에 HTTP해더를 얹어서 보내는 거라구 생각합니다.
일단 클라이언트 소스입니다
//---------------------------------------------------------------------------
#include <vcl.h>
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#define BUFSIZE 102400
void err_quit(char *msg)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,0,NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);
LocalFree(lpMsgBuf);
exit(-1);
}
void err_display(char *msg)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,0,NULL);
printf("[%s] %s",msg,(LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
int recvn(SOCKET s, char *buf, int len, int flags)
{
int received;
char *ptr = buf;
int left = len;
while(left>0)
{
received = recv(s, ptr, left, flags);
if(received == SOCKET_ERROR)
return SOCKET_ERROR;
else if(received==0)
break;
left -= received;
ptr += received;
}
return (len - left);
}
int main(int argc, char* argv[])
{
int retval;
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
return -1;
SOCKET sock = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
if(sock == INVALID_SOCKET) err_quit("socket()");
SOCKADDR_IN serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(80);
serveraddr.sin_addr.s_addr = inet_addr("192.168.0.5");
retval = connect(sock, (SOCKADDR *)&serveraddr,
sizeof(serveraddr));
if(retval == SOCKET_ERROR) err_quit("connect()");
//데이터 통신에 사용할 변수
char buf[BUFSIZE+1];
int len;
//서버와 데이터 통신
while(1)
{
//데이터 입력
memset(buf, 0x00, sizeof(buf));
sprintf(buf,
"GET http://mdms.go.kr:8088/TestServlet HTTP/1.1\r\n"
"Connection: Keep-Alive\r\n"
"Host: localhost\r\n"
"Accept: text/html\r\n"
"\r\n");
len = strlen(buf);
//데이터 보내기
retval = send(sock, buf, len, 0);
if(retval == SOCKET_ERROR)
{
err_display("send()");
break;
}
printf("[TCP 클라이언트] %d 바이트를 보냈습니다.\n",retval);
printf("[보낸 데이터] \n%s \n",buf);
//데이터 받기
retval = recv(sock,buf,BUFSIZE,0);
if(retval == SOCKET_ERROR)
{
err_display("recv()");
break;
}
else if(retval == 0)
{
break;
}
//받은 데이터 출력
buf[retval] = '\0';
printf("[TCP 클라이언트] %d 바이트를 받았습니다. \n",retval);
printf("[받은 데이터] %s \n",buf);
}
//closesocket()
closesocket(sock);
WSACleanup();
return 0;
}
//---------------------------------------------------------------------------
서블릿을 구현한 부분 입니다. 웹서버는 WebtoB 입니다.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class TestServlet extends HttpServlet {
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Form</title></head>");
out.println("<body>");
out.println("KLM");
out.println("</body></html>");
}
public void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
arg1.setContentType("text/html");
PrintWriter out = arg1.getWriter();
out.println("<html>");
out.println("<head><title>FormServlet</title></head>");
out.println("Using protocol: " + arg0.getProtocol() + "<br>");
out.println("The URL you requested is");
String my_url =
arg0.getScheme() + "://" +
arg0.getServerName() + ":" + arg0.getServerPort() +
arg0.getServletPath();
out.println(my_url + "<br>");
out.println("Your com is " + arg0.getRemoteHost() + "<br>");
out.println("<hr>");
Enumeration headerNames = arg0.getHeaderNames();
while (headerNames.hasMoreElements())
{
String headerName = (String)headerNames.nextElement();
String headerValue = arg0.getHeader(headerName);
out.println("Header:" + headerName + " = " + headerValue + "<br>");
}
out.println("<hr>");
out.println("<FORM METHOD=\"post\" ACTION=\"" + my_url + "\">");
out.println("<br>");
out.println("</FORM>");
out.println("</body></html>");
}
}
결과 화면을 첨부하겠습니다. 조언 부탁드립니다
음.. 정확히 질문하시는 의도를 모르겠군요..^^;;
페이지가 안읽어온다는 것인가요??ㅋㅋㅋ
다른것은 다 된다는 가정하에..
"GET http://mdms.go.kr:8088/TestServlet HTTP/1.1\r\n"
이렇게 수정해보세요..
GET /TestServlet HTTP/1.1\r\n
단 mdms.go.kr 이 Connect한 아이피라는 가정하에.. 그리고 포트도 80번 그대로 하셨군요.. 8088로 고쳐야 하지 않을까 싶네요.
직접 socket열어서 통신하시는게 좀 불편하시면, WinInet 라이브러리 이용하시면 됩니다.자세한건 MSDN 참조하시고요!!