Java 소켓 통신 시 구조체(?) 전송

버그소년의 이미지

난생 처음으로 Java를 가지고 작업을 하다보니 갑갑하네요.

보통 C에서 송수신 할 때

char buff[1024];
struct Header *header;

...

recv ( buff, sizeof ( struct Header), ... );

[b]header = (struct Header *) buff;[/b]

이런식으로 buff를 Header 포인터로 변환해서 바로 사용합니다.

DataInputStream의 read ( byte[], ... ); 를 이용해서 하려고 하는데

도무지 감이 안오는군요.

모든 예제는 string을 전송하는 것이라 별 도움이 안되고..

데이터를 string으로 하려니 매번 파싱하는것도 귀찮은 일이고...

C에서처럼 구조체 형태로 송수신 할 수 있는 방법이 있는지 궁금합니다.

atdda의 이미지

서버/클라이언트를 다 작업하시는 중인가요?

원하시는게 이런건가요?
http://java.sun.com/j2se/1.5.0/docs/api/java/io/ObjectInputStream.html

May The Force Be With You.

버그소년의 이미지

객체를 입출력하는 방법이 있었군요.

그런데,

InputStream is;
OutputStream os;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;


is = client_socket.getInputStream ();
os = client_socket.getOutputStream ();

// ???
ois = new ObjectInputStream ( is );
oos = new ObjectOutputStream ( os );

접속이 된 후 client_socket으로부터 InputStream/OutputStream
은 잘 생성이 되는데 ObjectInputStream/ObjectOutputStream
을 생성할때 멈춰버리는군요.

왜 이런건지...

가끔은 밥을 굶어도 살 수 있다.

M.W.Park의 이미지

Serializable interface는 구현하셨나요?

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

버그소년의 이미지

답변 고맙습니다.

implements Serializable을 하니 잘 되는군요.
Serializable interface를 구현하지 않아도 잘 되는군요..
(내부적으로 구현이 되어있는건지...)

그런데 한참 삽질을 했습니다.

서버는 제 PC(eclipse)에서 테스트 하고, 클라이언트는 Linux에서 테스트 했는데,
계속 클래스를 못찾는다는 에러만...
각 장비에서 소스코드를 컴파일 하니 클래스를 못찾더군요.
그래서 리눅스에서 모두 컴파일하고 *.class 를 복사해서
실행하니 잘 되네요...

이게...전송할 클래스가 컴파일될때,
각 클래스의 고유 ID가 생성되는거 같은데,
같은 코드를 컴파일 해도 컴파일 환경에따라 이 ID가 달라지는건지,
eclipse에서 컴파일할때 패키지로 묶여있어서 그런건지...

꼭 같은 환경에서 컴파일된 *.class 파일이 양쪽에 있어야만 전송이 되는건지 궁금하네요.

예를들어 클래스 ID를 임의로 지정해준다던가... 체크하지 않고
강제로 케스팅한다던가.. 뭐.. 그런...

특별한 의미는 없지만 가능한지 궁금하네요..

가끔은 밥을 굶어도 살 수 있다.

M.W.Park의 이미지

The serializable class UserAccountData does not declare a static final serialVersionUID field of type long UserAccountData.java 직접 실험 해보진 않았지만 (저는 무시해버리지만...8)) 위와 같은 경고 메시지가 출현하는 것을 보면 Serializable을 구현하는 양쪽 클래스에서 serialVersionUID member variable을 똑같이 만들어주면 될것같습니다만... 실험은 버그소년님께서... 8)

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.