음....UTF-8일 때에는 swf파일명 뒤에 ?paramname=value 이런식으로도 한글이 안 깨지는데요.
EUC-KR일 때에는 flashVars로 안넘기면 한글이 깨지네요. flashVars로 넘기면 안깨져요. 신기해요!

EUC-KR인 경우
한글깨짐 경우는 swf파일 뒤에 파라메터를 붙인 경우
[code]<object id="paramTest" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
        width="300" height="120">
    <param name="movie" value="ParamTest.swf?nickName=머드초보" />
        <object type="application/x-shockwave-flash"
                data="ParamTest.swf?nickName=머드초보" width="300" height="120">
        </object>
</object>
[/code]
사용자 삽입 이미지

안 깨지게 하려면 flashVars를 이용
[code]<object id="paramTest" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
        width="300" height="120">
    <param name="movie" value="ParamTest.swf" />
    <param name="flashVars" value="nickName=머드초보" />
        <object type="application/x-shockwave-flash"
                data="ParamTest.swf" width="300" height="120"
                flashVars="nickName=머드초보">
        </object>
</object>[/code]
사용자 삽입 이미지
그리고, flashVars를 이용해서 해야지 플래시가 캐시가 된다고 하네요.
nickName같은 것이 계속 바뀌는 것이라면 플래시를 서버에서 계속 요청하게 되는 것이라고 하네요.
그래서 flashVars라는 것이 있는 것 같음.

파라메터 넘길 때 utf-8인 경우에는 어떤식으로 해도 깨지지 않음. utf-8 짱-_-

 
Posted by 머드초보

댓글을 달아 주세요

  1. 구철호 2009.08.12 15:44  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.

    6월에는 잘 사용 했었는데 오늘 FLEX 빌더에 들어가서 작업 하려고 하니 갑자기

    아래와 같은 에러가 나타나네요.

    SDK 버젼은 "Use the server SDK" 이걸 선택해서 했는데요.

    아무리 해도 안되네요.



    도와 주세요...--;;



    -- 에러 메세지

    Severity and Description Path Resource Location Creation Time Id
    unable to load SWC asSQL-Beta2.7.swc HGEIS Unknown 1249978869890 51

    • 머드초보 2009.08.23 19:23  댓글주소  수정/삭제

      안녕하세요 답변이 완전 늦었네요-_-
      그건 왠지 swc관련 에러같아보이네요.
      swc가 없다고 나오는 것 같아요 ㅠ

  2. 루든 2009.09.25 18:01  댓글주소  수정/삭제  댓글쓰기

    Object - object 구조네요? Object-Embed 구조를 잘못적으신건가요?

    • 머드초보 2009.09.27 11:50  댓글주소  수정/삭제

      IE6인가? 빼고는 다 되는 걸로 알고 있습니다^^
      swfobject에서는 저 방법을 예제로 보여주고 있더라구요.

 

이번에는 클라이언트를 보겠습니다.

참고로 예제로 배우는 플렉스2에 있는 CODE7_13을 참고했습니다.
(틀만 가져다가 썼습니다 ^^)
FLEX3 BETA2에서 테스트해봤습니다.




클라이언트(FLEX)

ChatClient_Flex.mxml
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 creationComplete="initApp()">
 
 <mx:Script>
  <![CDATA[
   private var socket:Socket = new Socket();
   [Bindable]
   public var userId:String;
   
   private function initApp():void {
    currentState = "logon";
   }
   
   public function logon():void {
    socket = new Socket("127.0.0.1", 10001);
    socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
    userId = tUserId.text;
    socket.writeUTFBytes(userId + "\n");
    socket.flush();
    currentState = "chat";
   }
   
   private function socketDataHandler(event:ProgressEvent) :void {
          var str:String = socket.readUTFBytes(socket.bytesAvailable);         
          trace(str);
          trace("음");
          var trimstr:String = str.substr(0, str.indexOf("\r\n"));
          log.text += trimstr + "\n";
      }
        
   public function send():void {
    socket.writeUTFBytes(msg.text + "\n");
                socket.flush();
                msg.text = "";
                
   }
  ]]>
 </mx:Script>
 
 <mx:Panel id="panel" width="100%" height="100%" verticalAlign="middle"
  horizontalAlign="center">
  <mx:ControlBar id="cb" height="44" />
 </mx:Panel>
 
 <mx:states>
 
  <mx:State name="logon">
   <mx:AddChild relativeTo="{panel}">
    <mx:HBox>
     <mx:Label text="User Id:" />
     <mx:TextInput id="tUserId" enter="logon()" />
     <mx:Button label="Logon" click="logon()" />
    </mx:HBox>
   </mx:AddChild>
  </mx:State>
 
  <mx:State name="chat">
   <mx:SetProperty target="{panel}" name="title"
    value="접속자 ID : [{userId}]" />
   <mx:AddChild relativeTo="{panel}">
    <mx:TextArea id="log" width="100%" height="100%" editable="false"/>
   </mx:AddChild>
   <mx:AddChild relativeTo="{cb}">
    <mx:HBox width="100%" paddingTop="0" paddingBottom="0">
     <mx:TextInput id="msg" enter="send()" width="100%" />
    </mx:HBox>
   </mx:AddChild>
  </mx:State>
 
 </mx:states>
 
