Part 4
자바 네트워크 프로그래밍
1. Java IO
2.
스레드(Thread)
클래스의 소개3. Java Socket
3. Java Socket
3.0 Java 에서 TCP 소켓 프로그램 작성
3.0 Java 에서 DatagramSocket
• 자바 UTP 프로그램 작성
3.1 JAVA Socket (1/3)
•
자바에서 네트워크 프로그램(
서버) – java.net
패키지–
서버 소켓(ServerSocket)
이라는 클래스를 서버측에서 사용•
생성자– ServerSocket(int port)
– ServerSocket(int port, int backlog)
– ServerSocket(int port, int backlog, InetAddress bindAddr)
•
생성자의port
부분은 서버 소켓이 사용할 포트 번호를 표시–
포트 번호는2
바이트로 표현, 0∼2
16-1
사이의 값을 가짐– 0∼1023
번까지는 보통 시스템에서 사용할 목적으로 예약
,
사용자는1024
번 이후를 사용하는 것이 바람직3.1 JAVA Socket (2/3)
• backlog
아규먼트–
동시에 컨넥션 요청이 오는 경우에,
큐에 클라이언트의 요청을 몇 개까지 기록할 것인가를 기술– backlog
는 큐의 최대 길이– backlog
보다 많은 클라이언트가 컨넥션을 기다리고 있으면 나머지 클라이언트들은 컨넥션되지 않는다
.
• bindAddr
은 서버 프로그램이 여러 개의 컴퓨터에서 작동되는 경우에 각 컴퓨터에서 컨넥션을 받는 것이 아니라
,
특정 한 컴퓨터의 포트만 이용해서 컨넥션이 이루어지도록 할 때 사용–
프로그래머는 서버 소켓을 만들어서accept()
메소드를 호출– accept()
메소드는 클라이언트로부터 컨넥션이 요청될 때까지서버를 블락시키고 있다가
,
클라이언트로부터 요청이 들어 오면 클라이언트와 통신할 수 있는Socket
클래스를 리턴한다.
3.1 JAVA Socket (3/3)
•
자바에서 네트워크 프로그램(
클라이언트) –
소켓(Socket)
이라는 클래스를 이용한다.
•
생성자– Socket(String host, int port)
– Socket(InetAddress address, int port)
• host
아규먼트는 컴퓨터의 이름을 기술하는 문자열이고,
port
는 포트 번호를 의미• address
아규먼트는IP
어드레스를 나타낸다.
자바에서는
IP 어드레스를 위해 InterAddress
클래스를 만들었다.– Socket
클래스를 만든 후에는 클라이언트와 서버 사이에 데이터를 주고받을수 있는
I/O 스트림을 만들어야 한다.
–
소켓으로부터 데이터를 받아들이기 위해서는InputStream
이 필요하고,
데이터를 전송하기 위해서는OutputStream
이 필요–
소켓에서InputStream을 얻기 위해서는 getInputStream() 메소드를,
OutputStream
을 얻기 위해서는getOutputStream()
메소드를 이용3.2 JAVA Socket 기반 Chatting
채팅 프로그램
3.3 JAVA Socket 실습 : ChatServer.java
예제
: ChatServer.java
import java.net.*;
import java.util.*;
public class ChatServer {
public static void main(String args[]) throws Exception {
if(args.length != 1) {
throw new IllegalArgumentException("Syntax : ChatServer [
포트번호]");
}
int port = Integer.parseInt(args[0]);
ServerSocket server = new ServerSocket(port);
while(true) {
Socket client = server.accept();
ChatHandler handler = new ChatHandler(client);
System.out.println("Client
가" + client.getInetAddress().getHostAddress()+"
으로 접속하였습니다.");
handler.start();
}
}
}
3.3 JAVA Socket 실습 : ChatHandler.java (1/3)
예제
: ChatHandler.java
public class ChatHandler implements Runnable {
private Socket socket;
private DataInputStream dataIn;
private DataOutputStream dataOut;
private Thread listener;
private static Vector handlers = new Vector();
public ChatHandler(Socket socket) {
this.socket = socket;
}
synchronized public void start() { data-in , data-out 선언
}
public void run()
{
채팅 관련thread
실행}
private void broadcast(String message) { send, receive 기능
}
}
3.3 JAVA Socket 실습 : ChatHandler.java (2/3)
synchronized public void start() {
if(listener == null) {
try {
dataIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
dataOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
listener = new Thread(this);
listener.start();
}catch(IOException e){ } }
}
synchronized public void stop() {
if(listener != null) {
try {
if(listener != Thread.currentThread()) {
listener.interrupt();
listener = null;
dataOut.close();
}
}catch(IOException e) { } }
}
3.3 JAVA Socket 실습 : ChatHandler.java (3/3)
public void run() {
try {
handlers.addElement(this);
while(!Thread.interrupted()) {
String message = dataIn.readUTF();
broadcast(message);
}
}catch(EOFException e) { }catch(IOException ex) {
if(listener == Thread.currentThread()) ex.printStackTrace();
}finally {
handlers.removeElement(this);
} stop();
}
private void broadcast(String message) {
synchronized(handlers) {
Enumeration enu = handlers.elements();
while(enu.hasMoreElements()) {
ChatHandler handler = (ChatHandler)enu.nextElement();
try {
handler.dataOut.writeUTF(message);
handler.dataOut.flush();
}catch(IOException e){
handler.stop();
} }
} }
3.3 JAVA Socket 실습 : ChatClient.java (1/2)
synchronized public void start() throws IOException//추가 {
if(listener == null) {
Socket socket = new Socket(host, port);// 추가 try
{
dataIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
dataOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
}catch(IOException e){
socket.close();
throw e; } listener = new Thread(this);
listener.start();
frm.setVisible(true);
} }
}
synchronized public void stop() {
if(listener != null) {
listener.interrupt();
listener = null;
dataOut.close();
}
frm.setVisible(false);
frm.dispose();
System.exit(-1);
}
3.3 JAVA Socket 실습 : ChatClient.java (2/2)
public void run() {
System.out.println("메세지 수신 대기 중\n");
try {
while(!Thread.interrupted()) {
String line = dataIn.readUTF();
taOutput.append(line + "\n");
}
}catch(IOException e){
handlerIOException(e);
} }
public static void main(String args[]) throws IOException {
if((args.length != 1) || (args[0].indexOf(':')<0)) {
System.out.println("잘못 입력했습니다.");
throw new IllegalArgumentException("Input : [host IO]:[#port]");
}
int idx = args[0].indexOf(':');
String host = args[0].substring(0, idx);
int port = Integer.parseInt(args[0].substring(idx+1));
ChatClient client = new ChatClient(host, port);
client.start();
}
숙제 : JAVA Socket
화이트 보드 작성