[완료]java와 윈도우 C소켓통신을 구현하였습니다.

skrkfql의 이미지

근데 자꾸 에러가 나네요.
웹페이지에서 방향키와 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>&nbsp;</td>
				<td>&nbsp;</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;
}
}

도와주세요.

shint의 이미지

보낸 데이터와
받은 데이터의 비교입니다.
하나씩 되집어가며 디버깅 해보시는게 어떨까요?

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.