XML 데이터 수신시에 끝을 어떻게 아나요?

rbosc의 이미지

안녕하세요.

매일매일 와서 글만 보고 가다가 질문이 있어 이렇게 올립니다.

서버 / 클라이언트 통신 프로토콜로 XML 을 사용하려고 합니다.

복잡한 프로토콜은 아니고, 클라이언트에서 데이터 요청에 대하여 서버에서 응답하는 형태이고

TCP 로 연결하여 연결을 유지하면서 데이터 송/수신을 하려고 했습니다.

언어는 자바를 사용했습니다.

builder.parse() 에 socket.getInputStream() 으로 얻은 InputStream 을 그대로 연결했는데요

클라이언트에서 XML 데이터를 전송하여도 그 끝을 몰라서 계속 수신 대기를 하는 것 같습니다.

물론 클라이언트에서 XML 데이터 전송 후, socket 을 끊으면 parse() 에서 빠져나오지만,

끊지 않으면 계속 수신하다가 에러가 납니다.

TCP 연결을 끊지 않으면서 프로토콜을 XML 을 사용하는 방법을 없을까요?? ... 1

수신 길이가 불확실함으로 builder.parse() 에 바로 연결하지 않는

방식을 사용해도 비슷한 고민이 생길 듯 하는데.. 어떤 방법이 좋을까요?? .... 2

많은 조언 부탁드립니다.

아래와 같은 식으로 작성했습니다. ( in 은 외부에서 socket.getInputStream() 입니다.)

      DocumentBuilderFactory  factory = null;
      DocumentBuilder   builder = null;
      Document          doc = null;
 
      factory = DocumentBuilderFactory.newInstance();
      builder = factory.newDocumentBuilder();
 
        try {
            doc = builder.parse(in);
        } catch (Exception e) {
            ...
        }
emptynote의 이미지

통신 경험이 없어 도움이 안되겠지만 2가지 정도 생각한것 있는데요.

첫번째는 root end tag 검출로 끝을 인식하느거 아닌가요.

예를 들면 'root'이 root tag일 경우 검출이요.

두번째는 제가 직접 사용해 본거 아니지만 저두 xml로 통신하다가 우연히 봐둔것이 있는데요.
javax.xml.stream.XMLInputFactory 의
public abstract XMLStreamReader createXMLStreamReader(InputStream stream,String encoding)
입니다. 직접 사용해본 경험이 없어서 딱히 말씀드릴것이 없네요.

초기버전이 첫번째 거로만 생각하고 구현한거라..
좋은 결과물 있으시면 공개해 주셨으면 하네요.
개인적으로 저두 xml로 통신 프로토콜 쓸려다가 head+body(?) -> 이것을 frame이라고 하나요..
하여간 이 방식으로 변경중입니다. xml이 느린거는 각오?하고 쓸려다가
구글신께 5분?정도 물어봤을때 header+xml 형태로 빠르다고 자랑하는 어떤 사이트때문에
결정적으로 맘에 두고 있다가 암호/압축 지원할려다 보니 울컥해서 감정적으로 바꾼게 되었습니다.

결론적으로 순수 xml로 통신하는 쓸만한 framework 공개해 주시면 많은 중생들이 구제될줄 아옵니다.

댓글 달기

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