JAVA 는 Tcp 프로 토 콜 기반 의 간단 한 Socket 통신 인 스 턴 스 를 실현 합 니 다.

11486 단어 자바tcp소켓 통신
오랫동안 블 로 그 를 쓰 지 못 했 습 니 다.얼마 전에 프로젝트 를 하 느 라 시간 이 지체 되 었 습 니 다.오늘부터 계속 쓰 겠 습 니 다~
오늘 은 Socket 통신 에 대한 간단 한 응용,Socket 이 무엇 인지,그리고 일부 네트워크 프로 그래 밍 의 기초 에 대해 서 는 언급 하지 않 고 가장 간단 하고 실 용적 인 것 만 기록 합 니 다.
 1.먼저 TCP 프로 토 콜 Socket 서버 와 클 라 이언 트 를 기반 으로 하 는 통신 모델 을 살 펴 보 겠 습 니 다.

 Socket 통신 절차:(간단하게 4 단계 로 나 뉜 다)
1.서버 서버 소켓 과 클 라 이언 트 소켓 만 들 기
2.Socket 에 연 결 된 출력 입력 흐름 열기
3.협의 에 따라 읽 기와 쓰기 작업 을 한다.
4.해당 자원 닫 기
2.연 결 된 API:
1.먼저 ServerSocket 을 살 펴 보 자.
클래스 ServerSocket
서버 소켓 을 실현 합 니 다.서버 소켓 이 네트워크 를 통 해 들 어 오 기 를 기다 리 고 있 습 니 다.이 요청 을 바탕 으로 일부 작업 을 수행 한 후 요청 자 에 게 결 과 를 되 돌려 줄 수 있 습 니 다.
서버 소켓 의 실제 작업 은 SocketImpl 류 의 인 스 턴 스 로 실 행 됩 니 다.응용 프로그램 은 소켓 을 만 드 는 소켓 공장 을 변경 하여 자신 을 설정 하여 로 컬 방화벽 에 맞 는 소켓 을 만 들 수 있 습 니 다.
몇 가지 중요 한 방법:(구체 적 으로 공식 api 를 보십시오)

ServerSocket(int port, int backlog) 
지정 한 backlog 를 이용 하여 서버 소켓 을 만 들 고 지정 한 로 컬 포트 번호 에 연결 합 니 다.

bind(SocketAddress endpoint, int backlog) 
ServerSocket 을 특정 주소(IP 주소 와 포트 번호)에 연결 합 니 다.

accept() 
이 소켓 의 연결 을 수사 하고 받 아들 입 니 다.

getInetAddress() 
이 서버 소켓 의 로 컬 주 소 를 되 돌려 줍 니 다.

 close() 
이 소켓 을 닫 습 니 다.
2.Socket 다시 보기
클래스 소켓
이러한 클 라 이언 트 소켓 을 실현 합 니 다.소켓 은 두 기계 간 통신 의 단점 이다.
소켓 의 실제 작업 은 SocketImpl 류 의 인 스 턴 스 로 실 행 됩 니 다.응용 프로그램 은 소켓 을 만 드 는 소켓 공장 을 변경 함으로써 로 컬 방화벽 에 맞 는 소켓 을 만 들 수 있 습 니 다.
몇 가지 중요 한 방법:(구체 적 으로 공식 api 를 보십시오)

Socket(InetAddress address, int port) 
스 트림 소켓 을 만 들 고 지정 한 IP 주소 의 지정 한 포트 번호 에 연결 합 니 다.

getInetAddress() 
소켓 연결 주 소 를 되 돌려 줍 니 다.

shutdownInput() 
이 소켓 의 입력 흐름 은'흐름 의 끝'에 있 습 니 다.

shutdownOutput() 
이 소켓 의 출력 흐름 을 사용 하지 않 습 니 다.

close() 
이 소켓 을 닫 습 니 다.
 3.코드 구현:
