지구정복

[JAVA] 12/07 | 항상 대기중인 서버, C/S이용하기(구구단, 우편번호검색기), 스레드 병렬처리 본문

데이터 엔지니어링 정복/JAVA & JSP

[JAVA] 12/07 | 항상 대기중인 서버, C/S이용하기(구구단, 우편번호검색기), 스레드 병렬처리

eeaarrtthh 2020. 12. 8. 09:09
728x90
반응형

복습

java.sql
java.net : 원격 프로그램과 연결시키는 방법

java 와 java와 연결된 프로그램 또는 (c / c#) 즉, 전송형태만 맞으면 연결가능
이때 조심할 것은 전송단위(byte, char, encoding)

전송할 때 clinet는 서버 ip, 서버 port, protocoal(통신규약)를 알아야한다.
서버는 자신의 포트만 대기하고 프로토콜을 개방하면된다.

서버와 클라이언트 중간에는 인터넷(인트라넷)이 있다.

ip와 관련된 클래스 InetAddress(도메인과 ip를 서로 교환)
IPv4 : xxx.xxx.xxx.xxx (10진수)
IPv6 : xxx.xxx.xxx.xxx.xxx.xxx (16진수)

왜 IPv6가 되었나? 사물인터넷 등 다양한 곳에 
더욱더 랜카드가 많아지기때문에 ip가 많아져서 IPv6로 발전시켰다.

domain ip에 맞는 이름 - 구입할 수 있음
	www.cafe24.com -> 호스팅 -> 도메인 -> 도메인신청하기
도메인과 관련된 클래스는 URL이다.
URL
URLConnect
	도메인 자체의 문자열 처리
	웹서버에 연결 - html(과 관련된 데이터) 교환
		크롤링(스크롤링) : 지속적으로 데이터를 누적
			1. 웹페이지(html, image)
			2. OpenAPI(네이버 개발자 -> 서비스API, 구글이나 다음도 있다.
				www.data.go.kr(공공데이터 제공)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
-Client / Server(C/S)
p1057, 1062
ServerSocket
Server

이때 사용하는 것이 InputStream / OutputStream

 

항상 대기중인 서버 만들기

while문을 사용한다

//TCPServerEx1
package Pack1;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx1 {

	public static void main(String[] args) {	
		ServerSocket serverSocket = null;
		Socket socket = null;

		
		try {
			serverSocket = new ServerSocket( 7777 );
			
			//항시 대기 서버
			while(true) {
				try {
					System.out.println( "서버가 준비되었습니다." );
					socket = serverSocket.accept();
					System.out.println( "클라이언트가 연결되었습니다.");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					if ( socket != null ) try { socket.close(); } catch(IOException e) {}
				}
			}
			
		} catch (IOException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} finally {
			if ( serverSocket != null ) try { serverSocket.close(); } catch(IOException e) {}
		}
	}
}
//TCPClientEx1
package Pack1;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx1 {

	public static void main(String[] args) {
		Socket socket = null;
		
		try {
			socket = new Socket("localhost", 7777);
			System.out.println( "연결완료" );
		
		} catch (UnknownHostException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} catch (IOException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} finally {
			if ( socket != null ) try { socket.close(); } catch(IOException e) {}
		}
	}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
연결완료

 

 

이를 이용해서 에코를 구축해보자.

//TCPClientEx1
package Pack1;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx1 {

	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			socket = new Socket("localhost", 7777);
			br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
			bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) );
			
			bw.write( "hello server" + "\n" );
			bw.flush();
			System.out.println( "연결완료" );
		
			String msg = br.readLine();
			System.out.println( "서버 메세지: " + msg );
			
		} catch (UnknownHostException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} catch (IOException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} finally {
			if ( br != null ) try { br.close(); } catch(IOException e) {}
			if ( bw != null ) try { bw.close(); } catch(IOException e) {}
			if ( socket != null ) try { socket.close(); } catch(IOException e) {}
		}
	}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
연결완료
서버 메세지: hello server
//TCPServerEx1
package Pack1;

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 TCPServerEx1 {

	public static void main(String[] args) {	
		ServerSocket serverSocket = null;
		Socket socket = null;

		BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			serverSocket = new ServerSocket( 7777 );
			
			//항시 대기 서버
			while(true) {
				try {
					System.out.println( "서버가 준비되었습니다." );
					socket = serverSocket.accept();
					
					br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
					bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) );
					
					String msg = br.readLine();
					System.out.println( "msg : " + msg );
					
					bw.write( msg + "\n");
					bw.flush();
					System.out.println( "전송 완료");
					
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					if ( socket != null ) try { socket.close(); } catch(IOException e) {}
				}
			}
			
		} catch (IOException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} finally {
			if ( br != null ) try { br.close(); } catch(IOException e) {}
			if ( bw != null ) try { bw.close(); } catch(IOException e) {}
			if ( serverSocket != null ) try { serverSocket.close(); } catch(IOException e) {}
		}
	}
}

 

 

 

