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);
}
}
}
}
그러면 서버에서는 /to 사용자이름 내용 으로 받기 때문에 사용자는 고정귓속말로 인식하게 된다.
해제할때는 /to 사용자이름으로 해제한다.
'프로젝트 > Java 프로젝트' 카테고리의 다른 글
채팅하기 2. 귓속말(고정귓속말, 일회성귓속말) (0) | 2018.09.25 |
---|---|
채팅하기 1. 전체 채팅, 방 채팅 (0) | 2018.09.24 |
Connection Pool (0) | 2018.09.24 |
클라이언트측 (0) | 2018.09.24 |
java 채팅프로그램 서버측 기본 틀 (0) | 2018.09.24 |