자바 소켓 통신 깊이 이해

5130 단어 JavaSocket
약술 하 다
자바 에 서 는 소켓 이 일반 소켓 과 니 오 소켓 두 가지 로 나 뉘 는데,여기 서 소켓 을 소개 한다.
우 리 는 Socket 을 두 도시 간 의 교통수단 에 비유 할 수 있다.그것 이 있 으 면 두 도시 사 이 를 오 갈 수 있 고 교통 공 은 여러 가지 가 있 으 며 모든 교통수단 도 해당 하 는 교통 규칙 이 있다.Socket 도 마찬가지 로 다양 하 다.대부분의 경우 TCP/IP 의 플러그 인 을 사용 하 는데 이것 은 안정 적 인 통신 프로 토 콜 이다.(TCP/IP 와 UDP 의 대비)
자바 의 네트워크 통신 은 Socket 을 통 해 이 루어 집 니 다.Socket 은 ServerSocket 과 Socket 두 가지 로 나 뉘 는데 ServerSocket 은 서버 에 사 용 됩 니 다.accept 방법 으로 요청 을 감청 하고 요청 을 감청 한 후에 Socket 으로 돌아 갑 니 다.Socket 은 구체 적 으로 데이터 전송 을 완성 하고 클 라 이언 트 는 Socket 을 직접 사용 하여 요청 을 하고 데 이 터 를 전송 합 니 다.
ServerSocket 의 사용 은 세 단계 로 나 눌 수 있 습 니 다.
1.ServerSocket 을 만 듭 니 다.ServerSocket 의 구조 방법 은 모두 5 개 로 보통 ServerSocket(int port)을 사용 하 며 포트 번호(port)만 있 으 면 된다.
2.만들어 진 ServerSocket 의 accept 방법 을 호출 하여 감청 합 니 다.accept 방법 시 차단 방법,즉 accept 방법 을 호출 하면 프로그램 이 멈 춰 서 연결 요청 을 기다 리 고 요청 을 받 기 전에 프로그램 이 내 려 가지 않 습 니 다.요청 을 받 으 면 accept 방법 은 Socket 으로 돌아 갑 니 다.
3.accept 방법 으로 돌아 온 Socket 은 클 라 이언 트 와 통신 합 니 다.
밤.
Client:

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

Server:

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

세부 사항
감청 요청:
새로운 Socket 요청 이 왔 을 때 이 연결 을 위해 새로운 소켓 데이터 구 조 를 만 들 것 입 니 다.이 소켓 데이터 의 정보 에 포 함 된 주소 와 포트 는 원본 주소 와 포트 를 정식으로 요청 합 니 다.새로 만 든 데이터 구 조 는 ServerSocket 인 스 턴 스 의 미 완성 연결 데이터 구조 목록 에 연 결 됩 니 다.이 때 서버 의 소켓 인 스 턴 스 가 생 성 되 지 않 았 습 니 다.클 라 이언 트 와 세 번 의 악수 가 끝 난 후에 야 이 서버 의 소켓 인 스 턴 스 가 되 돌아 오고 이 Socket 인 스 턴 스 에 대응 하 는 데이터 구 조 를 완성 하지 않 은 목록 에서 완 료 된 목록 으로 이동 할 수 있 습 니 다.
데이터 전송:
연결 이 성공 적 으로 이 루어 졌 을 때 서버 와 클 라 이언 트 는 하나의 Socket 인 스 턴 스 를 가지 고 있 습 니 다.모든 Socket 인 스 턴 스 는 하나의 InputStream 과 OutputStream 이 있 고 이 두 대상 을 통 해 데 이 터 를 교환 합 니 다.
네트워크 I/O 가 바이트 흐름 으로 전송 되 는 것 을 알 아야 합 니 다.Socket 대상 을 만 들 때 운영 체 제 는 InputStream 과 OutputStream 에 각각 일정한 크기 의 캐 시 구역 을 할당 합 니 다.데이터 의 기록 과 읽 기 는 이 캐 시 구역 을 통 해 이 루어 집 니 다.
기록 단 은 Output Stream 에 대응 하 는 SendQ 대기 열 에 데 이 터 를 기록 합 니 다.대기 열 이 가득 찼 을 때 데 이 터 는 다른 InputStream 의 RecvQ 대기 열 로 전 이 됩 니 다.이때 RecvQ 가 가득 찼 다 면 Output Stream 의 write 방법 은 RecvQ 대기 열 에 SendQ 가 보 낸 데 이 터 를 충분히 수용 할 수 있 을 때 까지 막 힐 것 입 니 다.과정 은 다음 그림 과 같다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기