</mx:Application>
[/code]
처음에 소켓이 조금 헷깔렸는데-_-; 이제 좀 알것같네요.
우선 아이디를 입력하고 로그인을 클릭하면 logon함수를 실행하는데 socket에 이벤트리스너를 등록해요.
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
이거를 등록하게 되면, 서버쪽에서 데이터를 받게 되면 이벤트가 발생되는데 socketDatahandler라는 함수를 호출하라는 얘기죠.
서버가 데이터를 던져주게되면 저함수를 호출해서 readUTFBytes를 호출하면 데이터를 받아올 수 있죠.

※readMultiByte(socket.bytesAvailable, "euc-kr") 이렇게하면
서버쪽에서 UTF-8로 안만들어도 되는데요.
UTF-8이 대세기때문에-_-; UTF-8을 활용합시다-_-;


사용자 삽입 이미지

사용자 삽입 이미지



서버
http://mudchobo.tomeii.com/tt/152
 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon chichs 2008.03.26 17:29  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~
    블로그에 막 입성한 초보블로거라서 잘몰라 요래저래 하다보니 트랙백이 갔네요;;
    요새 플렉스를 열심히 배우고 있어서..ㅎㅎ
    이 글을 고대로 퍼가려다가;; (그런건안데나;;)

    암튼.. 좋은정보 감사하구요~ 앞으로 자주 올께요^^

    • 머드초보 2008.03.27 08:28  댓글주소  수정/삭제

      안녕하세요 ^^ 반갑습니다 ^^
      저도 시작한지 이제 겨우 9개월밖에 안되서 ^^
      저는 트랙백거는거 한 3달만에 터득한 것 같은데 대단하십니다 ^^
      글 퍼가셔도 되는데 출처만 남기시면 돼요 ^^
      그럼 앞으로 블로그를 잘 이끌어나가세요 ^^

  2. 낭만공돌이 2008.05.01 01:40  댓글주소  수정/삭제  댓글쓰기

    적어주신 예제. 간단하고 이해하기 쉬워서 너무 잘 보았습니다!
    다만 한가지 질문이 있는데.
    client 단에서 첫번째로 보낸 메시지를 userID 로 받아서 "접속한 사용자의 ID는 xxx 입니다."
    라고 뿌려주시는 것 같은데.

    저는 아무래도 그 첫번째 메시지가 계속
    <policy-file-request/>
    인 것 같습니다.
    덕분에 첫번째 채팅 메시지가 ID로 인식되는군요 ㅠ

    이거 어떻게 해야 해결될까요..

    인터넷을 뒤져서
    classdomain.xls 파일을 만들라는 조언도 봤는데, 그대로 해도 잘 안되는군요;;;;
    ㅠㅠ

    혹시 도와주실 수 있을까요...ㅠ

    • 머드초보 2008.05.07 18:07  댓글주소  수정/삭제

      아....무슨얘기인지 잘 모르겠네요-_-;
      접속한 아이디라면...아이디를 그냥 서버에 넘겨주면 될듯한데요
      서버단에서 처리해야할 듯 합니다 ^^

  3. jun 2008.06.02 18:53  댓글주소  수정/삭제  댓글쓰기

    crossdomain 문제입니다 ..

    서버단에서 크로스 도매인 문서를 보내주고

    서버에서 접속을 끊어야 합니다

  4. calmtot 2009.03.06 16:42  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 잘 보고 갑니다~~ 고마워요 ^^ ㅋ

  5. 김경순 2009.03.10 16:02  댓글주소  수정/삭제  댓글쓰기

    고맙습니다. 저도 플랙스 채팅 프로그램을 Client/Server로 만드는 중인데 좋은 자료여서
    참고하도록 하겠습니다. 감사합니다.

    • 머드초보 2009.03.13 12:12  댓글주소  수정/삭제

      아넵 도움이 되셨다니 다행이네요^^
      방문해주셔서 감사해요~ ^^

  6. 쿨해요 2010.07.18 19:37  댓글주소  수정/삭제  댓글쓰기

    굿입니다.

 

채팅프로그램은 LCDS를 이용해서 메시지서비스를 하게 되면 매우 간단하게 작성할 수 있습니다.
하지만, 뭔가 자유도가 부족하군요-_-; 그래서 서버를 자바로하고 클라이언트를 FLEX로 한 프로그램을 만들어봤습니다.
플렉스 소켓으로 삽질하시는 분들께 도움이 되고자--;(뭐 도움은 안되겠지만-_-;)
JAVA 6.0에서 테스트했습니다.

