이 자기소개서를 소켓 프로그래밍에서 Java 를 시작으로,간단한 클라이언트-서버의 예를 보여주는 기본적인 기능의 Java I/O. 당신이 도입되는 원래
java.io
포장 및 NIO,non-blocking I/O(java.nio
) Api 에 도입 Java1.4. 마지막으로 Nio 에서 앞으로 Java7 에서 구현 된 Java 네트워킹을 보여주는 예제를 볼 수 있습니다.2.,
소켓 프로그래밍은 서로 통신하는 두 시스템으로 귀결됩니다. 일반적으로 네트워크 통신은 Tcp(Transport Control Protocol)와 Udp(User Datagram Protocol)의 두 가지 맛으로 제공됩니다. TCP 와 UDP 는 다른 목적으로 사용하고 모두 독특한 제약 사항이 있습니다.
- TCP 은 비교적 간단하고 신뢰할 수 있는 프로토콜할 수 있도록 하는 클라이언트에게 서버에 연결하고 두 시스템을 전달합니다. TCP 에서 각 엔티티는 통신 페이로드가 수신되었음을 알고 있습니다.,
- UDP 은 비연결형 프로토콜과 좋은 시나리오에 대 한 당신은 반드시 필요가 없습니다 모든 패킷을 목적지에 도착,와 같은 미디어 스트리밍입니다.
감사 사이의 차이는 TCP 와 UDP,고려 무슨 일이 일어날 경우에서 스트리밍 비디오를 좋아하는 웹사이트에 삭제 프레임이 있습니다. 당신이 선호하는 클라이언트가 느려 동영상을 받는 프레임 누락 또는 사용자가 선호하는 것은 비디오를 계속 재생? 비디오 스트리밍 프로토콜은 일반적으로 UDP 를 활용합니다., TCP 는 배달을 보장하기 때문에 HTTP,FTP,SMTP,POP3 등에 대한 선택 프로토콜입니다.
이 튜토리얼에서는 Java 의 소켓 프로그래밍을 소개합니다. 원래 Java I/O 프레임 워크의 기능을 시연 한 다음 nio 에 도입 된 기능을 사용하여 점진적으로 진행하는 일련의 클라이언트-서버 예제를 제시합니다.2.
구식 Java sockets
nio 이전의 구현에서 Java TCP 클라이언트 소켓 코드는java.net.Socket
클래스에 의해 처리됩니다., 다음 코드는 연결을 열 server
Socket socket = new Socket( server, port );
한 번 우리의socket
인스턴스는 서버에 연결되어 있는 우리가 시작할 수 있습을 획득 입력 및 출력 스트림을 끊. 입력 스트림은 서버에서 데이터를 읽는 데 사용되는 반면 출력 스트림은 서버에 데이터를 쓰는 데 사용됩니다., 를 실행할 수 있습니다 다음과 같은 방법을 구하는 입력 및 출력 스트림:
InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();
기 때문에 이들은 일반 스트림,같은 스트림 하는 우리가 사용하는 것에 대한 읽기 및 쓰기를 파일로 변환할 수 있습을 형성하는 최고의를 우리를 사용한 경우. 예를 들어,우리가 할 수 포장OutputStream
와PrintStream
쉽게 찾을 수 있도록 쓰기 텍스트와 같은 방법을println()
., 또 다른 예를 들어,우리가 할 수 포장InputStream
와BufferedReader
를 통해InputStreamReader
하기 위해,쉽게 읽을 텍스트와 같은 방법을readLine()
.
Java 소켓 클라이언트 예제
HTTP 서버에 대해 HTTP GET 을 실행하는 짧은 예제를 통해 작업 해 보겠습니다., HTTP 는 보다 더 정교한 우리의 예에 허용하지만,작성할 수 있습니다 클라이언트를 처리하는 코드는 가장 간단한 경우:요청 자원에서 서버와 서버의 응답을 반환과 스트림을 닫습니다. 이 경우 다음 단계가 필요합니다.
- 포트 80 에서 수신 대기중인 웹 서버에 소켓을 만듭니다.
- 을 얻을
PrintStream
서버에 요청을 보내는GET PATH HTTP/1.0
,어디PATH
은 요청된 자원은 서버입니다., 예를 들어 웹 사이트의 루트를 열고 싶다면 경로는/
입니다. - 서버에
InputStream
를 가져 와서BufferedReader
로 래핑하고 응답 줄 단위로 읽습니다.
목록 1 은 이 예제의 소스 코드를 보여줍니다.
목록 1. SimpleSocketClientExample.java
목록 1 은 연결할 서버(포트 80 의 서버에 연결한다고 가정)와 검색 할 리소스라는 두 가지 명령 줄 인수를 허용합니다., 생Socket
는 점이 서버에 명시적으로 지정 포트80
. 그 후 실행하는 명령:
GET PATH HTTP/1.0
예를 들어,
GET / HTTP/1.0
어떤 일이 벌어졌을까요?
를 검색할 때 웹 페이지 웹 서버에서,같은HTTP 클라이언트가 사용하는 DNS 서버가 서버의 주소:을 시작하여 요청의 최상위 도메인 서버에 대해
com
도메인의 신뢰할 수 있는 도메인 이름 서버에 대해., 그런 다음 해당 도메인 이름 서버에
의 IP 주소(또는 주소)를 묻습니다. 그런 다음 포트 80 의 해당 서버에 소켓을 엽니 다. (는 경우 또는,정의하고자 하는 다른 포트에 의해 수행할 수 있습니다 추가 콜론 뒤에 포트 번호,예를 들어:
:8080
.)마지막으로,HTTP 클라이언트 실행합을 지정하는 HTTP 메소드,같은GET
,POST
,PUT
,DELETE
,HEAD
또는OPTI/ONS
. 각 메소드에는 고유 한 구문이 있습니다., 과 같은 위의 코드를 자르는,GET
방법을 필요로우 모션으로 개선하는 데 도움이HTTP/version number
고 빈 줄. HTTP 헤더를 추가하고 싶다면 새 줄에 들어가기 전에 그렇게 할 수있었습니다.
In Listing1,우리는 검색는OutputStream
과에 싸서PrintStream
할 수 있도록 우리는 더 쉽게 실행하는 우리의 텍스트 기반의 명령입니다., 우리의 코드 얻은InputStream
,감싸는InputStreamReader
,어떤 변환을Reader
를 감싸는BufferedReader
. 우리가 사용하는PrintStream
를 실행하는GET
방법 및 사용되는BufferedReader
을 읽는 응답을 줄 때까지 우리가 받은null
응답타 소켓이 마감되었습니다.,
이행 이 클래스는 전달한 다음 인수
java com.geekcap.javaworld.simplesocketclient.SimpleSocketClientExample www.javaworld.com /
비슷한 결과가 나타나야 합니다 무엇의 아래
이 출력을 보여줍 테스트 페이지에 JavaWorld 의 웹 사이트입니다. 그것은 HTTP 버전 1.1 을 말하고 응답은200 OK
라고 다시 대답했다.
Java 소켓 서버를 들어
에 대한 내용을 클라이언트 측면과 다행히 통신 측면 서버의 측면은 간단합니다., 단순한 관점에서 프로세스는 다음과 같습니다.
- 수신 대기 할 포트를 지정하는
ServerSocket
를 만듭니다. - 호출한
ServerSocket
‘saccept()
메소드를 들어에 포트를 구성한 클라이언트의 연결입니다. - 클라이언트가 서버에 연결하는
accept()
방법을 반환하는Socket
통해 서버와 통신할 수 있는 클라이언트입니다., 이 같은Socket
클래스는 우리가 사용에 대한 우리의 클라이언트,그래서 프로세스와 동일해야 합니다.InputStream
에서 읽을 클라이언트와는OutputStream
쓰기를 클라이언트입니다. - 경우 서버가 필요하다는 확장 가능하고 싶을 것이다 통과하는
Socket
하는 또 다른 스레드 공정하도록 서버를 듣고 계속할 수 있습에 대한 추가적인 연결이 있습니다. - 통화
ServerSocket
‘saccept()
방법을 다시 듣고 또 다른 연결합니다.,
곧 보실 수 있겠지만,이 시나리오의 nio 의 처리는 조금 다를 것입니다., 하지만 지금 우리가 직접 만들기ServerSocket
전달하여 그것은 포트를 듣고서(이에 대해ServerSocketFactory
s 에서는 다음 섹션):
ServerSocket serverSocket = new ServerSocket( port );
그리고 지금 우리가 할 수 있습 들어오는 연결을 받아들을 통해accept()
방법:
Socket socket = serverSocket.accept();// Handle the connection ...
다중 스레드 자바 프로그래밍 소켓
Listing2,아래의 모든 서버 코드는 지금까지 함께 약간 더 강력한 예가 사용하는 쓰레드를 처리하는 여러 요청합니다., 표시된 서버는 에코 서버이며,이는 수신하는 모든 메시지를 다시 에코한다는 것을 의미합니다.
목록 2 의 예제가 복잡하지는 않지만 NIO 의 다음 섹션에서 나오는 내용 중 일부를 예상합니다. 특별한 관심을 지불하는 금액의 실을 꿰는 코드를 작성해야를 구축하기 위해 서버를 처리할 수 있는 동시에 여러 요청합니다.
목록 2. SimpleSocketServer.java
목록 2 에서 새SimpleSocketServer
인스턴스를 만들고 서버를 시작합니다., 이 필요하기 때문에SimpleSocketServer
연장Thread
들을 차단accept()
통화에서 볼 수 있는read()
방법입니다. run()
방법은 앉아 루프에서 클라이언트 요청을 받아들이 만드는RequestHandler
스레드가 요청을 처리할 수 없습니다. 다시 말하지만,이것은 비교적 간단한 코드이지만,또한 스레드 프로그래밍의 공정한 금액을 포함한다.,
주도하는RequestHandler
를 처리하는 클라이언트 통신 많은 코드에 목록 1:감싸는OutputStream
와PrintStream
을 용이하게 쉽게 쓰고,마찬가지로, 랩InputStream
와BufferedReader
쉽게 읽습니다. 서버가가는 한 클라이언트에서 라인을 읽고 클라이언트로 다시 에코합니다. 클라이언트가 빈 줄을 보내면 대화가 끝나고RequestHandler
가 소켓을 닫습니다.
NIO 및 NIO.,2
많은 응용 프로그램에서 방금 탐색 한 기본 Java 소켓 프로그래밍 모델로 충분합니다. 를 포함하는 응용 프로그램에 대한 더 많은 I/O 또는 비동기 입력/출력을 원할 것입니다 익숙한 비 차단 Api 에 도입 Java NIO 및 NIO.2.
JDK1.4NIO 패키지는 다음과 같은 주요 기능을 제공합니다:
- 채널을 지원하도록 설계되었는 대량 전송에서 하나 NIO 버퍼니다.
- 버퍼는 간단한 작업 집합에 의해 인터페이스 된 연속적인 메모리 블록을 나타냅니다.,
- 비 차단 입력/출력은 파일 및 소켓과 같은 일반적인 I/O 소스에 채널을 노출시키는 클래스 집합입니다.
NIO 로 프로그래밍 할 때 대상까지 채널을 연 다음 대상에서 버퍼로 데이터를 읽고 버퍼에 데이터를 쓰고 대상에 보냅니다., 우리는 다이빙으로 설정하는 소켓을 획득 채널 그것은 곧 하지만 첫 번째 검토는 프로세스의 버퍼를 사용하여:
- 쓰기로 데이터를 버퍼
- 호출 버퍼의
flip()
방법을 준비하는 그것을 읽기 위해 - 에서 읽은 데이터 버퍼
- 호출 버퍼의
clear()
또는compact()
법을 준비하는것은 추가 데이터를 받기 위해
데이터를 쓸 때 버퍼로 버퍼 알고있는 데이터의 양에 기록됩니다., 유지 세 가지 특성,그 의미와 다를 경우 버퍼에 읽기 모드하거나 쓰기 모드:
- 위치:쓰기 모드에서의 초기 위치는 0 이고 그것을 보유하고 현재 위치에 기록되는 버퍼에 있는 후에 당신 버퍼를 넣어 읽기 모드에서,그것은 다시 위치를 0 으로 보유하고 현재 위치에서 버퍼에서 읽,
- 량: 고정된 버퍼의 크기
- 제한:쓰기 모드에서는,제한하는 방법을 정의할 수 있는 데이터에 기록되는 버퍼에 읽기 모드,제한하는 방법을 정의할 수 있는 데이터에서 읽습니다.,
Java I/O 데모:Nio 가있는 Echo 서버.2
니오.2 에 도입했 JDK7,확장 Java non-blocking I/O 라이브러리 지원을 추가하기 위한 파일시스템과 같은 작업을java.nio.file
패키지java.nio.file.Path
클래스고를 노출하는 새로운 파일 시스템에 API 를 사용합니다. 그 배경을 염두에두고 NIO 를 사용하여 새로운 Echo 서버를 작성합시다.2 의AsynchronousServerSocketChannel
.
AsynchronousServerSocketChannel
을 제공하고 비 차단하는 비동시성 채널을 위한 스트림을 지향 듣기 소켓이 있습니다., 에 그것을 사용하기 위해,우리가 먼저 실행 정적인open()
방법은 다음bind()
이것은 특정한 포트입니다. 다음으로accept()
메소드를 실행하여CompletionHandler
인터페이스를 구현하는 클래스를 전달합니다. 대부분의 경우 익명의 내부 클래스로 생성 된 해당 핸들러를 찾을 수 있습니다.
목록 3 은 새로운 비동기 에코 서버의 소스 코드를 보여줍니다.
목록 3. SimpleSocketServer.,java
3 목록에서 우리는 첫 번째 만들로 새로운AsynchronousServerSocketChannel
그 다음에 바인딩하는 포트 5000:
final AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(5000));
에서 이AsynchronousServerSocketChannel
,we invokeaccept()
말을 듣기 시작하는 연결을 위해, 전달하기 위해 사용자 지정CompletionHandler
인스턴스입니다. accept()
를 호출하면 즉시 반환됩니다., 이 예제에서 다른ServerSocket
클래스 목록에서 1,반면accept()
방법까지 차단 클라이언트가 연결되어 있는AsynchronousServerSocketChannel
accept()
방법을 처리합니다.
완료 처리기
우리 다음에 책임을 만드는 것입CompletionHandler
등을 제공하고 구현의completed()
및failed()
방법이 있습니다., completed()
메소드가 호출될 때AsynchronousServerSocketChannel
받 연결에서 클라이언트가 포함되어 있는AsynchronousSocketChannel
클라이언트. completed()
방법 먼저 받은 연결을에서AsynchronousServerSocketChannel
한 다음 시작합과 소통하는 클라이언트입니다. 첫번째 것은 쓰는”안녕하세요”메시지:빌드 문자열로 변환한 바이트 배열한 다음 전달하는ByteBuffer.wrap()
을 구성하는ByteBuffer
., 그런 다음ByteBuffer
는AsynchronousSocketChannel
의write()
메소드를 전달할 수 있습니다.
을 읽는 클라이언트에서,우리가 만드는 새로운ByteBuffer
를 호출하여 그것의allocate(4096)
(을 만드는 4K 버퍼),그 다음 우리는 invokeAsynchronousSocketChannel
‘sread()
방법입니다. read()
반환하는Future<Integer>
에는 우리가 호출할 수 있는get()
을 검색하의 바이트 수를 읽에서 클라이언트입니다., 이 예제에서,우리는 전달get()
시간 초과 값이 20 초:지 않은 경우 응답이 20 초 만에 다음의get()
방법을TimeoutException
. 이 에코 서버에 대한 우리의 규칙은 20 초의 침묵을 관찰하면 대화를 종료한다는 것입니다.
다음으로 우리는 버퍼의 위치를 확인합니다.이 위치는 클라이언트로부터받은 마지막 바이트의 위치가됩니다. 클라이언트가 빈 줄을 보내면 캐리지 리턴과 줄 바꿈의 두 바이트가 수신됩니다., 이 검사는 클라이언트가 빈 줄을 보내면 클라이언트가 대화로 끝났음을 나타내는 지표로 삼는 것을 보장합니다. 면 우리가 의미 있는 데이터는ByteBuffer
‘sflip()
방법을 준비하기 위해 그것을 읽고 있습니다. 우리는 바이트 배열을 개최한 바이트 수를 클라이언트에서 읽은 다음을 호출하는ByteBuffer
‘sget()
로 데이터를 로드하는 바이트 배열입니다. 마지막으로 새로운String
인스턴스를 작성하여 바이트 배열을 문자열로 변환합니다., 우리는 에코 라인은 클라이언트로 다시 변환하여 문자열 바이트 배열 전달하는 것을ByteBuffer.wrap()
방법과를 호출하여AsynchronousSocketChannel
‘swrite()
방법입니다. 이제 우리clear()
ByteBuffer
는 리콜의 의미는 그것의 위치를 변경하는position
제로 둔ByteBuffer
로 쓰기 모드,그리고 우리는 읽을 다음 줄에서 클라이언트입니다.,
유일한 것을 알고 있는main()
방법을 만드는 서버 설정한 최대 60 초를 유지하는 타이머 응용 프로그램 실행됩니다. 기 때문에AsynchronousSocketChannel
‘saccept()
방법을 즉시 반환하는 경우에,우리는 없다Thread.sleep()
우리의 응용 프로그램이 즉시 중단됩니다.,
이 테스트를 위해 밖으로 시작,서버에 연결하고 그것을 사용하여 telnet 클라이언트
telnet localhost 5000
보내는 몇 가지 문자열을 서버로 관찰하는 그들이 감동을 다시,당신을 보내고 빈 줄을 대화를 종료합니다.
에서 결론
이 문서에서 제시했다는 두 가지 방법을 소켓 프로그래밍 Java:전통적인 접근 방식을 도입 Java1.0 및 최신,비-차단 니오와 NIO.자바 1.4 와 자바 7 에서 각각 도입 된 2 가지 접근법., 당신이 볼 수있는 여러 번 반복 Java 소켓 클라이언트와 Java 소켓 서버를 들어,둘 다 보여주는 유틸리티의 기본 Java I/O 고 몇 가지 시나리오 non-blocking I/O 향상 Java 소켓 프로그래밍 모델을 사용합니다. 를 사용하여 non-blocking I/O,당신이 할 수 있는 프로그램 Java 네트워크 응용 프로그램을 처리 할 여러 개의 동시 연결을 관리하지 않고도 여러 스레드 컬렉션이 있습니다. NIO 및 NIO 에 내장된 새로운 서버 확장성을 활용할 수도 있습니다.2.