이번에는 args[0]에 특정 구구단을 주면 서버에서 계산한 뒤 출력하는 프로그램을 만들어보자.

먼저 이클립스에서 args[0]의 값을 주어야한다. 이를 위해서 먼저 실행해서 에러를 낸 다음

Run Configurations를 들어간다.

그리고 아래와 같이 8 이라고 입력한뒤, apply -> close를 누른다.

이제 아래와 같이 코드를 작성한다.

//TCPServerEx1
package Pack5;

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 GugudanServerEx1 {

	public static void main(String[] args) {	
		ServerSocket serverSocket = null;
		Socket socket = null;

		BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			serverSocket = new ServerSocket( 7777 );
			
			//항시 대기 서버
			while(true) {
				try {
					System.out.println( "서버가 준비되었습니다." );
					socket = serverSocket.accept();
					
					br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
					bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) );
					
					String dan = br.readLine();
					System.out.println( "구구단 생성 : " + dan );
					
					StringBuffer msg = new StringBuffer();
					for (int i=1; i<=9; i++) {
						msg.append( dan + "x" + i + "=" + (Integer.parseInt(dan) * i) + ":");
					}
					
					
					bw.write( msg.toString() + "\n");
					bw.flush();
					System.out.println( "전송 완료");
					
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					if ( socket != null ) try { socket.close(); } catch(IOException e) {}
				}
			}
			
		} catch (IOException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} finally {
			if ( br != null ) try { br.close(); } catch(IOException e) {}
			if ( bw != null ) try { bw.close(); } catch(IOException e) {}
			if ( serverSocket != null ) try { serverSocket.close(); } catch(IOException e) {}
		}
	}
}
//TCPClientEx1
package Pack5;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class GugudanClientEx1 {

	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			socket = new Socket("localhost", 7777);
			br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
			bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) );
			
			bw.write( args[0] + "\n" );
			bw.flush();
			System.out.println( "연결완료" );
		
			String msg = br.readLine();
			System.out.println( "서버 메세지: \n" + msg.replaceAll(":", "\n") );
			
		} catch (UnknownHostException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} catch (IOException e) {
			System.out.println( "[에러] : " + e.getMessage() );
		} finally {
			if ( br != null ) try { br.close(); } catch(IOException e) {}
			if ( bw != null ) try { bw.close(); } catch(IOException e) {}
			if ( socket != null ) try { socket.close(); } catch(IOException e) {}
		}
	}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
연결완료
서버 메세지: 
8x1=8
8x2=16
8x3=24
8x4=32
8x5=40
8x6=48
8x7=56
8x8=64
8x9=72

만약 replaceAll을 사용하지않으려면 아래와 같이 코드를 수정해준다.

//GugudanServerEx1

for (int i=1; i<=9; i++) {
	msg.append( dan + "x" + i + "=" + (Integer.parseInt(dan) * i) + "\n");
}
//GugudanClientEx1

System.out.println( "연결완료" );

String msg = null;
while( (msg = br.readLine()) != null ) {
    system.out.println(msg);
}

String msg = br.readLine();
//System.out.println( "서버 메세지: \n" + msg.replaceAll(":", "\n") );

 

 

우편번호 조회 서버 만들기

이클립스에서 ZipcodeServerEx01를 실행시키고 cmd창에서 ZipcodeClientEx01를 실행시키는데

ZipcodeClientEx01의 args[0]를 동 이름으로 주면 cmd창에서 해당 동이름 주소들이 출력되는 프로그램을 만들어보자.

java ZipcodeClientEx01 신사              	ZipcodeServerEx01            
                		    <->          				      <->데이터베이스
				

-서버

