서버와 클라이언트가 멀티스레드를 바탕으로 순서에 상관없이 자유롭게 대화할 수 있는 채팅 문제입니다 이를 해결하는 다음 프로그램에 대해 빈칸을 채우세요
| 서버 | 클라이언트 |
|
[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Client]님이 들어오실때까지 잠시만 기다려주세요 [Client]님이 들어오셨습니다 [Client]안녕하세요 반갑습니다 [Client]님이 나가셨습니다 quit [Server]님이 나가셨습니다 |
[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Server]님이 들어오셨습니다 안녕하세요 [Server]반갑습니다 quit [Client]님이 나가셨습니다 |
| 서버 | 클라이언트 |
|
[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Client]님이 들어오실때까지 잠시만 기다려주세요 [Client]님이 들어오셨습니다 [Client]안녕하세요 반갑습니다 [Client]오랜만이네요 [Client]그동안 잘 지내셨어요? 덕분에 잘 지내고 있습니다 신경써 주셔서 감사합니다 [Client]님이 나가셨습니다 quit [Server]님이 나가셨습니다 |
[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Server]님이 들어오셨습니다 안녕하세요 [Server]반갑습니다 오랜만이네요 그동안 잘 지내셨어요? [Server]덕분에 잘 지내고 있습니다 [Server]신경써 주셔서 감사합니다 quit [Client]님이 나가셨습니다 |
| 서버 | 클라이언트 |
|
[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Client]님이 들어오실때까지 잠시만 기다려주세요 [Client]님이 들어오셨습니다 [Client]안녕하세요 반갑습니다 [Client]오랜만이네요 [Client]그동안 잘 지내셨어요? 덕분에 잘 지내고 있습니다 신경써 주셔서 감사합니다 [Client]앗~ [Client]지금 나가봐야 할 것 같아요 [Client]죄송합니다 다음에 뵈요 [Client]님이 나가셨습니다 quit [Server]님이 나가셨습니다 |
[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Server]님이 들어오셨습니다 안녕하세요 [Server]반갑습니다 오랜만이네요 그동안 잘 지내셨어요? [Server]덕분에 잘 지내고 있습니다 [Server]신경써 주셔서 감사합니다 앗~ 지금 나가봐야 할 것 같아요 죄송합니다 [Server]다음에 뵈요 quit [Client]님이 나가셨습니다 |
import chat.ChatNetwork;
public class MultiThreadChatServer
{
public static void main(String[] args) {
new ChatNetwork();
}
}
package chat;
import java.util.Scanner;
import network.Network;
public class ChatNetwork
{
private Network network;
public ChatNetwork() {
System.out.println( "[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요" );
System.out.println( "[Client]님이 들어오실때까지 잠시만 기다려주세요" );
network =
new Network();
network.connectAsServer( this );
network.write( "[Server]님이 들어오셨습니다" );
this.write( "[Server]" );
}
public ChatNetwork( String serverIP ) {
System.out.println( "[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요" );
network =
new Network();
network.connectAsClient( serverIP, this );
network.write( "[Client]님이 들어오셨습니다" );
this.write( "[Client]" );
}
public void write( String id ) {
{
Scanner scan = new Scanner( System.in );
( String message = null; ( message =
scan.nextLine() ) != null; ) {
( message.contains( "quit" ) ) {
System.out.println( id + "님이 나가셨습니다" );
network.write( id + "님이 나가셨습니다" );
network.write( id + message );
break;
}
network.write( id + message );
}
scan.close();
} ( Exception e ) {
e.printStackTrace();
}
}
@Override
public void () {
( String message = null; ( message =
network.read() ) != null; ) {
( message.contains( "quit" ) ) {
System.out.println( message );
network.write( message );
break;
}
{
System.out.println( message );
}
}
network.close();
}
}
package network;
import java.io.*;
import java.net.*;
public class Network
{
public static final int serverPort = 7700;
protected serverSocket;
protected socket;
private in;
private out;
private waitForCounterpart;
public Network() {
serverSocket = null;
socket = null;
in = null;
out = null;
waitForCounterpart = null;
}
public void connectAsServer( obj ) {
{
serverSocket = new ( serverPort );
socket =
serverSocket.();
connectInOut( obj );
} ( Exception e ) {
e.printStackTrace();
}
}
public void connectAsClient( String serverIP, obj ) {
{
socket =
new ( serverIP, serverPort );
connectInOut( obj );
} ( Exception e ) {
e.printStackTrace();
}
}
public void connectInOut( obj ) {
{
in = new ( new ( socket.() ));
out = new ( socket.(), true );
waitForCounterpart = new ( obj );
waitForCounterpart.();
} ( Exception e ) {
e.printStackTrace();
}
}
public String read() {
{
( this.isConnecting() == true )
return
in.();
} ( Exception e ) {
e.printStackTrace();
}
return null;
}
public void write( String data ) {
{
( this.isConnecting() == true )
out.println( data );
} ( Exception e ) {
e.printStackTrace();
}
}
public boolean isConnecting() {
( ( socket != null )
&& ( in != null )
&& ( out != null )
&& ( waitForCounterpart != null )
&& ( waitForCounterpart.getState() != .State.TERMINATED ) )
return true;
return false;
}
public void close() {
{
( waitForCounterpart != null ) {
waitForCounterpart.();
waitForCounterpart = null;
}
( in != null ) {
in.close();
in=null;
}
( out != null ) {
out.flush();
out.close();
out = null;
}
( socket != null ) {
socket.close();
socket = null;
}
( serverSocket != null ) {
serverSocket.close();
serverSocket = null;
}
} ( Exception e ) {
e.printStackTrace();
}
}
}