[완료]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
댓글 달기