=======================================================================
package jongkyu.chat.homework;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ClientClass5 {
public void main() {
Scanner sc = new Scanner(System.in);
System.out.print("이름을 입력해 주세요 : ");//처음에 이름을 보내기 위해서이다.
String name = sc.next();
System.out.print("ip를 입력하세요 : ");
String ip = sc.next();
try{
String ServerIP = ip;
Socket socket = new Socket(ServerIP, 7777); //소켓 객체 생성
System.out.println("서버와 연결이 되었습니다......");
//사용자로부터 얻은 문자열을 서버로 전송해주는 역할을 하는 쓰레드.
Thread sender = new SendServer(socket, name);
//서버에서 보내는 메시지를 사용자의 콘솔에 출력하는 쓰레드.
Thread receiver = new ReceiveServer(socket);
System.out.println("채팅방에 입장하였습니다.");
sender.start(); //스레드 시동
receiver.start(); //스레드 시동
}catch(UnknownHostException e) {
//e.printStackTrace();
}catch (IOException e) {
//e.printStackTrace();
}catch(Exception e){
System.out.println(e);
}
}
}
----------------------------------------------------------------------------------------------------------------------------
package jongkyu.chat.homework;
import java.io.DataInputStream;
import java.net.Socket;
//서버로부터 메시지를 읽는 클래스
public class ReceiveServer extends Thread{
Socket socket;
DataInputStream in;
//Socket을 매개변수로 받는 생성자.
public ReceiveServer(Socket socket){
this.socket = socket;
try{
in = new DataInputStream(this.socket.getInputStream());
}catch(Exception e){
System.out.println("예외:"+e);
}
}//생성자 --------------------
@Override
public void run(){ //run()메소드 재정의
while(in!=null){ //입력스트림이 null이 아니면..반복
try{
System.out.println(in.readUTF());
//서버로부터 읽어온 데이터를 콘솔에 출력
}catch(Exception e){
System.out.println("예외:"+e);
}
}//while----
}//run()------
}//class Receiver -------
-----------------------------------------------------------------------------------
package jongkyu.chat.homework;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
//서버로 메시지를 전송하는 클래스
public class SendServer extends Thread {
Socket socket;
DataOutputStream out;
String name;
//생성자 ( 매개변수로 소켓과 사용자 이름 받습니다. )
public SendServer(Socket socket, String name){ //소켓과 사용자 이름을 받는다.
this.socket = socket;
try{
out = new DataOutputStream(this.socket.getOutputStream());
this.name = name; //받아온 사용자이름을 전역변수에 저장, 다른 메서드인 run()에서 사용하기위함.
}catch(Exception e){
System.out.println("예외:"+e);
}
}
@Override
public void run(){ //run()메소드 재정의
Scanner s = new Scanner(System.in);
//키보드로부터 입력을 받기위한 스캐너 객체 생성
//서버에 입력한 사용자이름을 보내준다.
try {
out.writeUTF(name);
} catch (IOException e) {
System.out.println("예외:"+e);
}
while(out!=null){ //출력스트림이 null이 아니면..반복
try { //while문 안에 try-catch문을 사용한 이유는 while문 내부에서 예외가 발생하더라도
//계속 반복할수있게 하기위해서이다.
out.writeUTF(name+" : "+s.nextLine()); //키보드로부터 입력받은 문자열을 서버로 보낸다.
} catch (IOException e) {
System.out.println("예외:"+e);
}
}//while------
}//run()------
}//class Sender-------
------------------------------------------------------------------------------------------------------------
package jongkyu.chat.homework;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
public class ServerClass5 {
HashMap clientMap;
ServerSocket serverSocket = null;
Socket socket = null;
//생성자
public ServerClass5(){
clientMap = new HashMap(); //클라이언트의 출력스트림을 저장할 해쉬맵 생성.
Collections.synchronizedMap(clientMap); //해쉬맵 동기화 설정.
}//생성자----
public void main(){
try{
serverSocket = new ServerSocket(7777); //7777포트를 열었다.
System.out.println("종규서버가 시작되었습니다");//서버시작을 알렸다.
while(true){ //서버가 실행되는 동안 클라이언트들의 접속을 기다림.
socket = serverSocket.accept(); //클라이언트가 접속을 했다.
System.out.println(socket.getInetAddress()+":"+socket.getPort()); //클라이언트 정보 (ip, 포트) 출력
Thread jong = new MultiServerRec(socket); //쓰레드 생성.
jong.start(); //쓰레드 시작
}
}catch(Exception e){
e.printStackTrace();
}
}
//접속된 모든 클라이언트들에게 메시지를 전달.
public void allsend(String message){
//출력스트림을 순차적으로 얻어와서 해당 메시지를 출력한다.
Iterator ssend = clientMap.keySet().iterator();
while(ssend.hasNext()){//클라이언트가 보내는 메세지를 하나씩 꺼내온다.
try{
DataOutputStream ssendout = (DataOutputStream) clientMap.get(ssend.next());
ssendout.writeUTF(message);
}catch(Exception e){
System.out.println("예외:"+e);
}
}
}//allsend()메소드 끝
// 클라이언트로부터 읽어온 메시지를 다른 클라이언트(socket)에 보내는 역할을 하는 메서드
class MultiServerRec extends Thread {
Socket socket;
DataInputStream in;
DataOutputStream out;
//생성자.
public MultiServerRec(Socket socket){
this.socket = socket;
try{
//Socket으로부터 입력스트림을 얻는다.
in = new DataInputStream(socket.getInputStream());
//Socket으로부터 출력스트림을 얻는다.
out = new DataOutputStream(socket.getOutputStream());
}catch(Exception e){
System.out.println("예외:"+e);
}
}//생성자 ------------
@Override
public void run(){ //쓰레드를 사용하기 위해서 run()메서드 재정의
String name=null; //클라이언트로부터 받은 이름을 저장할 변수.
try{
name = in.readUTF(); //클라이언트에서 처음으로 보내는 메시지는
//클라이언트가 사용할 이름이다.
allsend(name + "님이 입장하셨습니다.");//입장한거를 알리기 위해 클라이언트들한테 다 보낸다.
clientMap.put(name, out); //해쉬맵에 키를 name으로 출력스트림 객체를 저장.
//이거 한 이유는 이름별로 말하는걸 보기 위해서이다.
System.out.println("현재 접속자 수는 "+clientMap.size()+"명 입니다.");
//몇명이 접속했는지 알기 위해서 만들었다.
while(in!=null){ //입력스트림이 null이 아니면 반복.
allsend(in.readUTF()); //현재 소켓에서 읽어온메시지를 해쉬맵에 저장된 모든
//출력스트림으로 보낸다.
}//while()---------
}catch(Exception e){
System.out.println(e + "----> ");
}finally{
//예외가 발생할때 퇴장. 해쉬맵에서 해당 데이터 제거.
//보통 종료하거나 나가면 java.net.SocketException: 예외발생
clientMap.remove(name);
allsend(name + "님이 퇴장하셨습니다.");
System.out.println("현재 접속자 수는 "+clientMap.size()+"명 입니다.");
}
}//run()------------
}//class MultiServerRec-------------
}
---------------------------------------------------------------------------------------------------
package jongkyu.chat.start;
import java.util.Scanner;
import jongkyu.chat.homework.ClientClass5;
import jongkyu.chat.homework.ServerClass5;
public class SumSeCl {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("종규의 서버클라이언트채팅(다중)");
System.out.println("역할을 선택하세요!!");
System.out.println("1.서버");
System.out.println("2.클라이언트");
int sel = sc.nextInt();
switch(sel) {
case 1 :
ServerClass5 ms = new ServerClass5(); //서버객체 생성.
ms.main();//실행.
break;
case 2 : ClientClass5 c = new ClientClass5();
c.main();
break;
default : System.out.println("둘중 하나만 입력좀해라");
break;
}
}
}
'IT일반과목 > java' 카테고리의 다른 글
자바 네트워크 TCP통신 문제 맞추기 (0) | 2018.08.12 |
---|---|
쓰레드2 (학원수업) (0) | 2018.08.10 |
쓰레드1 (학원수업) (0) | 2018.08.10 |
네트워크 수업3 (야구게임) (과제) (0) | 2018.08.09 |
네트워크 수업2 (0) | 2018.08.09 |