java 자바 귓속말 소스 질문입니다.

java 자바 귓속말 소스 질문입니다.

작성일 2014.06.11댓글 1건
    게시물 수정 , 삭제는 로그인 필요

--클라
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class PClient extends Frame implements Runnable, ActionListener{

static String IP = "localhost";

TextArea cView=new TextArea("", 1,1,1); 
TextField cBox=new TextField("");    
TextField idBox=new TextField();  
TextField roomBox=new TextField("0"); 


Label pInfo=new Label("월드채팅: 명");
Label pInfo2=new Label("친구목록: 명");
Label pInfo4=new Label("@@@");
java.awt.List pList=new java.awt.List();
java.awt.List pList2=new java.awt.List();
Button aButton=new Button("그룹채팅입장");  
Button bButton=new Button("월드채팅으로");  
Button cButton=new Button("친구 관리");
Button dButton=new Button("파일 전송");
Button eButton=new Button("기능 설명");
BufferedReader reader;  
PrintWriter writer;   
Socket socket;           
int roomNumber=1;         
String idName=null;      
int    isRoot=0;
public PClient(){   
setLayout(null);             
Panel p=new Panel();
p.setLayout(new GridLayout(3,3));
p.add(new Label("아 이 디 :", 1));p.add(idBox);//idBox.setEditable(false);
p.add(new Label("방 번 호 :", 1)); p.add(roomBox);
p.add(aButton); p.add(bButton);
aButton.setEnabled(false);
p.setBounds(490,50, 200,100);
cView.setEditable(false); 

Panel p5=new Panel();
p5.setLayout(new BorderLayout());
p5.add(eButton,"North"); 
p5.add(new Label("방 장 :", 1),"West");
p5.add(pInfo4,"Center");
p5.add(dButton,"South");
p5.setBounds(490,180,200,100);
Panel p2=new Panel();
p2.setLayout(new BorderLayout());
p2.add(pInfo,"North"); 
p2.add(pList,"Center");
p2.setBounds(490,280,200,100);

Panel p4=new Panel();
p4.setLayout(new BorderLayout());
p4.add(pInfo2,"North");
p4.add(pList2,"Center");
p4.add(cButton,"South");
p4.setBounds(490,380,200,200);

Panel p3=new Panel();
p3.setLayout(new BorderLayout());
p3.add(cView,"Center");
p3.add(cBox, "South");
p3.setBounds(10, 50, 470,530);

add(p);  add(p5); add(p2);add(p4); add(p3);

cBox.addActionListener(this);
aButton.addActionListener(this);
bButton.addActionListener(this);
cButton.addActionListener(this);
dButton.addActionListener(this);
eButton.addActionListener(this);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
setSize(700,600);
setVisible(true);
connect();
}

public void actionPerformed(ActionEvent ae){
if(ae.getSource()==cBox){       
String msg=cBox.getText();  
if(msg.length()==0)return;
if(msg.length()>=30)msg=msg.substring(0,30);
try{ 
writer.println("[MSG]"+msg); 
cBox.setText(""); 
}catch(Exception ie){}
}

else if(ae.getSource()==aButton){  
try{

if(Integer.parseInt(roomBox.getText())<1){
cView.append("방번호는 1이상이어야합니다.\n");
return; 
}
writer.println("[ROOM]"+Integer.parseInt(roomBox.getText()));
roomBox.setEditable(false);
cView.setText("");
}catch(Exception ie){
cView.append("입력하신 사항에 오류가 았습니다.\n"); 
}
}

else if(ae.getSource()==bButton){     
try{
goToWaitRoom();
}catch(Exception e){}
}
else if(ae.getSource()==cButton){    
try{
FindFriend FF=new FindFriend();
}catch(Exception e){}
}
else if(ae.getSource()==dButton){     
try{
}catch(Exception e){}
}
else if(ae.getSource()==eButton){  
try{
}catch(Exception e){}
}
}

void goToWaitRoom(){   
if(idName==null){
String name=idBox.getText().trim();
if(name.length()<=2 || name.length()>10){
cView.append("아이디는 3~10자만 허용합니다.\n");
idBox.requestFocus();
return;
}
idName=name;
writer.println("[NAME]"+idName);  
idBox.setText(idName);
idBox.setEditable(false);
roomBox.setEnabled(true);
cView.setText("");
writer.println("[ROOM]0");
cView.setText("월드채팅 입장.\n");
roomBox.setText("0");
roomBox.setEnabled(true);
aButton.setEnabled(true);
bButton.setEnabled(false);
}

public void run(){
String msg;             
try{
while((msg=reader.readLine())!=null){



if(msg.startsWith("[ROOM]")){ 
if(!msg.equals("[ROOM]0")){  
aButton.setEnabled(false);
bButton.setEnabled(true);
cView.append(msg.substring(6)+"번 방에 입장하셨습니다.\n");
}
else cView.append("대기실에 입장하셨습니다.\n");

roomNumber=Integer.parseInt(msg.substring(6));  
}
else if(msg.startsWith("[FULL]")){   
cView.append("방이 차서 입장할 수 없습니다.\n");
}
else if(msg.startsWith("[PLAYERS]")){  
nameList(msg.substring(9));
}

else if(msg.startsWith("[ENTER]")){   
pList.add(msg.substring(7));
playersInfo();
cView.append("["+ msg.substring(7)+"]님이 입장하였습니다.\n");
}
else if(msg.startsWith("[EXIT]")){     
pList.remove(msg.substring(6));      
playersInfo();          
cView.append("["+msg.substring(6)+
"]님이 다른 방으로 입장하였습니다.\n");

}

else if(msg.startsWith("[DISCONNECT]")){ 
pList.remove(msg.substring(12));
playersInfo();
cView.append("["+msg.substring(12)+"]님이 접속을 끊었습니다.\n");

}




else cView.append(msg+"\n");
}
}catch(IOException ie){
cView.append(ie+"\n");
}
cView.append("접속이 끊겼습니다.\n");
}



void playersInfo(){      
int count=pList.getItemCount();
if(roomNumber==0)
pInfo.setText("월드 채팅: "+count+"명");
else pInfo.setText(roomNumber+" 번 방: "+count+"명"); 

}
.
void nameList(String msg){
pList.removeAll();
StringTokenizer st=new StringTokenizer(msg, "\t");
while(st.hasMoreElements())
pList.add(st.nextToken());
playersInfo();
}

void connect(){        
try{
cView.append("서버에 연결시작.\n");
socket=new Socket(IP, 8888);
cView.append("연결 성공.\n");
cView.append("아이디를  입력하고 대기실입장을 누르세요.\n");
reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
writer=new PrintWriter(socket.getOutputStream(), true);
new Thread(this).start();
}catch(Exception e){
cView.append(e+"\n\n연결 실패..\n"); 
}
}
public static void main(String[] args){
new PClient();
}
}

--서버
import java.net.*;
import java.io.*;
import java.util.*;
public class PServer{
private ServerSocket server;
private MManager mMan=new MManager();
public PServer(){}
void startServer(){
try{
server=new ServerSocket(8888);
System.out.println("서버소켓이 생성완료.");
while(true){
Socket socket=server.accept();
CThread ot=new CThread(socket);
ot.start();
mMan.add(ot);
System.out.println("접속자 수: "+mMan.size());
}
}catch(Exception e){
System.out.println(e); 
}
}
public static void main(String[] args){
PServer server=new PServer();
server.startServer();
}

class CThread extends Thread{
private int roomNumber= 1;        
private String idName=null;     
private Socket socket;            

private boolean ready=false;

private BufferedReader reader;     
private PrintWriter writer;        
CThread(Socket socket){ 
this.socket=socket;
}
Socket getSocket(){             
return socket; 
}
int getRoomNumber(){         
return roomNumber;
}
String getUserName(){            
return idName;
}
boolean isReady(){            
return ready;
}
public void run(){
try{
reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
writer=new PrintWriter(socket.getOutputStream(), true);

String msg;                

while((msg=reader.readLine())!=null){

if(msg.startsWith("[NAME]")){
idName=msg.substring(6);         
}

else if(msg.startsWith("[ROOM]")){
int roomNum=Integer.parseInt(msg.substring(6));
if( !mMan.isFull(roomNum)){          

if(roomNumber!= 1)
mMan.sendToOthers(this, "[EXIT]"+idName);

roomNumber=roomNum;

writer.println(msg);

writer.println(mMan.getNamesInRoom(roomNumber));

mMan.sendToOthers(this, "[ENTER]"+idName);
}
else writer.println("[FULL]");    
}


else if(msg.startsWith("[MSG]")){//msg로 시작될때
mMan.sendToRoom(roomNumber,
"["+idName+"]: "+msg.substring(5));
// 룸넘버 내부에 있는 접속자들한테  idname + 메세지 뿌려줘라 
}
}
}catch(Exception e){
}finally{
try{
mMan.remove(this);
if(reader!=null) reader.close();
if(writer!=null) writer.close();
if(socket!=null) socket.close();
reader=null; writer=null; socket=null;
System.out.println(idName+"님이 접속을 끊었습니다.");
System.out.println("접속자 수: "+mMan.size());
mMan.sendToRoom(roomNumber,"[DISCONNECT]"+idName);
}catch(Exception e){}
}
}
}
class MManager extends Vector{       
MManager(){}
void add(CThread ot){         
super.add(ot);
}
void remove(CThread ot){      
super.remove(ot);
}
CThread getOT(int i){           
return (CThread)elementAt(i);
}
Socket getSocket(int i){              
return getOT(i).getSocket();
}

void sendTo(int i, String msg){
try{
PrintWriter pw= new PrintWriter(getSocket(i).getOutputStream(), true);
pw.println(msg);
}catch(Exception e){}  
}
int getRoomNumber(int i){           
return getOT(i).getRoomNumber();
}
synchronized boolean isFull(int roomNum){   
if(roomNum==0)return false;                

int count=0;
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i))count++;
if(count>=10)return true;
return false;
}
void sendToRoom(int roomNum, String msg){
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i))
sendTo(i, msg);
}
void sendToOthers(CThread ot, String msg){
for(int i=0;i<size();i++)
if(getRoomNumber(i)==ot.getRoomNumber() && getOT(i)!=ot)
sendTo(i, msg);
}
String getNamesInRoom(int roomNum){
StringBuffer sb=new StringBuffer("[PLAYERS]");
for(int i=0;i<size();i++)
if(roomNum==getRoomNumber(i))
sb.append(getOT(i).getUserName()+"\t");
return sb.toString();
}
}
}

