시소당
import java.io.*;
import java.net.*;
import java.util.*;
public class MultiServer{
ServerSocket sc;
Vector users;
UserThread user;
Enumeration usersEn;
public static void main(String args[]){
MultiServer ms=null;
try{
ms=new MultiServer();
ms.welcomeUsers();
}catch(Exception e){
System.out.println("main:"+e);
}
}
public MultiServer() throws Exception{
sc=new ServerSocket(5555);
users=new Vector();
}
public void welcomeUsers() throws Exception{
while(true){
Socket socket=sc.accept();
user=new UserThread(socket, this);
addUser(user);
user.setDaemon(true);
user.start();
}
}
public synchronized void addUser(Thread userThread){
users.add(userThread);
System.out.println("current Users : "+users.size());
}
public synchronized void broadCast(String message){
usersEn=users.elements();
while(usersEn.hasMoreElements()){
((UserThread)usersEn.nextElement()).sendMessage(message);
}
}
public void broadUserList(){
String re="";
for(int i=0; i<users.size(); i++)
re+=((UserThread)users.get(i)).nickName+"|";
re=re.substring(0,re.length()-1);
broadCast("001"+re);
}
public synchronized void deleteFromServer(UserThread userThread){
users.remove(userThread);
System.out.println(users.size()+" left in server");
}
}
class UserThread extends Thread{
Socket socket;
MultiServer server;
BufferedReader reader;
BufferedWriter writer;
String userMsg;
String nickName;
public UserThread(Socket user_socket, MultiServer main_server) throws Exception{
socket=user_socket;
server=main_server;
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
}
public void run(){
try{
while((userMsg=reader.readLine()) != null){
if(userMsg.startsWith("001")){ // 사용자리스트
nickName=userMsg.substring(3);
server.broadCast("002새로운 사용자["+nickName+"]님 입장");
server.broadUserList();
}else if(userMsg.startsWith("002")){ // 일반대화
server.broadCast("002"+userMsg.substring(3));
}else{
}
}
}catch(SocketException se){
//클라이언트와의 연결 오류
}catch(Exception e){
System.out.println("run:"+e);
}
closeUser();
}
public void sendMessage(String server_message){
try{
System.out.println("sendMsg:"+server_message);
writer.write(server_message+"\n");
writer.flush();
}catch(Exception e){
System.out.println("sendMessage:"+e);
}
}
public void closeUser(){
try{
server.deleteFromServer(this);
writer.close();
reader.close();
socket.close();
}catch(Exception e){
System.out.println("closeUser:"+e);
}
}
}
-----------------------------------------------
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.StringTokenizer;
class PromptClient extends Frame implements ActionListener{
Thread listenThread;
Socket socket;
BufferedReader reader;
BufferedWriter writer;
String server_msg;
String user_msg;
String name;
TextArea ta;
TextField tf;
List list;
Button b;
Panel p1,p2;
public PromptClient(String userName) throws Exception{
super("["+userName+"]님의채팅창");
this.name=userName;
p1=new Panel(); p2=new Panel();
ta=new TextArea();
tf=new TextField(40);
tf.addActionListener(this);
list=new List();
b=new Button("나가기");
p1.setLayout(new GridLayout(1,2));
p1.add(ta); p1.add(list);
p2.add(tf); p2.add(b);
add(p1,"Center"); add(p2,"South");
name=userName;
socket=new Socket("localhost",5555);
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
sendMessage("001"+userName+"\n");
}
public void listenMessage(){
listenThread=new Thread(){
public void run(){
try{
while( (server_msg=reader.readLine()) != null ){
System.out.println(server_msg);
if(server_msg.startsWith("001")){
list.removeAll();
StringTokenizer st = new StringTokenizer(server_msg.substring(3),"|");
while (st.hasMoreTokens())
list.add((String)st.nextToken());
}else if(server_msg.startsWith("002")){
ta.append(server_msg.substring(3)+"\n");
}
}
closeAll();
}catch(Exception e){
System.out.println(e);
closeAll();
}
}
};
listenThread.setDaemon(true);
listenThread.start();
}
public void closeAll(){
try{
reader.close();
writer.close();
socket.close();
System.exit(0);
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
public void sendMessage(String msg){
try{
writer.write(msg+" \n");
writer.flush();
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
public void actionPerformed(ActionEvent ae){
sendMessage("002["+name+"]"+tf.getText());
tf.setText("");
}
public static void main(String args[]){
PromptClient cl=null;
try{
cl=new PromptClient(args[0]);
cl.setBounds(200,200,400,400);
cl.setVisible(true);
cl.listenMessage();
}catch(Exception e){
cl.closeAll();
}
}
}