import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.URLDecoder;

import java.net.URLEncoder;


import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextField;


public class ChatWin extends JFrame {


    private static final long serialVersionUID = 1L;

    JTextField tf;

    JPanel p;

    TextHandler handler = null;


    Socket socket;

    PrintWriter out = null;

    String name;


    ChatWin(Socket socket, String name) {


    this.setTitle(name + "'s Chat Window");

    this.setSize(600, 100);

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    p = new JPanel();

    p.setLayout(new FlowLayout());

    

    tf = new JTextField(40);

    p.add(tf);

    

    this.setContentPane(p);

    this.setVisible(true);


    handler = new TextHandler();

    tf.addActionListener(handler);


    //-------------------------------------------------------------------

        

    this.socket = socket;        

    try {

out = new PrintWriter(this.socket.getOutputStream(), true);

        this.name = name;

            

        //서버에 입력한 사용자이름을 보내준다.

        out.println(URLEncoder.encode(name, "UTF-8"));


    } catch(Exception e) {

        System.out.println("예외S3:"+e);

    }


}

    public int getCharNumber(String str, char c) {

   int count = 0;

   for(int i=0;i<str.length();i++) {

        if(str.charAt(i) == c)

            count++;

   }

   return count;

    }

//Inner Class TextHandler

class TextHandler implements ActionListener {

String sToHeader = "";

public void actionPerformed(ActionEvent e) {

try {

String msg = tf.getText();

msg  = URLDecoder.decode(msg, "UTF-8");

//System.out.println("msg : " + msg);

if ("".equals(msg)) return;

int i = getCharNumber(msg, ' ');

if (msg.equals("q") || msg.equals("Q")) { // 종료

out.println(URLEncoder.encode(sToHeader + msg, "UTF-8"));

System.out.println("퇴장하셨습니다.");

try {

out.close();

socket.close();

} catch (IOException e1) {

System.out.println("예외 q : " + e1);

}

}

else if((msg.indexOf("/to") > -1) && (i == 1)) { // 고정 대상인 상태에서 고정 .

if(sToHeader.equals("")) { //일반 상태 -> 고정 상태로

int idx = msg.indexOf(" ");

//System.out.println("idx" + idx);

String name = msg.substring(idx+1);

//System.out.println("name : " + name);

sToHeader = "/to " + name + " ";

//System.out.println("toheader : " + sToHeader);

out.println(URLEncoder.encode(sToHeader + msg, "UTF-8"));

}

// else if ((sToHeader.contains("/to")) && (name != ){ //고정 상태 -> 다른 상대와 고정 상태로

//

// }

else { // 고정 상태 -> 일반상태로

sToHeader = "";

}

}

else if(msg.indexOf("/to") > -1) { // 고정 대상인 상태에서 임시 대상에게 귓속말

out.println(URLEncoder.encode(sToHeader + msg, "UTF-8"));

else { // 일반 전체 대화

out.println(URLEncoder.encode(sToHeader + msg, "UTF-8"));

}

        tf.setText("");

} catch (Exception e2) {

System.out.println("예외e2 : " + e2);

}

}

}


}


--

cmd창으로 클라이언트를 불러 서버에 연결한다음에 사용할 name을 적으면 별도의 sender창이 나온다.

cmd창으로 보내면 다른사람의 채팅내용에 씹히는 경우가 생겨서 보내는 채팅은 cmd창으로 채팅하는 게 아니고 sender 창으로 진행한다.

--

같은 방에 있는 사람들에게 채팅이 된다.

--

다른 명령어는 /명령어 로 진행한다.

--

귓속말 중 일회성 귓속말과 고정귓속말이 있는데

/to 사용자이름 내용     <- 이게 기본 틀이다.

/to 사용자이름 내용 으로 보내면 일회성 귓속말이고
/to 사용자이름 으로 보내면 고정귓속말로 고정이된다.
그다음부턴 사용자는 내용만 보내면 되는데 서버측으로 보낼 때 /to 사용자이름을 붙여보내면 된다. !중요!

그러면 서버에서는 /to 사용자이름 내용 으로 받기 때문에 사용자는 고정귓속말로 인식하게 된다.

해제할때는 /to 사용자이름으로 해제한다.

블로그 이미지

허니눈

,