- notice 스킨변경~
EUC-KR일 때에는 flashVars로 안넘기면 한글이 깨지네요. flashVars로 넘기면 안깨져요. 신기해요!
EUC-KR인 경우
한글깨짐 경우는 swf파일 뒤에 파라메터를 붙인 경우
<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>

안 깨지게 하려면 flashVars를 이용
<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>
nickName같은 것이 계속 바뀌는 것이라면 플래시를 서버에서 계속 요청하게 되는 것이라고 하네요.
그래서 flashVars라는 것이 있는 것 같음.
파라메터 넘길 때 utf-8인 경우에는 어떤식으로 해도 깨지지 않음. utf-8 짱-_-
-
구철호
안녕하세요.
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 -
-
-
이번에는 클라이언트를 보겠습니다.
참고로 예제로 배우는 플렉스2에 있는 CODE7_13을 참고했습니다.
(틀만 가져다가 썼습니다 ^^)
FLEX3 BETA2에서 테스트해봤습니다.
클라이언트(FLEX)
ChatClient_Flex.mxml
<?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>
처음에 소켓이 조금 헷깔렸는데-_-; 이제 좀 알것같네요.
우선 아이디를 입력하고 로그인을 클릭하면 logon함수를 실행하는데 socket에 이벤트리스너를 등록해요.
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
이거를 등록하게 되면, 서버쪽에서 데이터를 받게 되면 이벤트가 발생되는데 socketDatahandler라는 함수를 호출하라는 얘기죠.
서버가 데이터를 던져주게되면 저함수를 호출해서 readUTFBytes를 호출하면 데이터를 받아올 수 있죠.
※readMultiByte(socket.bytesAvailable, "euc-kr") 이렇게하면
서버쪽에서 UTF-8로 안만들어도 되는데요.
UTF-8이 대세기때문에-_-; UTF-8을 활용합시다-_-;