대충이런씩으로 구성되있는대 여기서 귀속말 소스쫌 추가해주세요 ^^ 


#java 자바스크립트 실행 #java 자바 #west java 자바 #자바 import java.util.* #자바 java.lang.nullpointerexception #자바 java.lang.arrayindexoutofboundsexception #자바 환경변수 java_home #자바스크립트 java 함수 호출 #자바 java.util.nosuchelementexception #자바 java.util.date

profile_image 익명 작성일 -

클라이언트는 그대로

 

서버만 좀 바꾸면 됩니다.

 

package chat2;

import java.net.*;
import java.io.*;
import java.util.*;

public class PServer
{

    private ServerSocket server;
    private MManager mMan = new MManager();

    public PServer()
    {
    }

    void startServer()
    {
        try
        {
            server = new ServerSocket(8888);
            System.out.println("서버소켓이 생성완료.");
            while (true)
            {
                Socket socket = server.accept();
                CThread ot = new CThread(socket);
                ot.start();
                mMan.add(ot);
                System.out.println("접속자 수: " + mMan.size());
            }
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }

    public static void main(String[] args)
    {
        PServer server = new PServer();
        server.startServer();
    }

    class CThread extends Thread
    {

        private int roomNumber = 1;
        private String idName = null;
        private Socket socket;

        private boolean ready = false;

        private BufferedReader reader;
        private PrintWriter writer;

        CThread(Socket socket)
        {
            this.socket = socket;
        }

        Socket getSocket()
        {
            return socket;
        }

        int getRoomNumber()
        {
            return roomNumber;
        }

        String getUserName()
        {
            return idName;
        }

        boolean isReady()
        {
            return ready;
        }

        public void run()
        {
            try
            {
                reader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));
                writer = new PrintWriter(socket.getOutputStream(), true);

                String msg;

                while ((msg = reader.readLine()) != null)
                {

                    if (msg.startsWith("[NAME]"))
                    {
                        idName = msg.substring(6);
                    } else if (msg.startsWith("[ROOM]"))
                    {
                        int roomNum = Integer.parseInt(msg.substring(6));
                        if (!mMan.isFull(roomNum))
                        {

if (roomNumber != 1)
{
mMan.sendToOthers(this, "[EXIT]" + idName);
}

roomNumber = roomNum;

writer.println(msg);

writer.println(mMan.getNamesInRoom(roomNumber));

mMan.sendToOthers(this, "[ENTER]" + idName);
                        } else
                        {
writer.println("[FULL]");
                        }
                    } else if (msg.startsWith("[MSG]"))
                    {//msg로 시작될때
                        String tok[] = msg.substring(5).split("[ ]+");//[귓말명령어] [보낼아이디] [보낼메세지]를 구분
                       
                        if (tok.length > 2 && tok[0].equals("/w"))//단어가 2개 이상이고 명령어가 /w 이면
                        {
msg = msg.substring(5);//[MSG]를 삭제

int n = msg.indexOf(tok[2]);//보낼메세지 위치를 찾기
       
mMan.sendToUser("[" + idName + "->]: " + msg.substring(n),
tok[1]);

                        } else
                        {
mMan.sendToRoom(roomNumber,
"[" + idName + "]: " + msg.substring(5));
// 룸넘버 내부에 있는 접속자들한테 idname + 메세지 뿌려줘라
                        }
                    }
                }
            }
            catch (Exception e)
            {
            }
            finally
            {
                try
                {
                    mMan.remove(this);
                    if (reader != null)
                    {
                        reader.close();
                    }
                    if (writer != null)
                    {
                        writer.close();
                    }
                    if (socket != null)
                    {
                        socket.close();
                    }
                    reader = null;
                    writer = null;
                    socket = null;
                    System.out.println(idName + "님이 접속을 끊었습니다.");
                    System.out.println("접속자 수: " + mMan.size());
                    mMan.sendToRoom(roomNumber, "[DISCONNECT]" + idName);
                }
                catch (Exception e)
                {
                }
            }
        }
    }

    class MManager extends Vector
    {

        MManager()
        {
        }

        void add(CThread ot)
        {
            super.add(ot);
        }

        void remove(CThread ot)
        {
            super.remove(ot);
        }

        CThread getOT(int i)
        {
            return (CThread) elementAt(i);
        }

        Socket getSocket(int i)
        {
            return getOT(i).getSocket();
        }

        void sendTo(int i, String msg)
        {
            try
            {
                PrintWriter pw = new PrintWriter(getSocket(i).getOutputStream(), true);
                pw.println(msg);
            }
            catch (Exception e)
            {
            }
        }

        int getRoomNumber(int i)
        {
            return getOT(i).getRoomNumber();
        }

        synchronized boolean isFull(int roomNum)
        {
            if (roomNum == 0)
            {
                return false;
            }

            int count = 0;
            for (int i = 0; i < size(); i++)
            {
                if (roomNum == getRoomNumber(i))
                {
                    count++;
                }
            }
            if (count >= 10)
            {
                return true;
            }
            return false;
        }
        
        void sendToUser(String msg, String user)
        {
            for (int i = 0; i < size(); i++)
            {
                if(getOT(i).idName.equals(user))//보낼 아이디와 같으면 메세지 보내기
                {
                    sendTo(i, msg);
                }
            }
        }

        void sendToRoom(int roomNum, String msg)
        {
            for (int i = 0; i < size(); i++)
            {
                if (roomNum == getRoomNumber(i))
                {
                    sendTo(i, msg);
                }
            }
        }       
       

        void sendToOthers(CThread ot, String msg)
        {
            for (int i = 0; i < size(); i++)
            {
                if (getRoomNumber(i) == ot.getRoomNumber() && getOT(i) != ot)
                {
                    sendTo(i, msg);
                }
            }
        }

        String getNamesInRoom(int roomNum)
        {
            StringBuffer sb = new StringBuffer("[PLAYERS]");
            for (int i = 0; i < size(); i++)
            {
                if (roomNum == getRoomNumber(i))
                {
                    sb.append(getOT(i).getUserName() + "\t");
                }
            }
            return sb.toString();
        }
    }
}