package Pack1207;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ZipcodeServerEx01 {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs  = null;
		
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		try {
			//서버포트 설정
			serverSocket = new ServerSocket( 7777 );
			
			Class.forName( "org.mariadb.jdbc.Driver" );
			conn = DriverManager.getConnection(url, user, password);
			

				//항시 대기중인 서버 만들기
				while( true ) {
					//서버 안에 트라이캐치문
					try { 
						System.out.println( "서버 준비 완료" );
						socket = serverSocket.accept();
						
						//서버에 입출력 버퍼 만들기
						br = new BufferedReader( new InputStreamReader( socket.getInputStream(), "utf-8") );
						bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream(), "utf-8") );
						
						//동이름 받아오기
						String strDong = br.readLine();
						
						//서버 종료조건
						if ( strDong.equals("exit") ) {
							break;
						}
						
						String sql = String.format(
								"select * from zipcode where dong like '%s%%'", strDong);
						
						stmt = conn.createStatement();
						rs = stmt.executeQuery(sql);
						
						//주소 저장할 스트링버퍼에 주소 읽어오기
						StringBuffer msg = new StringBuffer();
						while ( rs.next() ) {
							for ( int i=1; i<=7; i++) {
								if ( i != 7 ) {
									msg.append( rs.getNString(i) + ", " );
								} else {
									msg.append( rs.getNString(i) );
								}
							}
							msg.append( "\n" );
						}
						
						//버퍼 출력하기
						bw.write( msg.toString() + "\n");
						bw.flush();
						System.out.println( "전송 완료" );
					} catch (UnsupportedEncodingException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} finally {
						if ( br != null ) try { br.close(); } catch (IOException e) {}
						if ( bw != null ) try { bw.close(); } catch (IOException e) {}
						if ( socket != null ) try { socket.close(); } catch (IOException e) {}
					}
				}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if ( serverSocket != null ) try { serverSocket.close(); } catch (IOException e) {}
			if ( rs != null ) try { rs.close(); } catch (SQLException e) {}
			if ( stmt != null ) try { stmt.close(); } catch (SQLException e) {}
			if ( conn != null ) try { conn.close(); } catch (SQLException e) {}
		}
	}
}

-클라이언트

package Pack1207;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;

public class ZipcodeClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;
		
		BufferedWriter bw = null;
		BufferedReader br = null;
		
		try {
			socket = new Socket( "localhost", 7777 );
			
			bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream(), "utf-8" ) );
			br = new BufferedReader( new InputStreamReader( socket.getInputStream(), "utf-8") );
			
			bw.write( args[0] + "\n");
			bw.flush();
			System.out.println( "전송완료" );
			
			String msg = null;
			while ( ( msg = br.readLine() ) != null ) {
				System.out.println( msg );
			}
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if ( br != null ) try { br.close(); } catch (IOException e) {}
			if ( bw != null ) try { bw.close(); } catch (IOException e) {}
			if ( socket != null ) try { socket.close(); } catch (IOException e) {}
		}
	}

}

먼저 이클립스에서 서버를 먼저 실행하고 cmd에서 클라이언트를 실행한다.

 

 

Scanner나 System.in을 사용해서 아래와 같이 만들기

이번에는 args[0]이 아닌 사용자에게 입력을 받아서 검색을 해보자.

 

java ZipcodeClientEx01

동이름 : 

 

아래 코드로 바꿔주면 된다.

bw.write(args[0] + "\n");


//위에 코드를 아래 코드로 변경
Scaaner sc = new Scanner(System.in);
String strDong = sc.nextLine();
bw.write( strDong );

 

만약 cmd로 서버를 실행하려면 JDBC 드라이버를 같이 실행해야 한다.

따라서 아래 코드대로 실행하면된다.

java -classpath "jdbc드라이버있는위치" 자바클래스명

java -classpath "C:\SelfStudyJava\APIs\mariadb-java-client-2.7.1.jar" ZipcodeServerEx01

 

18.7.5 스레드 병렬처리

p1066~67

연결 수락을 위해 ServerSocket의 accept()를 실행하거나, 서버 연결 요청을 위해 Socket 생성자 또는 connect()를 실행할 경우에는 해당 작업이 완료되기 전까지 블로킹(blocking)된다. 결론적으로 ServerSocket과 Socket은 동기(블로킹) 방식으로 구동된다.

 

만약 서버를 실행시키는 main스레드가 직접 입출력 작업을 담당하게 되면 입출력이 완료될 때까지 다른 작업을 할 수 없는 상태가 된다. 서버 애플리케이션은 지속적으로 클라이언트의 연결 수락 기능을 수행해야 하는데, 입출력에서 블로킹되면 이 작업을 할 수 없게 된다. 또한 클라이언트1과 입출력하는 동안에는 클라이언트2와 입출력을 할 수 없게 된다.

그렇기 때문에 accept(), connect(), read(), write()는 별로의 작업 스레드를 생성해서 병렬적으로 처리하는 것이 좋다.

 

서버가 별로의 작업 스레드를 생성하고, 다중 클라이언트와 병렬적으로 통신하는 모습도 좋지만

이는 클라이언트의 폭증으로 인해 서버의 과도한 스레드 생성을 방지해야하므로 스레드풀을 사용하는 것이 바람직하다.

 

아래는 채팅서버 구현 예제이다.

//ChatServer

package Pack1;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;

