Socket 에 대한 분석 및 쌍방 인 스 턴 트 메 신 저 자바 구현 방법

8195 단어 자바socket
자바 프로 그래 밍 에서 우 리 는 보통 네트워크 프로 그래 밍 을 접 하 게 됩 니 다.그러면 Socket 통신 을 접 할 수 밖 에 없습니다.다음은 Socket 에 대해 간단 한 분석 을 하고 쌍방 통신 의 코드 실현 방안 을 제시 하 겠 습 니 다.
우선 Socket 의 통신 과정 전 체 를 소개 하 겠 습 니 다.

먼저 서버 에서 SocketServer 를 만 듭 니 다.SocketServer 를 만 들 려 면 포트 번 호 를 지정 해 야 합 니 다.다음 과 같 습 니 다.

ServerSocket serverSocket=new ServerSocket(8888);
이렇게 해서 포트 번호 8888 인 ServerSocket 을 간단하게 열 었 습 니 다.
그 다음 에 우 리 는 클 라 이언 트 로부터 연결 요청 을 받 아야 합 니 다.즉,그림 속 Other Socket 입 니 다.우 리 는 Socker Server 의 accept 방법 으로 연결 을 만 들 수 있 습 니 다.그리고 이 방법 은 Socket 으로 돌아 가 Other Socker 와 통신 할 수 있 습 니 다.쉽게 말 하면 우 리 는 Socker Server 를 이용 하여 Socket 을 얻 은 다음 에 이 Socket 을 이용 하여 다른 사람과 통신 하 는 것 입 니 다.
그 다음 에 우 리 는 Socket 의 입 출력 흐름 을 얻 고 정 보 를 보 내 고 받 는 것 을 실현 합 니 다.이로써 우 리 는 두 측 이 Socket 통신 을 하 는 기본 적 인 방향 을 알 게 되 었 습 니 다.
다음은 ServerSocket 과 Socket 에 관 한 중요 한 방법 들 을 살 펴 보 겠 습 니 다.
ServerSocket
우선 Server Socket 의 구조 방법 을 살 펴 보 겠 습 니 다.모두 4 가지 가 있 습 니 다.
1.인삼 이 없 는 구조 방법:
ServerSocket(),바 인 딩 포트 번호 가 없 는 ServerSocket 인 스 턴 스 를 되 돌려 줍 니 다.
2.매개 변 수 를 포함 하 는 구조 방법:
ServerSocket(int port),주어진 포트 번 호 를 연결 한 ServerSocket 인 스 턴 스 를 되 돌려 줍 니 다.
3.두 개의 매개 변 수 를 포함 하 는 구조 방법:
ServerSocket(int port,int backlog)은 주어진 포트 번 호 를 연결 한 ServerSocket 인 스 턴 스 를 되 돌려 주 고 동기 화 대기 열(syns quue)의 크기 를 설정 합 니 다.
4.세 개의 매개 변 수 를 포함 하 는 구조 방법:
ServerSocket(int port,int backlog,InetAddress binddr)은 주어진 포트 번 호 를 연결 하 는 ServerSocket 인 스 턴 스 를 되 돌려 주 고 동기 화 대기 열(syns quue)의 크기 와 주어진 IP 주 소 를 연결 합 니 다.
주로 그것 의 몇 가지 방법 을 본다.
accept()
이 방법 은 연결 을 감청 하고 연결 되면 Socket 을 되 돌려 통신 에 사용 합 니 다.주의해 야 할 것 은 이 방법 은 차단 방법 입 니 다.연결 프로그램 이 없 으 면 계속 실행 되 지 않 습 니 다.
close()
Socket 을 닫 습 니 다.accept 가 막 히 고 있 으 면 Socket Exception 의 이상 을 던 집 니 다.
ServerSocket 에 대해 서 는 더 이상 군말 하지 않 겠 습 니 다.Socket 을 살 펴 보 겠 습 니 다.
Socket
구조 방법 은 여전히 여러 가지 가 존재 하 는데,여 기 는 비교적 전형 적 인 것 만 을 제시 할 뿐이다.
Socket(String host,int port),첫 번 째 매개 변 수 는 호스트 의 IP 주 소 를 문자열 로 입력 하고 두 번 째 매개 변 수 는 포트 번호 입 니 다.
getInputStream(), getOutputStream()
Socket 의 입 출력 흐름 을 가 져 옵 니 다.우 리 는 BufferReader 와 PrintWriter 를 이용 하여 이 두 흐름 을 조작 할 수 있 습 니 다.다음 과 같 습 니 다.

  BufferReader reader = new BufferedReader(
                  new InputStreamReader(socket.getInputStream()));
  PrintWriter writer = new PrintWriter(
                  new OutputStreamWriter(socket.getOutputStream()));
