반응형

서버 소스

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.ServerSocket;
import java.util.Vector;

public class server 
{
	public static void main(String[] args) 
	{
		Vector<ServerThread> clientList = new Vector<ServerThread>();
		try 
		{
			ServerSocket socket = new ServerSocket(7777);
			System.out.println("the server started.");
			while(true)
			{
				Socket clientSocket = socket.accept();
				ServerThread t = new ServerThread(clientSocket, clientList);
				t.start();
			}
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}

	}
}
class ServerThread extends Thread
{
	InputStream in;
	OutputStream out;
	Socket clientSocket;
	Vector<ServerThread> clientList;
	String userName;
	public ServerThread(Socket clientSocket, Vector<ServerThread> clientList)
	{
		try
		{
			this.clientSocket = clientSocket;
			this.in = clientSocket.getInputStream();
			this.out = clientSocket.getOutputStream();
			this.clientList = clientList;
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	@Override
	public void run()
	{
		try
		{
			byte[] buffer = new byte[1024];
			int size = in.read(buffer,0,1024);
			userName = new String(buffer,0,size);
			System.out.println(userName+"님이 들어왔습니다.");
			SendAlertToALL(userName+"님이 들어왔습니다.");
			synchronized(clientList)
			{
				clientList.add(this);
			}
			while(true)
			{
				size = in.read(buffer,0,1024);
				String message = new String(buffer,0,size);
				System.out.println(userName+": "+message);
				SendMessageToALL(message);
			}
		}
		catch(SocketException e)
		{
			System.out.println(userName+"님이 나갔습니다.");
			SendAlertToALL(userName+"님이 나갔습니다.");
			synchronized(clientList)
			{
				clientList.remove(this);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	synchronized void SendMessageToALL(String message)
	{
		try
		{
			for (ServerThread client : clientList)
			{
				if(client.userName != userName)
					client.out.write((userName+": "+message).getBytes());
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	synchronized void SendAlertToALL(String message)
	{
		try
		{
			for (ServerThread client : clientList)
			{
				if(client.userName != userName)
					client.out.write(("[Server] "+message).getBytes());
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

server.java


클라이언트 소스

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class client 
{

	public static void main(String[] args) 
	{
		try 
		{
			Socket sock = new Socket("127.0.0.1" ,7777);
			InputStream in = sock.getInputStream();
			OutputStream out = sock.getOutputStream();
			ClientThread t = new ClientThread(in);
			Scanner scan = new Scanner(System.in);
			System.out.print("이름: ");
			String name = scan.next();
			out.write(name.trim().getBytes());
			t.start();
			while(true)
			{
				String message = scan.next();
				out.write(message.trim().getBytes());
			}
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}

}
class ClientThread extends Thread
{
	InputStream in;
	public ClientThread(InputStream in)
	{
		this.in = in;
	}
	@Override
	public void run()
	{
		try
		{
			byte[] buffer = new byte[1024];
			while(true)
			{
				int size = in.read(buffer,0,1024);
				String message = new String(buffer,0,size);
				System.out.println(message);
			}
		}
		catch(SocketException e)
		{
			System.out.println("서버가 닫혔습니다.");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

client.java


실행화면.

그림1. 서버 실행화면
그림2. 클라이언트1 실행화면
그림3. 클라이언트2 실행 및 종료화면

간단한 채팅 프로그램을 구현한 것이다.

쓰레드 사용으로 다중 클라이언트를 처리가능한 에코 서버이다.

반응형

+ Recent posts