채팅프로그램은 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빼면 한글이 깨져버려요 ^^
길이너무 길어져서 다음 글로-_-;
클라이언트
Trackback URL : http://mudchobo.tomeii.com/tt/trackback/152
-
Tracked from 뿌꾸네집 2009/10/06 19:48
일단 자바 부분작업을 너무많이 도와준 병선이한테 감사하다 존나 몇년만에 말걸었는데도 존나 친절하게 도와줬다 .. 존나 고맙다 당순히 난 소켓통신에 대한 개념을 잡기위해서 처음 시작했다 나한테 너무나 큰 도움이 되었다 자바 채팅 서버소스는 http://mudchobo.tomeii.com/tt/152 ( 머드초보 ) 이분이 만든 소스를 기반으로 플랫시 10 에 맞는 보안 코드와 그리고 소켓을 통해서 받는 바이트 데이터를 조금더 수정하고 이것저것 많이 수..
당신의 의견을 작성해 주세요.
안녕하세요.
;
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
안녕하세요 답변이 완전 늦었네요-_-
그건 왠지 swc관련 에러같아보이네요.
swc가 없다고 나오는 것 같아요 ㅠ
Object - object 구조네요? Object-Embed 구조를 잘못적으신건가요?
IE6인가? 빼고는 다 되는 걸로 알고 있습니다^^
swfobject에서는 저 방법을 예제로 보여주고 있더라구요.