• Tidak ada hasil yang ditemukan

Part 4 자바 네트워크 프로그래밍

N/A
N/A
Protected

Academic year: 2023

Membagikan "Part 4 자바 네트워크 프로그래밍"

Copied!
15
0
0

Teks penuh

(1)

Part 4

자바 네트워크 프로그래밍

1. Java IO

2.

스레드

(Thread)

클래스의 소개

3. Java Socket

(2)

3. Java Socket

(3)

3.0 Java 에서 TCP 소켓 프로그램 작성

(4)

3.0 Java 에서 DatagramSocket

• 자바 UTP 프로그램 작성

(5)

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

번 이후를 사용하는 것이 바람직

(6)

3.1 JAVA Socket (2/3)

• backlog

아규먼트

동시에 컨넥션 요청이 오는 경우에

,

큐에 클라이언트의 요청을 몇 개까지 기록할 것인가를 기술

– backlog

는 큐의 최대 길이

– backlog

보다 많은 클라이언트가 컨넥션을 기다리고 있

으면 나머지 클라이언트들은 컨넥션되지 않는다

.

• bindAddr

은 서버 프로그램이 여러 개의 컴퓨터에서 작동되

는 경우에 각 컴퓨터에서 컨넥션을 받는 것이 아니라

,

특정 한 컴퓨터의 포트만 이용해서 컨넥션이 이루어지도록 할 때 사용

프로그래머는 서버 소켓을 만들어서

accept()

메소드를 호출

– accept()

메소드는 클라이언트로부터 컨넥션이 요청될 때까지

서버를 블락시키고 있다가

,

클라이언트로부터 요청이 들어 오면 클라이언트와 통신할 수 있는

Socket

클래스를 리턴한다

.

(7)

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()

메소드를 이용

(8)

3.2 JAVA Socket 기반 Chatting

채팅 프로그램

(9)

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();

}

}

}

(10)

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 기능

}

}

(11)

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) { } }

}

(12)

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();

} }

} }

(13)

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);

}

(14)

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();

}

(15)

숙제 : JAVA Socket

화이트 보드 작성

채팅 프로그램을 조금 변경

인터넷상에서 공동으로 그림을 그릴 수 있는 화이트 보드 프로그램

채팅프로그램에서는 사용자가 키입력을 하고 엔터키를 치는 경우에 메 시지가 서버에 전달

화이트보드에서는 마우스를 클릭하거나 드래그하는 경우에 마우스의 위치 정보를 서버측에 전달

Referensi

Dokumen terkait

In this instrument, the writer used four ways of collecting data, namely: questionnaire, observation sheet, interview, and reading test. In this research, the writer

Consequently, unlike in thick blood smears, there is no loss of parasite during staining; limited artefacts and overlapping cells; parasites are observable in their