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;
}
}
'자바(deprecated) > 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 |