[완료]java와 윈도우 C소켓통신을 구현하였습니다.
글쓴이: skrkfql / 작성시간: 금, 2011/10/07 - 12:47오후
근데 자꾸 에러가 나네요.
웹페이지에서 방향키와 on off라는 키가 있습니다.
이 키를 누르면 C로 신호를 가게 만드려고 합니다.
on off는 각각 y, n 방향키는 wsad 키에 맞도록 보내려고 하는데
자꾸 뭘 눌러도 1244600이 간다고 나오네요.
이 소켓은 계속 열어두고 싶습니다.
exit버튼을 넣어도 괜찮을 것 같네요.
이건 index파일입니다.
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <style type="text/css"> table{width:300px;border:0;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-spacing:0} table td,table th{border:0;border-top:1px solid #ccc;border-left:1px solid #ccc;text-align: center;} table th{background:#eee} caption{visibility:hidden;overflow:hidden;width:1px;height:1px;font-size:0;line-height:0} </style> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript"> function send(action){ $.get("remote.jsp", {action : action}); } $(function(){ var timer; $("span").mousedown(function(){ var action = this.id; if(action < 3){ // 전등과 관련된 요청은 누르는 순간 한번만 전송됨 send(action); } else{ // 누르고 있는 동안에 계속해서 요청 보냄. // 주기를 변경하고 싶으면 interval의 숫자를 변경함 (ms 단위) var interval = 200 timer = setInterval("send("+action+")", interval); } }).mouseup(function(){ if(timer){ clearInterval(timer); timer = null; } }); }); </script> <title>Home Automation</title> </head> <body> <table cellspacing="0" border="1"> <caption>리모콘</caption> <colgroup> <col width=""> <col width=""> <col width=""> <col width=""> </colgroup> <thead> <tr> <th scope="col">창문</th> <th scope="col">영상</th> <th scope="col">전등</th> <th scope="col">이동체</th> </tr> </thead> <tbody> <tr> <td> </td> <td> </td> <td><span id="1">On</span> / <span id="2">Off</span></td> <td><span id="3">↑</span><br /> <span id="4">←</span> <span id="s">↓</span> <span id="6">→</span></td> </tr> </tbody> </table> </body> </html>
아래는 소켓통싴 java 코드구요.
<%@page import="java.io.OutputStream"%> <%@page import="java.net.InetSocketAddress"%> <%@page import="java.net.Socket"%> <%@page import="java.nio.ByteOrder"%> <%@page import="java.nio.ByteBuffer"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> int i = 0; while( i < 10 ) { <% //index.jsp 에서 넘어온 값을 받음 final int action = Integer.parseInt((String) request .getParameter("action")); log("get action : " + action); new Thread() { public void run() { try { // 소켓 생성 Socket socket = new Socket(); // 소켓에 연결. 연결 시도중 connectTimeout(ms)3초 동안 응답이 없으면 에러 발생 int connectTimeout = 3 * 10000; socket.connect(new InetSocketAddress("127.0.0.1", 3249), connectTimeout); socket.setSoTimeout(1000); // 소켓에 전송할 패킷 생성 ByteBuffer buffer = ByteBuffer.allocate(4); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.putInt(action); // 소켓에 데이터 전송 OutputStream socketOut = socket.getOutputStream(); socketOut.write(buffer.array()); } // 사용한 소켓 닫음 socket.close(); } catch (Exception e) { log("", e); } } }.start(); %>
아래는 VC++코드입니다.
일부러 계속 돌릴려고 while문을 넣어놨어요.
#include<stdio.h> #include<winsock2.h> #pragma comment(lib,"wsock32.lib") void main(void) { SOCKET s, cs; //소켓 디스크립터 WSADATA wsaData; struct sockaddr_in sin; struct sockaddr_in cli_addr; int size = sizeof(cli_addr); char data[10]={0,}; if(WSAStartup(WINSOCK_VERSION,&wsaData)!=0) { printf("WSAStartup 실패, 에러 코드 = %d\n", WSAGetLastError()); return; } s= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s==INVALID_SOCKET) { printf("소켓 생성 실패, 에러 코드:%d\n",WSAGetLastError()); WSACleanup(); return; } sin.sin_family = AF_INET; sin.sin_port = htons(3249); sin.sin_addr.s_addr = htonl(ADDR_ANY); if(bind(s,(struct sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR) { printf("바인드 실패, 에러 코드 = %d\n",WSAGetLastError()); closesocket(s); WSACleanup(); return; } if(listen(s,SOMAXCONN)!=0) { printf("리슨 모드 설정 실패, 에러 코드=%d\n",WSAGetLastError()); closesocket(s); WSACleanup(); return; } printf("클라이언트로부터 접속을 기다리고 있습니다...\n"); int kin=1; while(kin=1) { cs=accept(s,(struct sockaddr*)&cli_addr,&size); if(cs==INVALID_SOCKET) { printf("접속 승인 실패,에러 코드 = %d\n",WSAGetLastError()); closesocket(s); WSACleanup(); return; } if(recv(cs,data,10,0)<3) { printf("데이터 수신 실패, 에러 코드=%u\n",WSAGetLastError()); } printf("%d가 클라이언트로부터 수신되었습니다. \n",data); } closesocket(cs); closesocket(s); WSACleanup(); return; if(closesocket(cs)!=0||closesocket(s)!=0) { printf("소켓 제거 실패, 에러코드 = %u\n",WSAGetLastError()); WSACleanup(); return; } if(WSACleanup()!=0) { printf("WSACleanup실패, 에러 코드=%u\n",WSAGetLastError()); return; } }
도와주세요.
Forums:
일단... 확인해볼게 있다면
보낸 데이터와
받은 데이터의 비교입니다.
하나씩 되집어가며 디버깅 해보시는게 어떨까요?
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기