XMLSocket은 뭔가 이상하군요-_-;

그냥 Socket클래스는 그냥 쓰던 소켓같은데 XMLSocket은 삽질한 결과 이상하게 주고 받는 것 같아요.

우선 보낼 때 이상하게 나눠서 보내게 되더라구요.

그리고 \0을 끝으로 인식하는 듯합니다. 그래서 자바서버에서 보낼 때 pw.println("blur~blur~")이렇게 보낼 때에는 blur~blur~\r\n이 가게 되는데 저것이 끝이라고 인식을 못하더라구요.
그래서 보낼 때에는 pw.print("blur~blur~\n\0") 이라고 보내야해요.

그리고,
mudchobo : 안녕하세요\n\0 라고 보내면, 이상하게 나눠서 호출이 되더라구요-_-;
mudchobo : 데이터를 받고, 그다음에 안녕하세요\n\0을 받아요-_-;

왜그럴까요-_-; 어쨌든, 편법으로 만든 채팅프로그램입니다.

서버(JAVA)
ChatServer.java
[code]package com.mudchobo.chat;

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

public class ChatServer {

 private ServerSocket server;
 
 void startServer() {
  try {
   server = new ServerSocket(10001);
   System.out.println("접속을 기다립니다.");
   HashMap<String, PrintWriter> hashMap =
    new HashMap<String, PrintWriter>();
   
   while (true) {
    Socket sock = server.accept();
    ChatThread chatThread =
     new ChatThread(sock, hashMap);
    chatThread.start();
   } // while
  } catch (Exception e) {
   System.out.println(e);
  }
 }
 public static void main(String[] args) {
  ChatServer chatServer = new ChatServer();
  chatServer.startServer();
 }
}
[/code]

ChatThread.java
[code]package com.mudchobo.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

class ChatThread extends Thread {
 private Socket sock;
 private String id;
 PrintWriter pw;
 private BufferedReader br;
 private HashMap<String, PrintWriter> hashMap;

 public ChatThread(Socket sock, HashMap<String, PrintWriter> hashMap)
  throws UnsupportedEncodingException, IOException {
  this.sock = sock;
  this.hashMap = hashMap;
 
  pw = new PrintWriter(
    new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
  br = new BufferedReader(
    new InputStreamReader(sock.getInputStream(), "UTF-8"));
  id = br.readLine();
  hashMap.put(id, pw);
  broadcast(id + "님이 접속하였습니다.");
  System.out.println("접속한 사용자의 아이디는 " + id + "입니다.");
 }

 public void run() {
  try {
   String line = null;
   while ((line = br.readLine()) != null) {
    if (line.equals("/q")) {
     break;
    } else {
     broadcast(id + " : " + line);
    }
   }
  } catch (Exception ex) {
   System.out.println(ex);
  } finally {
   hashMap.remove(id);
   broadcast(id + " 님이 접속 종료하였습니다.");
   System.out.println(id + " 님이 접속 종료하였습니다.");
   try { if (sock != null) sock.close(); } catch (Exception ex) {}
  }
 }

 public void broadcast(String msg) {
  Collection<PrintWriter> collection = hashMap.values();
  Iterator<PrintWriter> iter = collection.iterator();
  while (iter.hasNext()) {
   PrintWriter pw = (PrintWriter) iter.next();
   pw.print(msg + "\n\0");
   pw.flush();
  }
 }
}
[/code]
저 부분만 바뀌었어요 ^^

이제 클라이언트로-_-;

 
Posted by 머드초보

댓글을 달아 주세요

  1. 계인 2007.11.27 11:53  댓글주소  수정/삭제  댓글쓰기

    좋은 정보가 많네요.. 머드초보님을 싸부로 생각하고 이것저것 해보고 있는데.. 제가 *.java 파일의 위치는 어디로 해야 할지 몰라서... 절대경로 ^^; 완전 초보라..ㅠ_ ㅠ

    • BlogIcon 머드초보 2008.01.26 17:39  댓글주소  수정/삭제

      아...서버쪽에서는 *.java파일을 저위에 package경로에 넣어야되는데요.
      패키지를 만드셔서 com.mudchobo.chat으로 만드셔서 넣으면 되는데요^^
      그냥 패키지안만드시면 위에 package를 없애버리면돼요 ^^
      저 허접해서 싸부로 생각하지마시고 같이 공부하는 동료로 생각해주세요^^
      허접해서 친구한테 맨날 욕먹고 있어요^^
      방문해주셔서 감사해요 ^^

  2. BlogIcon eizt 2010.07.04 22:39  댓글주소  수정/삭제  댓글쓰기

    제가 진행하고 있는데 flex 하고 java를 써야될것 같아서 ㅠㅠ 많이좀 참고좀 하겠습니다ㅠㅠ

    아 어렵다 어려워 ㅠㅠ

  3. BlogIcon 김상훈 2012.10.08 18:45  댓글주소  수정/삭제  댓글쓰기

    "mudchobo : 안녕하세요\n\0 라고 보내면, 이상하게 나눠서 호출이 되더라구요-_-;
    mudchobo : 데이터를 받고, 그다음에 안녕하세요\n\0을 받아요-_-;"

    이문제는 line = br.readLine() 시 종료되는 문자열이 같이 들어가서 생기는 문제였습니다.
    broadcast(id + " : " + line); => broadcast(id + " : " + line.trim()); 으로 해결되더군요.

  4. BlogIcon 김상훈 2012.10.08 18:45  댓글주소  수정/삭제  댓글쓰기

    플래시로 채팅 프로그램을 구현해야 했는데 이 프로그램으로 많은 도움 되었습니다.