package MultiThread;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
public class ChatServer {
Vector<ClientThread> vc;
public ChatServer(){
vc=new Vector<ClientThread>();
ServerSocket server=null;
try {
server=new ServerSocket(8008);
} catch (Exception e) {
System.err.println("Error in ChatServer");
e.printStackTrace();
System.exit(1); // 1은 비정상적인 종료
}
System.out.println("++++++++++++++++++++++");
System.out.println("클라이언트의 접속을 기다리고 있습니다");
System.out.println("++++++++++++++++++++++");
try {
while (true) {
Socket sock=server.accept();
ClientThread ct =new ClientThread(sock);
ct.start();
vc.add(ct);
}
} catch (Exception e) {
System.err.println("Error in Socket");
e.printStackTrace();
System.exit(1);
}
}
//접속된 모든 Client에게 메세지 전송
public void sendAllClients(String msg){
for(int i=0;i<vc.size();i++){
ClientThread ct=vc.get(i);
ct.sendMessage(msg);
}
}
//Vector에서 ClientThread를 제거
public void removeClient(ClientThread ct){
vc.remove(ct);
}
class ClientThread extends Thread{
Socket sock;
String user;
BufferedReader in; //Client가 보내는 메세지를 읽는다
PrintWriter out; //Client로 메세지를 보낸다.
public ClientThread(Socket sock){
this.sock=sock;
try {
in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
out=new PrintWriter(sock.getOutputStream(),true); //auto flush
System.out.println(sock+"접속됨 ...");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//Client가 제일 처음 받는 메세지
out.println("사용하실 아이디를 입력하세요");
user=in.readLine();
sendAllClients("["+user+"] 님께서 입장 하셨습니다");
String data=null;
while ((data=in.readLine())!=null) {
sendAllClients("["+user+"]"+data);
}
in.close();
out.close();
} catch (Exception e) {
removeClient(this);
e.printStackTrace();
System.err.println(sock+"끊어짐....");
}
}
public void sendMessage(String msg){
out.println(msg);
}
}
public static void main(String[] args){
new ChatServer();
}
}
===================
package MultiThread;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ChatClient extends JFrame implements ActionListener, Runnable {
JButton connect, send;
JTextField hostTxt, chatTxt;
JTextArea ta;
JScrollPane scroll;
JScrollBar sb;
BufferedReader in;
PrintWriter out;
int port = 8008;
String user;
public ChatClient() {
setSize(350, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("MyChat1.0");
JPanel p1 = new JPanel();
p1.add(hostTxt = new JTextField("127.0.0.1", 20));
p1.add(connect = new JButton("Connect"));
add(p1, BorderLayout.NORTH);
ta = new JTextArea(10, 30);
ta.setBackground(Color.ORANGE);
ta.setForeground(Color.BLUE);
scroll = new JScrollPane(ta, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
sb = scroll.getVerticalScrollBar();
add(scroll);
JPanel p2 = new JPanel();
p2.add(chatTxt = new JTextField(20));
p2.add(send = new JButton("보내기"));
add(p2, BorderLayout.SOUTH);
connect.addActionListener(this);
chatTxt.addActionListener(this);
send.addActionListener(this);
setResizable(false);
setVisible(true);
}
// 서버로 부터 들어오는 메시지를 TextArea로 append한다.
@Override
public void run() {
try {
while (true) {
ta.append(in.readLine() + "\n");
ta.transferFocus();
// 화면에 보여진후 실행
sb.setValue(sb.getMaximum());
}
} catch (Exception e) {
System.err.println("Error in run");
e.printStackTrace();
System.exit(1);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == connect) {
connect(hostTxt.getText(), port);
connect.setEnabled(false);
hostTxt.setEditable(false);
} else if (e.getSource() == chatTxt || e.getSource() == send) {
if (user == null) {
// 최초 아이디 입력할때
user = chatTxt.getText();
setTitle(getTitle() + " [" + user + "]");
ta.setText("");
}
// chatTxt 입력된 값을 서버로 보낸다.
out.println(chatTxt.getText());
chatTxt.setText("");
chatTxt.requestFocus();
}
}
public void connect(String host, int port) {
try {
Socket sock = new Socket(host, port);
in = new BufferedReader(
new InputStreamReader(sock.getInputStream()));
out = new PrintWriter(sock.getOutputStream(), true/* auto flush */);
} catch (Exception e) {
System.err.println("Error in connect");
e.printStackTrace();
System.exit(1);
}
new Thread(this).start();
}
public static void main(String[] args) {
new ChatClient();
}
}
'Java' 카테고리의 다른 글
a Simple example copying a file (0) | 2015.01.03 |
---|---|
InputStream / OutputStream 데이터 흐름 (0) | 2015.01.02 |
Multi Chatting (0) | 2014.12.30 |
Socket 통신으로 Image전송 (0) | 2014.12.29 |
KeyListener (0) | 2014.12.28 |