서버가 하는 일
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();
}
}
}