서버 서버.자바
1.ServerSocket 대상 을 만 들 고 포트 를 연결 하고 감청 합 니 다.
2.accept 를 통 해 클 라 이언 트 의 요청 을 감청 합 니 다.
3.연결 을 만 든 후 출력 입력 흐름 을 통 해 읽 기와 쓰기 동작
4.관련 자원 닫 기

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

  /**
   * Socket   
   */
  public static void main(String[] args) {
    try {
      ServerSocket serverSocket=new ServerSocket(8888);
      System.out.println("      ,       ..");
      Socket socket=serverSocket.accept();//             ,    Socket  
      
      
      //             
      InputStream inputStream=socket.getInputStream();//       ,          
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//    ,           
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//     
      String temp=null;
      String info="";
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("         ");
        System.out.println("           :"+info+",     ip :"+socket.getInetAddress().getHostAddress());
      }
      
      OutputStream outputStream=socket.getOutputStream();//       ,        
      PrintWriter printWriter=new PrintWriter(outputStream);//          
      printWriter.print("  ,           ");
      printWriter.flush();
      socket.shutdownOutput();//     
      
      
      
      //        
      printWriter.close();
      outputStream.close();
      bufferedReader.close();
      inputStream.close();
      socket.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

클 라 이언 트 Client.java
1.Socket 대상 을 만 들 고 서버 의 주소 와 포트 번 호 를 지정 합 니 다.
2.연결 을 만 든 후 출력 입력 흐름 을 통 해 읽 기와 쓰기 동작
3.출력 입력 흐름 을 통 해 서버 반환 정보 가 져 오기
4.관련 자원 닫 기

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

  /**
   * Socket   
   */
  public static void main(String[] args) {
    try {
      //  Socket  
      Socket socket=new Socket("localhost",8888);
      
      //             
      OutputStream outputStream=socket.getOutputStream();//       ,        
      PrintWriter printWriter=new PrintWriter(outputStream);//          
      printWriter.print("     ,  Balla_  ");
      printWriter.flush();
      socket.shutdownOutput();//     
      
      InputStream inputStream=socket.getInputStream();//       ,        
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//      ,    
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//   
      String info="";
      String temp=null;//    
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("            :"+info);
      }
      
      //        
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
      socket.close();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

4.효과 캡 처:
서버:
 
클 라 이언 트:
 
 상기 코드 는 단일 클 라 이언 트 와 서버 의 연결 을 실현 합 니 다.다 중 클 라 이언 트 작업 을 실현 하려 면 다 중 스 레 드 와 관련 되 어야 합 니 다.받 은 Socket 대상 을 따로 스 레 드 작업 을 한 다음 에 순환 while(true)로 포트 를 감청 하면 됩 니 다.이 쪽 은 코드 에 직접 주 십시오.
스 레 드 작업 클래스:SocketThread.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Socket                       (  Socket  )
 */
public class SocketThread extends Thread {
  private Socket socket;

  public SocketThread(Socket socket) {
    this.socket = socket;
  }

  public void run() {
    //              
    try {
      InputStream inputStream = socket.getInputStream();
      //        ,          
      InputStreamReader inputStreamReader = new InputStreamReader(
          inputStream);//     ,           
      BufferedReader bufferedReader = new BufferedReader(
          inputStreamReader);//      
      String temp = null;
      String info = "";
      while ((temp = bufferedReader.readLine()) != null) {
        info += temp;
        System.out.println("         ");
        System.out.println("           :" + info + ",     ip :"
            + socket.getInetAddress().getHostAddress());
      }

      OutputStream outputStream = socket.getOutputStream();//        ,        
      PrintWriter printWriter = new PrintWriter(outputStream);//           
      printWriter.print("  ,           ");
      printWriter.flush();
      socket.shutdownOutput();//      

      //         
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

서버 클래스:Server.java

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

  /**
   * Socket   
   */
  public static void main(String[] args) {
    try {
      ServerSocket serverSocket = new ServerSocket(8888);
      System.out.println("      ,       ..");

      while (true) {
        Socket socket = serverSocket.accept();//              ,    Socket  
        SocketThread socketThread = new SocketThread(socket);
        socketThread.start();
      }

    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

클 라 이언 트 클래스:Client.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

  /**
   * Socket   
   */
  public static void main(String[] args) {
    try {
      //  Socket  
      Socket socket=new Socket("localhost",8888);
      
      //             
      OutputStream outputStream=socket.getOutputStream();//       ,        
      PrintWriter printWriter=new PrintWriter(outputStream);//          
      printWriter.print("     ,    1");
      printWriter.flush();
      socket.shutdownOutput();//     
      
      InputStream inputStream=socket.getInputStream();//       ,        
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//      ,    
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//   
      String info="";
      String temp=null;//    
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("            :"+info);
      }
      
      //        
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
      socket.close();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

효과 구현 도 보기:
 
여 기 는 벽돌 을 던 져 옥 을 끌 어 올 리 는 것 일 뿐 실제 개발 에서 Socket 프로 그래 밍 을 바탕 으로 일반적으로 전달 하 는 것 은 문자열 이 아니 라 대상 이 많은 경우 에 우 리 는 Object OutputStream 을 사용 하여 출력 흐름 대상 을 직렬 화 할 수 있다.
예 를 들 면:

 OutputStream outputStream = socket.getOutputStream();
 ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
 User user=new User("admin","123456");
 objectOutputStream.writeObject(user);
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기