*단체 메인 채팅 서버
public class TCP_ChatServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(5000);
while(true)
{
Socket socket = serverSocket.accept();
System.out.println("연결됨");
ChatReceiver receiver = new ChatReceiver(socket);
Thread rThread = new Thread(receiver);
rThread.start();
BufferedWriter bw = new BufferedWriter
(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
ChatReceiver.getClientMap().put(socket.getInetAddress(), bw);
//소켓이 새로 연결 될때 이시버 스레드 동작시키고 해당 소켓에 대한 IP주소와 BW를 맵에 담음.
System.out.println(socket.getInetAddress() + "입장");
System.out.println("현재 입장중인 사람 ~~~~~~~");
for(InetAddress i : ChatReceiver.getClientMap().keySet())
{System.out.println(i);}
System.out.println("~~~~~~~~~~~~~~~~~~~~");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
*단체 체팅 리시버클래스.
public class ChatReceiver implements Runnable{
private static Map<InetAddress, BufferedWriter> clientMap;
static{
clientMap = new HashMap<InetAddress, BufferedWriter>();
Collections.synchronizedMap(clientMap); //여러개의 스레드가 안전하게 접근할 수 있도록 정리해주는 장치.
}
public static Map<InetAddress, BufferedWriter>getClientMap(){
return clientMap;
}
private Socket socket;
public ChatReceiver(Socket socket)
{
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader
(new InputStreamReader(socket.getInputStream(),"UTF-8"));
String msg = null;
while((msg = br.readLine()) != null)
{
if(msg.equals("종료"))
{
break;
}
if(msg.startsWith("/"))
{//명령 시작
if(msg.charAt(1) == 'w')
{//귓속말
String[] tmp = msg.split(" ");
InetAddress ia = InetAddress.getByName(tmp[1]);
if(clientMap.get(ia) != null)
{
clientMap.get(ia).write(tmp[2] + "\n");
clientMap.get(ia).flush();
}
}
else if(msg.charAt(1) == 'g')
{//접속자 조희
for(InetAddress i : clientMap.keySet())
{
clientMap.get(socket.getInetAddress()).write(i + "\n");
clientMap.get(socket.getInetAddress()).flush();
}
}
else if(msg.charAt(1) == 'f')
{//기능 소개
BufferedWriter bw = new BufferedWriter
(new OutputStreamWriter(socket.getOutputStream()));
bw.write("----------------------------" + "\n");
bw.write("/w IP Message 귓속말" + "\n");
bw.write("/g 현재접속자" + "\n");
bw.write("/f 기능보기" + "\n");
bw.write("/m IP 상대방과 체팅모드" + "\n");
bw.write("----------------------------" + "\n");
bw.flush();
}
}
else
{
System.out.println(socket.getInetAddress() + " : " + msg);
for(BufferedWriter bw : clientMap.values())
{
bw.write(msg + "\n");
bw.flush();
}//지금까지 접속된 모든 socket의 bw들에 대해 msg전달.
}
}
}
catch (IOException e) {
System.out.println("문제 발생 프로그램을 종료합니다.");
}
finally
{
if(socket != null)
try {
System.out.println(socket.getInetAddress() + "연결종료");
clientMap.remove(socket.getInetAddress());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
System.exit(1);
}
}
}
'[JAVA]' 카테고리의 다른 글
[JAVA]10월 12일 이벤트 처리 (0) | 2015.10.12 |
---|---|
[JAVA]10월 12일 GUI, 그래픽 사용자 인터페이스 (0) | 2015.10.12 |
[JAVA]10월 5일 네트워크 프로그래밍 (0) | 2015.10.05 |
[JAVA]10월 2일 입출력, ObjectOutputStream와 ObjectInputStream, Serializable, OutputStreamWriter 와 InputStreamReader (0) | 2015.10.02 |
[JAVA]10월 1일 입출력 스트림, InputStream 과 OutputStream, BufferedInputStream 과 BufferedOutputStream (0) | 2015.10.01 |