336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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
Posted by af334