package demo.chat;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
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.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ChatClient extends JFrame {

	private JTextArea messageTextArea = new JTextArea();
	private JTextArea inputTextArea = new JTextArea();
	private JButton sendButton = new JButton("전송");
	
	public ChatClient() {
		
		try {
			Socket socket = new Socket("192.168.10.254", 8000);
			
			PrintWriter out = new PrintWriter(socket.getOutputStream());
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
			// 수신 전용 작업을 실행하는 스레드 생성
			ChatClientThread cct = new ChatClientThread();
			// 서버가 전송한 메시지를 수신하는 스트림 전달
			cct.setIn(in);
			// 메시지를 표현할 콘트롤 전달
			cct.setMessageTextArea(messageTextArea);
			
			cct.start();
			
			setTitle("심플 채팅");
			setLayout(new BorderLayout());
			
			messageTextArea.setEditable(false);
			
			JPanel bottomPanel = new JPanel(new BorderLayout());
			
			JScrollPane scrollPane = new JScrollPane(inputTextArea);
			inputTextArea.setPreferredSize(new Dimension(0, 50));
			bottomPanel.add(scrollPane, BorderLayout.CENTER);
			bottomPanel.add(sendButton, BorderLayout.EAST);
			
			add(new JScrollPane(messageTextArea), BorderLayout.CENTER);
			add(bottomPanel, BorderLayout.SOUTH);
			
			
			setVisible(true);
			setBounds(200, 200, 500, 700);
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			
			sendButton.addActionListener(e->{
				// 입력된 텍스트를 읽어오기
				String text = inputTextArea.getText();
				// 서버로 텍스트 보내기
				out.println(text);
				out.flush();
				
				// 입력창의 텍스트 지우기
				inputTextArea.setText("");
			});
			
			// 전송버튼 비활성화
			sendButton.setEnabled(false);
			
			inputTextArea.addKeyListener(new KeyAdapter() {
				@Override
				public void keyReleased(KeyEvent e) {
					// 입력창에 입력된 텍스트를 읽어온다.
					String text = inputTextArea.getText();
					// 텍스트의 길이가 1 이상이면 전송버튼 활성화
					// 입력된 텍스트가 없으면 전송버튼 비활성화
					if (text.length() > 0) {
						sendButton.setEnabled(true);
					} else {
						sendButton.setEnabled(false);
					}
				}
			});
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "서버와 통신 중 오류가 발생하였습니다.", "통신 오류", JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		}
	}
	
	public static void main(String[] args) {
		new ChatClient();
	}
	
}

 

package demo.chat;

import java.io.BufferedReader;

import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class ChatClientThread extends Thread {

	private JTextArea messageTextArea;
	private BufferedReader in;
	
	//public ChatClientThread(JTextArea messageTextArea, BufferedReader in) {
	//	this.messageTextArea = messageTextArea;
	//	this.in = in;
	//}
	
	public void run() {
		while (true) {
			try {
				// 서버로부터 메시지 수신
				String text = in.readLine();
				
				// 메시지를 채팅창에 표현
				messageTextArea.append(text + "\n");
				messageTextArea.setCaretPosition(messageTextArea.getText().length());
				
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "서버와 연결이 끊어졌습니다", "서버 연결 오류", JOptionPane.ERROR_MESSAGE);
				System.exit(0);
			}
		}
	}

	public void setMessageTextArea(JTextArea messageTextArea) {
		this.messageTextArea = messageTextArea;
	}

	public void setIn(BufferedReader in) {
		this.in = in;
	}
}

 

package demo.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class ChatServer {

	// 서버에 접속한 모든 클라이언트와 통신을 담당하는 스레드(ChatServerThread)를
	// 저장하는 ArrayList객체 생성하기
	private ArrayList<ChatServerThread> threadList = new ArrayList<ChatServerThread>();
	
	public ChatServer() {
		try {
			ServerSocket server = new ServerSocket(8000);
			System.out.println("채팅 서버가 시작됨...");
			
			while (true) {
				try {
					System.out.println("클라이언트의 요청 대기중...");
					// 연결 요청을 수락하고,
					// 연결 요청을 한 클라이언트와 통신하는 소켓 획득하기
					Socket socket = server.accept();
					System.out.println("클라이언트의 연결 완료...");
					
					// 송수신을 담당하는 스레드 만들기
					ChatServerThread thread = new ChatServerThread();
					threadList.add(thread);
					thread.setSocket(socket);
					thread.setThreadList(threadList);
					thread.start();
					
					//BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					//PrintWriter out = new PrintWriter(socket.getOutputStream());
					
				} catch (Exception e) {
					
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		new ChatServer();
	}
}

 

package demo.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

public class ChatServerThread extends Thread {

	private ArrayList<ChatServerThread> threadList;
	private Socket socket;
	private BufferedReader in;
	private PrintWriter out;
	
	public void sendMessage(String message) throws Exception {
		out.println(message);
		out.flush();
	}
	
	public void broadcastMessage(String message) throws Exception {
		for (ChatServerThread thread : threadList) {
			thread.sendMessage(message);
		}
	}
	public void run() {
		try {
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream());
			
			while (true) {
			
			// 클라이언트가 보낸 메시지 수신하기
			String message = in.readLine();
			
			// 수신된 메시지를 모든 클라이언트에게 보내기
			broadcastMessage(message);
			
			}
			
		} catch (Exception e) {
		}
	}

	public void setThreadList(ArrayList<ChatServerThread> threadList) {
		this.threadList = threadList;
	}

	public void setSocket(Socket socket) {
		this.socket = socket;
	}	
}

'자바 > network' 카테고리의 다른 글

sync  (0) 2019.06.10
store  (0) 2019.06.10
simpleClient  (0) 2019.06.10
mallClient  (0) 2019.06.10
file  (0) 2019.06.10

+ Recent posts