-
chichs
안녕하세요~
블로그에 막 입성한 초보블로거라서 잘몰라 요래저래 하다보니 트랙백이 갔네요;;
요새 플렉스를 열심히 배우고 있어서..ㅎㅎ
이 글을 고대로 퍼가려다가;; (그런건안데나;
암튼.. 좋은정보 감사하구요~ 앞으로 자주 올께요^^-
머드초보
안녕하세요 ^^ 반갑습니다 ^^
저도 시작한지 이제 겨우 9개월밖에 안되서 ^^
저는 트랙백거는거 한 3달만에 터득한 것 같은데 대단하십니다 ^^
글 퍼가셔도 되는데 출처만 남기시면 돼요 ^^
그럼 앞으로 블로그를 잘 이끌어나가세요 ^^
-
-
낭만공돌이
적어주신 예제. 간단하고 이해하기 쉬워서 너무 잘 보았습니다!
다만 한가지 질문이 있는데.
client 단에서 첫번째로 보낸 메시지를 userID 로 받아서 "접속한 사용자의 ID는 xxx 입니다."
라고 뿌려주시는 것 같은데.
저는 아무래도 그 첫번째 메시지가 계속
<policy-file-request/>
인 것 같습니다.
덕분에 첫번째 채팅 메시지가 ID로 인식되는군요 ㅠ
이거 어떻게 해야 해결될까요..
인터넷을 뒤져서
classdomain.xls 파일을 만들라는 조언도 봤는데, 그대로 해도 잘 안되는군요;;;;
ㅠㅠ
혹시 도와주실 수 있을까요...ㅠ-
머드초보
아....무슨얘기인지 잘 모르겠네요-_-;
접속한 아이디라면...아이디를 그냥 서버에 넘겨주면 될듯한데요
서버단에서 처리해야할 듯 합니다 ^^
-
-
-
-
-
-
김경순
고맙습니다. 저도 플랙스 채팅 프로그램을 Client/Server로 만드는 중인데 좋은 자료여서
참고하도록 하겠습니다. 감사합니다. -
-
-
채팅프로그램은 LCDS를 이용해서 메시지서비스를 하게 되면 매우 간단하게 작성할 수 있습니다.
하지만, 뭔가 자유도가 부족하군요-_-; 그래서 서버를 자바로하고 클라이언트를 FLEX로 한 프로그램을 만들어봤습니다.
플렉스 소켓으로 삽질하시는 분들께 도움이 되고자--;(뭐 도움은 안되겠지만-_-;)
JAVA 6.0에서 테스트했습니다.
서버(JAVA)
ChatServer.java 와 ChatThread.java 두개의 파일입니다.
ChatServer클래스에는 main클래스가 있으며, accept()를 호출해서 클라이언트의 접속을 기다리다가 접속이 되면 스레드를 시작을 하게 되는 구조입니다.
ChatServer.java
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();
}
}
우선 startServer를 보시면, ServerSocket을 생성합니다. 그리고, HashMap을 하나 생성하는데 이것은 id와 PrintWriter, 즉, 해당 스레드마다 각각의 PrintWriter를 저장해서 다른 클라이언트에게 뿌려줄 때 사용됩니다.
그래서 Thread만들 때 hashMap을 같이 넘겨주도록 합니다.
ChatThread.java
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();
}
}
}
생성자를 보게 되면 해당클라이언트와 통신을 하도록 하는 PrintWriter와 BufferedReader를 만듭니다.
우선 접속하게 되면 클라이언트쪽에서 id를 보내도록 되어있죠.(나중에 클라이언트할때 설명-_-;)
그리고, run메소드를 보시게 되면, BuferedReader에서 readLine을 하게 되어서, 채팅데이터를 받게 되면, broadcast함수를 호출하게 되어, 연결되어 있는 모든 클라이언트에게 채팅데이터를 보냅니다.
hashmap에 printwriter를 저장해서 가능하죠 ^^
※플렉스는 UTF-8로 데이터를 전송하게 됩니다. 그래서 데이터를 받을 때 UTF-8로 받아야겠죠?
pw = new PrintWriter(
new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
br = new BufferedReader(
new InputStreamReader(sock.getInputStream(), "UTF-8"));
위와 같이 "UTF-8"이라고 해주면 돼요 ^^
UTF-8빼면 한글이 깨져버려요 ^^
길이너무 길어져서 다음 글로-_-;
-
-
머드초보
앗~ 투명아이 가족이신가보군요 ^^
저도 투명아이 가족입니다 ^^
저도 플렉스에 관심이 많아서 삽질 중입니다 ^^
반갑습니다 ^^
-
-
-_-;;
로컬에서는 도는데 결정적으로 원격으로는 문제가 있네요...
방법을 찾아보고는 있습니다만... 좋은 방법이 없을까요?-
머드초보
아 그문제는 저도 고생했었는데, 보안 샌드박스 문제 입니다.
소켓으로 원격으로 접속할 때에는 crossdomain.xml파일을 먼저 요청을 합니다. 즉 내가 이서버에 접속해도 되나 하는 보안파일을 먼저 보내주는 프로세스를 만들어야합니다.
Policy Server프로그램을 하나 만들면 되는데, 만들어진 것이 많아 가져다 쓰셔도 될 듯합니다^^
http://code.google.com/p/assql/wiki/SecurityInformation
-
-
시원
XMLSocket 보안 샌드박스 문제때문에 이틀째 고생중입니다.
머드 초보님처럼 저도 Policy Server프로그램을 만들고 있는데 어디서 엉키는건지
이상하게 접속이 안되네요.....-.-;
혹시 시간나시면 님이 말씀하신 http://code.google.com/p/assql/wiki/SecurityInformation 예제로
Policy Server 만든경험을 저와같이 고생하는 중생들을 위해 설명을 곁들여
올려주시면 안될까용??? ^^;-
머드초보
안녕하세요~
저도 예전에 그걸로 삽질을 한적이 있었는데요^^
의외로 간단해요.
그냥 Policy Server프로그램을 서버에 띄워놓으면 swf가 그 서버에서 plicy파일을 요청합니다. 그걸 던져주는 걸 만들면 되는건데
음...
저 예제로 하면 되는데...
나중에 시간날 때 한번 글을 써보겠습니다 ㅠㅠ
-
-
-
머드초보
네네~
그건 크로스도메인 문제인데요.
서버측에서 843포트로 크로스도메인파일을 전송해줘야합니다.
그거 관련된 것은 검색해보면 나오는데,
나중에 이 글에 대해서 포스팅을 할께요.
많이들 헷깔려하시는 것 같아서 ㅠㅠ
-

