반응형
서버 소스
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
실행화면.
간단한 채팅 프로그램을 구현한 것이다.
쓰레드 사용으로 다중 클라이언트를 처리가능한 에코 서버이다.
반응형