public class ChatServer {
	//채팅룸 : 채팅아이디와 출력스트림 보관
	private HashMap<String, OutputStream> clients;
	
	public static void main(String args[]) {
		new ChatServer().start();
	}
	
	public ChatServer() {
		clients = new HashMap<String, OutputStream>();
	}
	
	public void start() {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		try {
			//서버 생성
			serverSocket = new ServerSocket( 7777 );
			System.out.println( "서버가 시작되었습니다." );
			
			//여러명의 사용자를 잡기위해 무한루프
			while(true) {
				socket = serverSocket.accept();
				System.out.println("[" + socket.getInetAddress() + " : " + socket.getPort() + "]" +
						"에서 접속하였습니다.");
				
				//어떤 사용자가 접속하면 메인스레드가 처리하지 않고 쓰레드화 시킨다.소켓을 같이 담아서 쓰레드를 만든다.
				//따라서 사용자는 이 쓰레드와 소켓을 통해 통신한다. => 병렬의 원리
				ServerReceiver thread = new ServerReceiver(socket);
				thread.start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//모든 사람에게 메시지 전송 메소드
	public void sendToAll(String msg) {
		Iterator<String> it = clients.keySet().iterator();	//clients의 키셋의 반복을 it에 저장
		
		while(it.hasNext()) {
			try {
				DataOutputStream out = (DataOutputStream)clients.get(it.next());
				out.writeUTF(msg);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	//각 쓰레드에서 하는 일
	class ServerReceiver extends Thread {
		private Socket socket;
		private DataInputStream in;
		private DataOutputStream out;
		
		public ServerReceiver(Socket socket) {
			this.socket = socket;
			try {
				//한 클라이언트에 대한 input/output strame을 계속 만든다.
				in = new DataInputStream( socket.getInputStream() );
				out = new DataOutputStream( socket.getOutputStream() );
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
		}
		
		//실행
		public void run() {
			String name = "";
			try {
				//클라이언트로부터 날라온 아이디를 읽는다.
				name = in.readUTF();
				sendToAll("#" + name + "님이 들어오셨습니다.");
				clients.put(name, out);
				
				System.out.println("현재 서버 접속자 수는 " + clients.size() + " 입니다.");
				
				//해당 클라이언트의 입력값을 계속 읽는다.
				while(in != null) {
					sendToAll( in.readUTF() );
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				sendToAll("#" + name + "님이 나가셨습니다.");
				clients.remove( name );
				System.out.println("[" + socket.getInetAddress() + " : " + socket.getPort() + "]" +
						"에서 접속을 종료하였습니다.");
				System.out.println("현재 서버 접속자 수는 " + clients.size() + " 입니다.");
			}
		}
	}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
서버가 시작되었습니다.
[/127.0.0.1 : 58955]에서 접속하였습니다.
현재 서버 접속자 수는 1 입니다.
[/127.0.0.1 : 58961]에서 접속하였습니다.
현재 서버 접속자 수는 2 입니다.
//ChatClient

package Pack1;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class ChatClient {

	public static void main(String[] args) {
		if( args.length != 1 ) {
			System.out.println("USAGE: java ChatClient 대화명");
			System.exit(0);
		}
		
		try {
			//서버에 연결
			Socket socket = new Socket( "localhost", 7777 );
			System.out.println( "서버에 연결되었습니다." );
			
			
			Thread sender = new Thread( new ClientSender( socket, args[0] ) );
			Thread receiver = new Thread( new ClientReceiver( socket ) );
			
			sender.start();
			receiver.start();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	static class ClientSender extends Thread {
		private Socket socket;
		private DataOutputStream out;
		private String name;
		
		public ClientSender(Socket socket, String name) {
			this.socket = socket;
			try {
				out = new DataOutputStream( socket.getOutputStream() );
				this.name = name;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		public void run() {
			BufferedReader br = null;
			try {
				//대화내용 프롬프트에서 읽기
				br = new BufferedReader( new InputStreamReader( System.in ) );
				if( out != null ) {
					//아이디 보내기
					out.writeUTF( name );
				}
				while ( out != null ) {
					//대화내용 보내기
					out.writeUTF( "[" + name + "]" + br.readLine() );
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				if ( br != null ) try { br.close(); } catch (IOException e) {}
			}
		}
	}
	
	static class ClientReceiver extends Thread {
		private Socket socket;
		private DataInputStream in;
		
		public ClientReceiver(Socket socket) {
			this.socket = socket;
			try {
				in = new DataInputStream( socket.getInputStream() );
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		public void run() {
			while( in != null ) {
				try {
					System.out.println( in.readUTF() );
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

 

728x90
반응형
Comments