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