자바 소켓프로그래밍에 관한 질문입니다.

tyolee83의 이미지

과제를 하다가 막히는 부분이 생기네요 ㅠㅠ

자바로 소켓 프로그래밍을 하다가 막힌건데요

우선 수업시간에 나름대로 프로토콜을 정해서 패킷을 전송하는 것입니다.

필드별로 1byte, 2byte, 4byte 등의 길이를 가져서

그것들을 각각 byte, short, int 등으로 선언했거든요

근데 이걸 하나의 패킷으로 생각해서 보내려면

C에서 구조체의 포인터를 넘기는거처럼

객체를 생성해서 보내고 싶은데 안되네요 ㅠㅠ

그래서 생각한게 필드별로 하나하나 보내는 건데

byte 하나 보내고 서버에서 readByte 이렇게 받고
short 하나 보내고 서버에서 readShort 이렇게 받고

하다보니까 코드가 말이 안되는... ㅠㅠ

결과적으로 패킷화 하는 걸 어떻게 처리해야 할까 하는거랑요

소켓을 통해 서버 클라이언트가 통신할때

패킷 단위로 보내고 그걸 다시 파싱하고 그런쪽을 어떻게 처리해야 할지

조언을 듣고 싶습니다.

답변에 미리 감사드립니다.

쿠크다스의 이미지

객체 전송 가능합니다.
ObjectOutputStream,
ObjectInputStream
써보세요.

implements java.io.Seraialze해 주시고요.

과자가 아닙니다.
cuckoo dozen, 즉.12마리의 뻐꾸기란 뜻입니다.

whiteblue의 이미지

처음으로 KLDP 에 글을 써 봅니다 :)

이미 간략히 해결책을 알려 주신 분도 계시지만, 일단 기억나는 만큼 써 봅니다. (접속이 제한된 곳이라 제가 쓰던 코드를 꺼내 올 수가 없군요)

자바에서는 클래스 정의를 통해 생성된 임의의 객체 (instance 라고도 부르더군요) 를 특정 스트림으로 전송할 수 있습니다. 파일 스트림으로 보내면 객체를 디스크에 그대로 쓰거나 읽을 수 있고 네트워크 스트림으로 보내면 다른 컴퓨터로 전송할 수 있는 것입니다. 이를 위해 사용하는 것이 ObjectInputStream, ObjectOutputStream 클래스이며, 하나 더 필요한 인터페이스가 Serializable 입니다 (제 기억으로는 Serialize 가 아니라 Serializable 인 것 같네요) 모두 java.io 패키지 아래에 있을 겁니다.

대략 예를 들어

import java.io.*;

Class MyPacket implements Serializable{
byte command;
short length;
int code;
}

이런 클래스가 있다고 합시다.

이걸 네트워크 전송하기 위해서는

소켓 받고, 소켓의 output stream 을 얻고, ObjectOutputStream 인스턴스를 생성한 후 writeObject() 메소드를 통해 전송합니다.

이것을 받으려면 비슷한 과정을 거칩니다.

소켓 받고, input stream 얻고,
ObjectInputStream 인스턴스 생성 후 ReadObject() 메소드를 통해 얻습니다.

보내기

Socket s = new Socket(~~~

... 뭐 생략하고

MyPacket p = new MyPacket();
p.command = ~~~;

...

ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(p);

받기

ServerSocket ss = new ServerSocket(~~~

...

Socket s = ss.accept();

ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
MyPacket p = (MyPacket)ois.readObject();

대충 이 정도가 될 겁니다.

tyolee83의 이미지

이거때매 많이 고생했는데

너무 반가운 답변입니다

우선 시도해 봐야겠네요

답변 감사드립니다 ^^

//TODO

tyolee83의 이미지

java.io.NotSerializableException:

이런 예외가 발생되는데

이유는 무엇일까요? ㅠㅠ

못찾겠는데 ㅠㅠ

//TODO

crimsoncream의 이미지

Serializable interface implement 하셨나요?

Quote:

Class MyPacket implements Serializable{
...
}

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

tyolee83의 이미지

Quote:

java.lang.ClassNotFoundException: Client_Packet
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at Server$1.mouseUp(Server.java:140)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:137)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3080)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2713)
at Server.open(Server.java:73)
at Server.main(Server.java:58)

윗분 말씀대로 Class MyPacket implements Serializable

이걸 붙이니까

이번엔 저렇게 다른 예외가 많이.... ㅠㅠ

근데 보내는 클라이언트에선 에러가 안나고

받는 서버쪽에서 난 에러거든요....

조언부탁드립니다. ㅠ

//TODO

atie의 이미지

에러는 이것 하나 입니다. 나머지는 프로그램이 수행될 때 호출되는 클래스의 어떤 method를 거치는가를 보여주는 겁니다.

Quote:
java.lang.ClassNotFoundException: Client_Packet

Client_Packet 클래스가 없다는 것이니 대신에 MyPacket을 쓰면 되겠네요. 클라이언트에서 보내는 것이 이상이 없으면, 서버에서 받아서 풀 때도 클라이언트에서 정의된 같은 것이 있어야 풀리겠죠.

----
I paint objects as I think them, not as I see them.
atie's minipage

댓글 달기

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