Code Archive/JAVA

Step16. 채팅 프로그램

쌍큐 2014. 9. 12. 17:43

서버가 하는 일

1. 서버 오픈

2. 클라이언트 접속을 받음

3. 클라이언트가 전송한 내용을 받아서 다시 접속해 있는 모든 클라이언트에게 전송


클라이언트가 하는일

1. 서버 접속

2. 메세지 내용 입력 후 서버 전송

3. 서버로부터 온 메세지 출력


각각의 서버와 클라이언트가 하는 일을 보면 동시에 입출력은 불가능하므로 스레드를 이용하여 각각 동시에 일을 진행할 클래스를 작성한다.


Server 클래스 : 서버 오픈, 클라이언트 접속 받음, ServerWorker 객체를 저장

ServerWorker 클래스 : 접속 중에 있는 어느 클라이언트가 보낸 내용을 현재 객체에 연결된 클라이언트에게 전송

Client 클래스 : 서버 접속, 서버로부터 온 메세지 화면에 출력

ClientWorker 클래스 : 메세지를 입력 받은 후 서버로 전송


** Server.java

package server;


import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;


public class Server {

//접속한 클라이언트 정보를 저장할 리스트

public static ArrayList<ServerWorker> list = new ArrayList<ServerWorker>();

public static void main(String[] args) {

// TODO Auto-generated method stub

ServerSocket server = null;

Socket client = null;

try {

server = new ServerSocket(1234);

 

while(true){

client = server.accept();

System.out.println("IP : "+client.getInetAddress() +" - 접속");

ServerWorker worker = new ServerWorker(client);

worker.start();

list.add(worker);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void broacastingMessage(String message) {

for(int i=0;i<list.size();i++)

list.get(i).sendMessage(message);

}

}

** ServerWorker.java
package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerWorker extends Thread {
private String ip;
private BufferedReader br;
private PrintWriter pw;

public ServerWorker(Socket client) {
super();
// TODO Auto-generated constructor stub
try {
br = new BufferedReader(new InputStreamReader(
client.getInputStream()));
pw = new PrintWriter(client.getOutputStream());
ip = client.getInetAddress().toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public void run() {
// TODO Auto-generated method stub
String message = null;
try {
while (true) {
message = br.readLine();
Server.broacastingMessage(ip+"님의 메세지 : "+message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println(ip+"님 접속 종료");
}finally{
try {
br.close();
pw.close();
Server.list.remove(this);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public void sendMessage(String message) {
pw.println(message);
pw.flush();
}

}

** Client.java
package client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Client {

public static void main(String[] args) {
// TODO Auto-generated method stub
Socket server = null;
BufferedReader br = null;
ClientWorker cw = null;
try {
server = new Socket("127.0.0.1",1234);
br = new BufferedReader(new InputStreamReader(server.getInputStream()));
cw = new ClientWorker(server);
cw.start();
while(true){
System.out.println(br.readLine());
}
}catch(SocketException e){
System.out.println("서버에 연결할 수 없습니다.");
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("클라이언트 접속 종료");
}
}

}

**ClientWorker.java
package client;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class ClientWorker extends Thread{
private PrintWriter pw;
private Scanner sc;
public ClientWorker(Socket socket) {
super();
// TODO Auto-generated constructor stub
try {
sc = new Scanner(System.in);
pw = new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
String message = null;
while(true){
message = sc.next();
pw.println(message);
pw.flush();
}
}
}




'Code Archive > JAVA' 카테고리의 다른 글

swing test  (0) 2014.10.06
초성 퀴즈 게임  (0) 2014.10.06
Step17. 기본 SQL  (0) 2014.09.12
Step18. JDBC 기본 문법  (0) 2014.09.12
Step15. Thread(스레드)  (0) 2014.09.12