다음은 서로 통신 하 는 자바 구현 을 간단하게 작성 합 니 다.
우선 서버

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* Created by Mezereon on 2017/3/1.
*/
public class TCPServer {
 private Socket socket;
 private ServerSocket serverSocket;
 private BufferedReader reader;
 private PrintWriter writer;
 private Scanner scanner = new Scanner(System.in);
 //    
 public void run() throws IOException {
     startTheSocket();
 }
 public void startTheSocket() throws IOException {
   serverSocket=new ServerSocket(18080); //  18080      
   acceptTheSocket();//         Socket,reader,writer
   openTheNewThreadToGetMessageFromClient();
   while(true) {   
      getYourMessage();//           
   }
 }
 //         Socket,reader,writer
 private void acceptTheSocket() throws IOException {
   socket=serverSocket.accept();//    ,    Socket  
   System.out.println("Some one connect me ,it is "+socket.getLocalSocketAddress());//    
   System.out.println("It's port is "+socket.getPort());//     
   reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//     
   writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//     
 }
 //         
 private void getYourMessage() throws IOException {
   String yourMessage = scanner.nextLine();
   checkYourMessage(yourMessage);//           
   writer.println(yourMessage);//    
   writer.flush();//flush         ,       flush                  
 }
 //        
 private void checkYourMessage(String yourMessage) throws IOException {
   //    
   if (yourMessage.equals("exit")) {
     socket.close();
     writer.close();
     reader.close();
     System.exit(0);
   }
 }
 //                   
 private void openTheNewThreadToGetMessageFromClient() throws IOException {
   //        
   new Thread(new Runnable() {
     @Override
     public void run() {
       getTheMessageFromClient();
     }
   }).start();

 }
 //               
 private void getTheMessageFromClient() {
   while(true) {
     String messageFromClient = null;
     try {
       messageFromClient = reader.readLine();
     } catch (IOException e) {
       e.printStackTrace();
     }
     printTheMessage(messageFromClient);//          
   }
 }
 //          
 private void printTheMessage(String messageFromClient) {
   if(messageFromClient!=null)
     System.out.println("He say:"+messageFromClient);
 }    
}

그리고 클 라 이언 트 를 작성 하기 시작 합 니 다:

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created by Mezereon on 2017/2/27.
 */
public class TCPClient {

  private Socket socket;
  private BufferedReader reader ;
  private PrintWriter writer;
  private Scanner scanner = new Scanner(System.in);

  //  Socket   
  public void run() throws IOException{
      startTheSocket();
  }

  //       
  private void startTheSocket() throws IOException{
      toConnectTheServer();//  Socket    
      openTheThreadToReceiveInfoFromServer();//                   

      //    ,         
      while(true) {
        String yourMessage = scanner.nextLine();
        //        
        if(yourMessage!=null) {
          writer.println(yourMessage);
          writer.flush();//  flush     
        }
        //      
        if (yourMessage.equals("exit")) {
          disConnect();
          System.exit(0);
        }
      }
  }

  //    Socket      18080          reader writer
  private void toConnectTheServer() throws IOException {
    socket=new Socket("127.0.0.1",18080);
    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
  }

  private void openTheThreadToReceiveInfoFromServer() throws IOException {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          printMessage();//           
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }).start();
  }

  //            
  private void printMessage() throws IOException {
    while (true) {
      String messageFromServer = null;
      try {
        messageFromServer = reader.readLine();//    
        System.out.println("He say:" + messageFromServer);//    
      } catch (IOException e) {
        e.printStackTrace();
      } catch (NullPointerException e) {

      }
      if(messageFromServer.equals("exit")){
        disConnect();//    
        System.exit(0);
      }
    }
  }

  //    
  private void disConnect() throws IOException {
    socket.close();
    reader.close();
    writer.close();
  }

}

이로써 Socket 통신 에 대한 간단 한 소개 와 자바 를 이용 한 간단 한 통신 의 실현 은 끝 났 습 니 다~
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기