자바(JAVA) 소스 질문입니다..

아래는 제가 만들고 있는 자바 소스인데요 package Client; import javax.swing.*; import java.awt.*; import java.awt.event.*; import Client....

(javascript) 소스 분석 질문좀할께요.....

JavaScript 소스인데요... 분석좀 부탁드릴께요... 줄 마다 주석으로 설명좀 달아주세요ㅠ 공부시작한지 얼마안되서 모르는게 너무 많네요.. 점점 커지는 텍스트...

태그,자바소스질문입니다. [html...

... 즐겨찾기에 추가하기나 메인페이지로 지정하는 javascript소스 알려주세요 :) 웹상 페이지를 접속하자마자 새창 띠우기 웹상에서 페이지를 접속하자마자 뜨는...

자바 소스질문

java 공부하고 있는데 연습하면서 코딩하다 보니 궁금한 게 있어 질문합니다.ㄴ 빨간 화살표 자리에 ,2를... 아직 자바 꿈나무입니다. 한심하게 보이더라도...

자바 소스 질문입니다.

import java.awt.*; import java.awt.event.*; public class ActionEventEx extends Frame... 위에 소스의 정확하고 이해하기 쉽게 주석좀 달아주실분... 그리고...

자바 소스 질문입니다.

... 번호를 생성하는 클래스 소스를 올리시지 않았기때문에 적절하게 주석처리 하고 만든 소스이니 바꿔서 쓰세요.. import java.awt....