JAVA(Sol)(정리대기중..언젠가)
210428_7~8(채팅서버)
너굴셉
2021. 4. 28. 16:59
채팅 프로그램 만들기 (1:1)
채팅원리
서버 | <망연결> | 클라이언트 | |
1) 서버소켓 | |||
2) 포트감시 | <-------------접속시도-----3) | 소켓(서버ip,포트) | |
4) 소켓생성 (클라이언트정보) |
|||
키보드--> 5) 출력객체- [ 버퍼저장 ] |
-------------flush-----------> | start - [ 버퍼저장] |
====> Thread ChatHandler run() { } |
6) start - [ 버퍼저장] |
<------------flush----------- | 출력객체 - [버퍼저장] <--키보드 |
콘솔출력 버퍼를읽어오고있는중에 클라이언트가 내용을 또 보낼수도있다.
입력개체부분을 스레드(start)로바꾼다.
콘솔출력 |
Thread |
Chathandler run(){ 입력객체 ; } |
IoStream은 simplex이므로, 입력객체와 출력객체를 따로 만들어야 한다.
채팅 프로그램은 서버에서 서버소켓과 포트감시를 제외하면 클라이언트와 동일한 구성을한다.
package chatting;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
BufferedWriter writer = null;
Socket socket = null;
ServerSocket server = null;
public void serverStart() {
System.out.println("접속자를 기다리는 중입니다.");
try {
server = new ServerSocket(2006); //포트 2006번 감시
socket = server.accept(); // 접속하면 감시시작
writer = new BufferedWriter(new OutputStreamWriter
(socket.getOutputStream()));
//멤버변수로 만들었다.
System.out.println("클라이언트 IP : " + socket.getInetAddress()
//접속자 출력
.getHostAddress() + "이름 : "
+ socket.getInetAddress().getHostName() + "연결되었습니다.");
//입력객체
ChatServerHandler handler = new ChatServerHandler(socket);
handler.start();
//
BufferedReader in = new BufferedReader(new InputStreamReader
(System.in));
//키보드에 입력되는 내용을 21행writer로 전달
String s = " ";
while (true) {
try {
System.out.println("=>");
s = in.readLine(); //키보드에 입력된s라는 매개변수에 넣음
if(s==null) break;
if (s.equals("999")) //999면 while을 빠져나온다
break;
writer.write(s); //내용
writer.newLine(); //줄바꿈
writer.write("---------------------------------");
writer.newLine(); //줄바꿈
writer.flush(); //출력
} catch (Exception e) {
System.out.println("Err :" + e.toString());
}
}
} catch (IOException ioe) {
System.out.println("Exception generated...");
} finally {
try {
server.close();
} catch (IOException ignored) {
}
}
}
public static void main(String[] args) {
ChatServer cs = new ChatServer();
cs.serverStart(); //ChatServer cs를 생성해서 실행하라.
}
}
class ChatServerHandler extends Thread { // Thread를 상속받는 ChatServerHandler
protected Socket socket;
String line;
public ChatServerHandler(Socket socket) {
this.socket = socket;
}
public void run() { //입력받는 run()메소드
try {
BufferedReader reader = new BufferedReader(new InputStreamReader
(socket.getInputStream()));
//socket의 입력스트림을 문자열로 바꾸어 입력버퍼를 받는 reader생성
while (true) {
line = reader.readLine(); //한줄씩 읽어와라
if(line==null) break; //비어있다면 break
System.out.println("받은글 : " + line);
System.out.println("=>");
}
} catch (IOException ignored) {
} finally {
try {
socket.close();
} catch (IOException ignored) {
}
}
}
}
//접속자를 기다리는 중입니다.
//클라이언트 IP : 127.0.0.1이름 : 127.0.0.1연결되었습니다.
//=>
//안녕?
//=>
//받은글 : hello?
//=>
//받은글 : ---------------------
//=>
package chatting;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ChatClient {
BufferedWriter writer = null;
Socket socket = null;
String line;
int cnt = 0;
public void clientStart(String ip) {
System.out.println("클라이언트 프로그램 작동...");
try {
socket = new Socket(ip, 2006);
writer = new BufferedWriter(new OutputStreamWriter
(socket.getOutputStream()));
//출력객체
// server = new ServerSocket(2006); //포트 2006번 감시
// System.out.println("클라이언트 IP : " + socket.getInetAddress()
// .getHostAddress() + "이름 : "
// + socket.getInetAddress().getHostName() + "연결되었습니다.");
// 서버와 일부분을 제외하면 완전히 똑같다
ChatClientHandler handler = new ChatClientHandler(socket);
handler.start();
BufferedReader in = new BufferedReader(new InputStreamReader
(System.in));
String s = " ";
while (true) {
try {
System.out.println("=>");
s = in.readLine();
if(s==null) break;
if (s.equals("999"))
break;
writer.write(s);
writer.newLine();
writer.write("---------------------");
writer.newLine();
writer.flush();
} catch (Exception e) {
System.out.println("Err :" + e.toString());
}
}
} catch (IOException ioe) {
System.out.println("Exception generated...");
} finally {
try {
socket.close();
} catch (IOException ignored) {
}
}
}
public static void main(String[] args) {
ChatClient cc = new ChatClient();
cc.clientStart(args[0]); //chatClient cc를 생성해서 파라미터로 실행하라
}
}
class ChatClientHandler extends Thread {// Thread를 상속받는 ChatClientHandler
protected Socket socket;
String line;
public ChatClientHandler(Socket socket) {
this.socket = socket;
}
public void run() { //입력받는 run메소드 생성
try {
BufferedReader reader = new BufferedReader(new InputStreamReader
(socket.getInputStream()));
//socket의 입력스트림을 문자열로 바꾸어 입력버퍼를 받는 reader생성
while (true) {
line = reader.readLine(); //한줄씩읽어와라
if(line==null) break; // 비어있다면 break
System.out.println("받은글 : " + line);
System.out.println("=>");
}
} catch (IOException ignored) {
} finally {
try {
socket.close();
} catch (IOException ignored) {
}
}
}
}
//클라이언트 프로그램 작동...
//=>
//받은글 : 안녕?
//=>
//받은글 : ---------------------------------
//=>
//hello?
//=>
서버에서 999를 작성하면 서버측 채팅은 먹통이되지만 클라이언트에서 보내는건 가능했다.
클라이언트에서 999를 작성하면 창이 자동으로 창종료됐고, 서버창에 끊임없이 null이 출력됐다
좀 문제있는 예제인듯.. 뭔가 나사빠진듯이 작동한다 나중에 시간나면 고쳐볼것
cf) ignored 의미 ㅋㅋ
} catch (SomeException ignored) {
// 변수 이름은 ignored 등으로 바꾸고,
// 예외를 무시하되 관련 로그를 남겨둔다. }