gcc랑 Java랑 네트워크 통신가능한가요?
풍란
음~~
리눅스 기반에의 컴퓨터에서 gcc로 서버 프로그램을 짜고
클라이언트 쪽에서 자바로 클라이언트를 짜서 네트워크 통신(정확하게 데이터 전송)이
가능한가요?
만약 된다면 어떻게 가능한지 궁금합니다....
해보신분 계시다면 방법좀 알려주세요^^
-
대나무
예전에.. 자바와.. C 간에.. 프로그램을 만든적이 있었는데.. 숫자형은.. 전부다.. 바이트로 변환해서.. 넘겨 주었습니다. 명령어 코드는 1byte, 설정정보는 2byte, 뭐 이런식으로요...
숫자형은.. 일일이 다시 바이트로 쪼개고 합치는게 좀 귀찮긴 하지만.. 호환성을위해서라면 ^_^;; -
맨마루
아참.. Java는 String에 unicode를 사용하니까 C쪽에 전송할때에는 바이트로 변환해서 전송해 주셔야 합니다^^;
sd = socket(AF_INET, SOCK_STREAM, 0);
bind()
listen()
read()
write()
대충 저런식으로 메소드 이용하셔서 구현하시면 됩니다.
Unix에서 소켓 관련 메소드가 별도로 존재하기는 하지만..
어차피 소켓도 파일로 간주되기 때문에 보통은 파일에 데이터 쓰듯이 파일 관련 메소드로 많이 -
리네
그외에는 숫자형이, short, int, long형의 바이트 오더가 CPU에 따라서 틀리기때문에 숫자를 전송하실 경우에는 주의 하셔야 하구요. 바이트 전송만 하실 경우에는 아무런 문제 없이 평소 하시던대로 하면 됩니다.
각각 서버 & 클라이언트의 구현 방법은 다양하기때문에 적절한 패킷 형태를 정의해서 사용해야 할 것입니다.
기존에 하시던대로 하시면 될 듯 싶습니다.
C와 Java간에 통신하실때에는 위의 사항만 주의 하시면 큰 무리 없이 통신이 가능합니다 -
비치나
흠..작성 해 보셨으면 크게 어렵지 않을듯 싶습니다.
주의 하실점은 Java의 경우 데이터 형이 O/S와 무관하게 정해져 있지만..
C의 경우에는 o/s에 따라서(정확히는 CPU겠죠?) 데이터 형이 바뀝니다.
예를들어 c의 경우에는 int형이 100% 16비트가 아니라는것이죠.
16비트인곳도 있고, 32비트 인곳도 있습니다.
반면 자바는 어떤 컴이나 어떤 O/S에서 실행하든 int는 32비트 입니다.
따라서, 위와 같은 기본형에 대한 바이트 길이만 주 -
세라
음...제가 자바랑 리눅스에서 통신 프로그램은 짜봤는데 걍 각각의 서버 클라이언트 프로그램을 짜서
서로 연동이 되는지 몰라서 물어봤었습니다^^
srarpooh, 용여수다님 조언 감사합니다 꾸벅 -
해비치
Unix 계열은 O/S마다 제공되는 소켓 라이브러리가 조금씩 다릅니다.
인터넷 상에서 C관련된 서버를 찾으시거나 사용하시려는 O/S에서 제공하는
도움말 파일에서 sock부분을 참고하시면 어렵지 않게 구현 가능합니다.
아니면 시중에서 간단한 서적이라도 한번 보시는게 좋을듯 합니다.
싱크는 어렵지 않은데 어싱크는 좀 공부하셔야 하거든요.
C소켓은 잘 못 작성하시면 조금 어려워질 수 있슶니다^^ -
불꾼
자바의 ServerSocket 도 바인딩하고 accept 에서 클라이언트 요청이 들어올때까지 blocking됩니다. 리눅스에서 네트워크 프로그래밍을 해보지는 않았지만 그쪼에서도 이런식으로 돌아가는 것으로 알고 있는데... 중요한 것은 각 언어에서 구현된 네트워크 접속 방식을 따른다면 일단 연결된다고 보아야 하지 않을까요, 그게 바로 추상화, 캡슐화의 개념이니까요.
-
흰여울
답변감사합니다..근데요...
리눅스 소켓 통신할때는 소켓 생성하고 바운딩 시키고 억셉트 하고 기다리고 하는 등등 절차가 많은데
자바는 클라이언트 경우에는 소켓 하나만 달랑 생성해서 연결 요청하면 바로 되는 등의
서로의 각 절차가 다른데 이런거는 어떻게 되나요?
그쪽이 궁금합니다..^^ -
다참
자세한건 기본적인 통신 관련 강좌나 책을 참고하시면 세부적으로 나오니 참고하시기 바랍니다.
아니면 간단하게 위에서 말한것처럼 모두 스트링(바이트 어레이)로 보내시면 속 편합니다. -
민서
네트윅 통신이라는거 자체가 이기종간의 통신이 목적이기때문에 가능합니다.
C계열은 CPU의존적이기 때문에 사용하는 CPU타입을 고려하시면 됩니다.
네트윅은 크게는 네트윅 기반이냐 호스트 기반이냐로 분류되는데...
다른 말로는 리틀 엔디안인지 빅엔디안인지로 나뉘게 됩니다.
이 부분은 전송하고자 하는 데이터가 숫자형(int, long, double등)을 사용할지에 따라 분류됩니다.
그렇지 않고 모든 데이터를 스트링으로만 전송하신다면...
문제없이 평소 하시는