-
21일 차 TCP단체 채팅방(서버와 클라이언트)삼성SDS_멀티캠퍼스/Java 2015. 10. 7. 16:17반응형
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Receiver2 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 Receiver2(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
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[] w = msg.split(" ");
InetAddress ia = InetAddress.getByName(w[1]);
if (clientMap.get(ia) != null) {
clientMap.get(ia).write(w[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 {
// 아닌건 일반채팅
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()); // 종료되는 소켓에 대한
// B.W삭제
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.exit(1);
}
}
}
import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStreamWriter;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class TCP_ChatMain {public static void main(String[] args) {ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(5000);while (true) {Socket socket = serverSocket.accept();// socket에 대해 리더 쓰레드 돌리기Receiver2 receiver = new Receiver2(socket);Thread rThread = new Thread(receiver);rThread.start();BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));Receiver2.getClientMap().put(socket.getInetAddress(), bw);// 소켓이 새로 연결될 때, 리시버쓰레드 동작시키고 해당 소켓에 대한 IP주소와 B.W를 맵에 담는다System.out.println(socket.getInetAddress() + " 입장했습니다");System.out.println("현재 접속중인 사람");for (InetAddress i : Receiver2.getClientMap().keySet())System.out.println(i);System.out.println("----------------------");}} catch (IOException e) {// TODO Auto-generated catch block}}}여기까지가 서버입니다.
---------------------------------------------------------------
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Sender2 {
public static void main(String[] args) {
Socket socket;
Scanner scan = new Scanner(System.in);
// TODO Auto-generated method stub
try {
socket = new Socket("70.12.115.118", 5000);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
String msg = null;
while (true) {
msg = scan.nextLine();
bw.write(msg + "\n");
bw.flush();
}
} catch (IOException e) {
}
}
}
여기는 클라이언트 입니다
반응형'삼성SDS_멀티캠퍼스 > Java' 카테고리의 다른 글
22일 차 SVN 기본 생성 (0) 2015.10.08 22일 차 SVN (서브버전) (0) 2015.10.08 20일 차 TCP통신 (0) 2015.10.06 19일 차 Socket 통신으로 채팅방 만들기 (0) 2015.10.05 19일 차 소켓 통신 (0) 2015.10.05