서버(JAVA)
ChatServer.java 와 ChatThread.java 두개의 파일입니다.
ChatServer클래스에는 main클래스가 있으며, accept()를 호출해서 클라이언트의 접속을 기다리다가 접속이 되면 스레드를 시작을 하게 되는 구조입니다.

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]
우선 startServer를 보시면, ServerSocket을 생성합니다. 그리고, HashMap을 하나 생성하는데 이것은 id와 PrintWriter, 즉, 해당 스레드마다 각각의 PrintWriter를 저장해서 다른 클라이언트에게 뿌려줄 때 사용됩니다.
그래서 Thread만들 때 hashMap을 같이 넘겨주도록 합니다.

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.println(msg);
   pw.flush();
  }
 }
}
[/code]
생성자를 보게 되면 해당클라이언트와 통신을 하도록 하는 PrintWriter와 BufferedReader를 만듭니다.
우선 접속하게 되면 클라이언트쪽에서 id를 보내도록 되어있죠.(나중에 클라이언트할때 설명-_-;)

그리고, run메소드를 보시게 되면, BuferedReader에서 readLine을 하게 되어서, 채팅데이터를 받게 되면, broadcast함수를 호출하게 되어, 연결되어 있는 모든 클라이언트에게 채팅데이터를 보냅니다.
hashmap에 printwriter를 저장해서 가능하죠 ^^

※플렉스는 UTF-8로 데이터를 전송하게 됩니다. 그래서 데이터를 받을 때 UTF-8로 받아야겠죠?
[code]pw = new PrintWriter(
    new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
  br = new BufferedReader(
    new InputStreamReader(sock.getInputStream(), "UTF-8"));
[/code]
위와 같이 "UTF-8"이라고 해주면 돼요 ^^
UTF-8빼면 한글이 깨져버려요 ^^

길이너무 길어져서 다음 글로-_-;

클라이언트
http://mudchobo.tomeii.com/tt/153
 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 다크호스 2009.01.12 11:17  댓글주소  수정/삭제  댓글쓰기

    와 투명아이 가족이네요 ㅎ

    플렉스 관심이 많았는데

    잘 보고 갑니다.

    • 머드초보 2009.01.14 17:26  댓글주소  수정/삭제

      앗~ 투명아이 가족이신가보군요 ^^
      저도 투명아이 가족입니다 ^^
      저도 플렉스에 관심이 많아서 삽질 중입니다 ^^
      반갑습니다 ^^

  2. -_-;; 2009.10.27 19:24  댓글주소  수정/삭제  댓글쓰기

    로컬에서는 도는데 결정적으로 원격으로는 문제가 있네요...
    방법을 찾아보고는 있습니다만... 좋은 방법이 없을까요?

    • 머드초보 2009.10.29 12:40  댓글주소  수정/삭제

      아 그문제는 저도 고생했었는데, 보안 샌드박스 문제 입니다.
      소켓으로 원격으로 접속할 때에는 crossdomain.xml파일을 먼저 요청을 합니다. 즉 내가 이서버에 접속해도 되나 하는 보안파일을 먼저 보내주는 프로세스를 만들어야합니다.
      Policy Server프로그램을 하나 만들면 되는데, 만들어진 것이 많아 가져다 쓰셔도 될 듯합니다^^
      http://code.google.com/p/assql/wiki/SecurityInformation

  3. 시원 2010.05.20 22:46  댓글주소  수정/삭제  댓글쓰기

    XMLSocket 보안 샌드박스 문제때문에 이틀째 고생중입니다.
    머드 초보님처럼 저도 Policy Server프로그램을 만들고 있는데 어디서 엉키는건지
    이상하게 접속이 안되네요.....-.-;

    혹시 시간나시면 님이 말씀하신 http://code.google.com/p/assql/wiki/SecurityInformation 예제로
    Policy Server 만든경험을 저와같이 고생하는 중생들을 위해 설명을 곁들여
    올려주시면 안될까용??? ^^;

    • 머드초보 2010.05.21 10:46  댓글주소  수정/삭제

      안녕하세요~
      저도 예전에 그걸로 삽질을 한적이 있었는데요^^
      의외로 간단해요.
      그냥 Policy Server프로그램을 서버에 띄워놓으면 swf가 그 서버에서 plicy파일을 요청합니다. 그걸 던져주는 걸 만들면 되는건데
      음...
      저 예제로 하면 되는데...
      나중에 시간날 때 한번 글을 써보겠습니다 ㅠㅠ

  4. 2010.06.11 10:23  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 머드초보 2010.06.14 12:09  댓글주소  수정/삭제

      네네~
      그건 크로스도메인 문제인데요.
      서버측에서 843포트로 크로스도메인파일을 전송해줘야합니다.
      그거 관련된 것은 검색해보면 나오는데,
      나중에 이 글에 대해서 포스팅을 할께요.
      많이들 헷깔려하시는 것 같아서 ㅠㅠ