채팅프로그램
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
public class ChatServer {
private HashMap<String, OutputStream> clients;
public static void main(String[] args) {
new ChatServer().start();
//ChatServer cs=new ChatServer();
//cs.start() 한것과 같다
}
public ChatServer(){
clients = new HashMap<>();
}
public void start(){
ServerSocket serverSocket = null;
Socket socket = null;
try{
serverSocket = new ServerSocket(3579);
System.out.println("서버가 시작되었습니다");
while(true){
socket = serverSocket.accept(); //클라올때까지 대기
System.out.println("ip: "+socket.getInetAddress()+", port: " +socket.getPort() + "에서 접속했습니다");
ServerReceiver thread = new ServerReceiver(socket);
thread.start();
}
}catch(IOException e){
e.printStackTrace();
}
}
public void sendToAll(String msg){
Iterator<String> it = clients.keySet().iterator();
while(it.hasNext()){
try{
DataOutputStream out = (DataOutputStream) clients.get(it.next());
out.writeUTF(msg);
}catch(IOException e){
e.printStackTrace();
}
}
}
//이너클래스
class ServerReceiver extends Thread {
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
public ServerReceiver(Socket socket){
this.socket = socket;
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
String userName = "";
try{
userName = in.readUTF();
sendToAll("😁" + userName + "님이 들어오셨습니다");
clients.put(userName, out);
System.out.println("현재 접속자: " + clients.size());
while(in != null ){
String msg = in.readUTF();
if(msg.contains("quit")) break;
sendToAll(msg);
}
}catch(IOException e){
e.printStackTrace();
}finally {
sendToAll("😁"+userName +"님이 나가셨습니다");
clients.remove(userName);
System.out.println("ip: "+socket.getInetAddress()+", port: " +socket.getPort() +"에서 접속을 종료했습니다");
System.out.println("현재 접속자: " + clients.size());
}
}
}
}
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ChatClient {
public static void main(String[] args) {
System.out.println("대화명을 입력하세요");
Scanner sc = new Scanner(System.in);
String userName = sc.next();
try{
Socket socket = new Socket("127.0.0.1",3579);
System.out.println("서버와 연결되었습니다");
Thread sender = new Thread(new ClientSender(socket, userName));
Thread receiver = new Thread(new ClientReceiver(socket));
sender.start();
receiver.start();
}catch(IOException e){
e.printStackTrace();
}
}
static class ClientSender extends Thread { //이너클래스
private Socket socket;
private DataOutputStream out;
private String userName;
public ClientSender(Socket socket, String userName){
this.socket = socket;
try{
out = new DataOutputStream(socket.getOutputStream());
this.userName = userName;
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
BufferedReader br = null;
try{
br = new BufferedReader(new InputStreamReader(System.in));
if(out != null) out.writeUTF(userName);
while(out!= null){
out.writeUTF("["+userName+"]" + br.readLine());
// [apple] 안녕하세요
}
}catch (IOException e){
e.printStackTrace();
}finally{
if(br != null)try{br.close();} catch(IOException e){}
if(out != null)try{out.close();} catch(IOException e){}
}
}
}
static class ClientReceiver extends Thread { //이너클래스
private Socket socket;
private DataInputStream in;
public ClientReceiver(Socket socket){
this.socket = socket;
try{
in = new DataInputStream(socket.getInputStream());
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
while(in != null){
try{
System.out.println(in.readUTF());
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
반응형
'서버&백엔드 > 🔥 JAVA' 카테고리의 다른 글
변수명이 js단에서 소문자로 변경돼서 넘어오는 경우 (0) | 2024.02.13 |
---|---|
Builder패턴 (0) | 2023.04.18 |
Java,MySQL | 네트워크,버퍼,TCP/IP,소켓 (0) | 2022.10.19 |
Java,MySQL | 싱글톤패턴, PreparedStatement, ResultSet, DAO (0) | 2022.10.19 |
Java,MySQL | JDBC,JDBC Driver,DBMS,Statement (0) | 2022.10.19 |