Java Socket 통신 분석에 대한 심층적인 이해
이 기사에서는 주로 Java 소켓에 대한 심층적인 이해를 소개합니다. Java의 네트워크 통신은 소켓을 통해 구현됩니다. 소켓은 ServerSocket과 Socket의 두 가지 범주로 구분됩니다.
간략한 설명
Java의 소켓은 일반 소켓과 NioSocket의 두 가지 유형으로 나누어집니다.
소켓을 두 도시를 오가는 교통수단으로 비유할 수 있는데, 두 도시를 오가는 교통수단은 다양하며, 각 교통수단에도 해당되는 특징이 있습니다. 교통 규칙. 소켓에도 동일하게 적용되며 많은 유형이 있습니다. 대부분의 경우 안정적인 통신 프로토콜인 TCP/IP 스트림 소켓을 사용합니다. (TCP/IP와 UDP의 비교)
Java의 네트워크 통신은 Socket을 통해 구현되며, Socket은 ServerSocket과 Socket의 두 가지 범주로 구분됩니다. ServerSocket은 서버측에서 accept 메소드를 통해 요청을 수신하는 데 사용됩니다. . 소켓은 요청 후에 반환됩니다. 소켓은 데이터 전송을 구체적으로 완료하는 데 사용됩니다. 클라이언트는 소켓을 직접 사용하여 요청을 시작하고 데이터를 전송합니다.
ServerSocket 사용은 세 단계로 나눌 수 있습니다.
1. ServerSocket을 만듭니다. ServerSocket의 구성 방법은 총 5가지가 있으며 일반적으로 ServerSocket(int port)을 사용하며 포트번호(port)만 필요하다.
2. 생성된 ServerSocket의 accept 메서드를 호출하여 수신합니다. accept 메서드는 차단 방법입니다. 즉, accept 메서드를 호출한 후 프로그램이 중지되고 연결 요청을 기다리며, 요청이 수신될 때까지 프로그램이 계속되지 않습니다. 요청을 받으면 accept 메소드는 Socket을 반환합니다.
3. accept 메서드에서 반환된 소켓을 사용하여 클라이언트와 통신합니다.
Chestnut
클라이언트:
package IO; import java.io.*; import java.net.Socket; import java.util.Date; /** * Created by zhengbin06 on 2017/2/2. */ public class Client { public static void main(String[] args) { String msg = "Client Data"; try { Socket socket = new Socket("127.0.0.1", 9090); // 先写、再读 PrintWriter printWriter = new PrintWriter(socket.getOutputStream()); // 发送数据 printWriter.println(msg); printWriter.flush(); // 获得服务端返回的数据 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = bufferedReader.readLine(); System.out.println("received from server: " + line + "\ttime=" + new Date().getTime()); // 关闭资源 printWriter.close(); bufferedReader.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
서버:
package IO; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; /** * Created by zhengbin06 on 2017/2/2. */ public class Server { private static Socket socket = null; private static ServerSocket serverSocket = null; public static void main(String[] args) throws IOException { BufferedReader bufferedReader = null; PrintWriter printWriter = null; try { // 创建一个ServerSocket监听9090端口 serverSocket = new ServerSocket(9090); while (true) { System.out.println("开始等待请求。。。。"); // 等待请求 // 监听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 socket = serverSocket.accept(); System.out.println("接收到请求:" + socket.toString() + "\ttime=" + new Date().getTime()); // 接收到请求后使用socket进行通信, 创建BufferedReader用于读取数据 bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = bufferedReader.readLine(); System.out.println("received from client: " + line + "\ttime=" + new Date().getTime()); // 创建PrintWriter, 用于发送数据 printWriter = new PrintWriter(socket.getOutputStream()); printWriter.println("received data: " + line + "\ttime=" + new Date().getTime()); printWriter.flush(); } } finally { // 关闭所有资源 bufferedReader.close(); printWriter.close(); socket.close(); serverSocket.close(); } } }
세부정보
요청 수신:
새 소켓이 생성될 때 요청이 오면 이 연결에 대한 새로운 소켓 데이터 구조가 생성됩니다. 소켓 데이터에 대한 정보에는 정식 요청 소스 주소와 포트의 주소와 포트가 포함됩니다. 새로 생성된 이 데이터 구조는 ServerSocket 인스턴스의 뛰어난 연결 데이터 구조 목록과 연결됩니다. 서버의 해당 소켓 인스턴스는 현재 생성되지 않았으므로 클라이언트와의 3방향 핸드셰이크가 완료될 때까지 서버의 소켓 인스턴스는 반환되지 않으며 소켓 인스턴스에 해당하는 데이터 구조는 반환되지 않습니다. 완료됨 목록의 이동이 목록에서 수행됩니다.
데이터 전송:
연결이 성공적으로 설정되면 서버와 클라이언트 모두 소켓 인스턴스를 갖게 되며 각 소켓 인스턴스에는 InputStream 및 OutputStream이 있습니다. 그리고 이 두 객체를 통해 데이터를 교환합니다.
네트워크 I/O는 바이트 스트림으로 전송된다는 점을 알아야 합니다. 소켓 객체를 생성할 때 운영 체제는 데이터 쓰기 및 읽기를 위해 각각 특정 크기의 버퍼 영역을 할당합니다. 이 캐시 영역을 통해 완료되었습니다.
쓰기 쪽에서는 OutputStream에 해당하는 SendQ 대기열에 데이터를 씁니다. 대기열이 가득 차면 데이터는 RecvQ인 경우에는 InputStream의 RecvQ 대기열로 전송됩니다. 이 시점에서 가득 차면 RecvQ 대기열이 SendQ에서 보낸 데이터를 수용할 수 있는 충분한 공간을 가질 때까지 OutputStream의 쓰기 메서드가 차단됩니다. 그 과정은 아래 그림과 같습니다.
위 내용은 Java Socket 통신 분석에 대한 심층적인 이해입니다. PHP 중국어 웹사이트(www.php.cn)에 주목하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
