[자바]소켓 과 ServerSocket 학습 노트
5784 단어 socket자바serversocket
이상 유형
Socket 의 내용 을 알 기 전에 관련 된 이상 유형 을 알 아 봐 야 합 니 다.다음 네 가지 유형 은 모두 IOException 에 계승 되 기 때문에 나중에 IOException 을 바로 꺼 내 면 된다.
UnkownHostException: 호스트 이름 이나 IP 오류
ConnectException: 서버 연결 거부,서버 가 시작 되 지 않 았 습 니 다.(대기 열 수 초과,연결 거부)
SocketTimeoutException: 연결 시간 초과
BindException: Socket 대상 은 로 컬 IP 주소 나 포트 와 연결 할 수 없습니다.
대화 식 프로 세 스
Socket 과 ServerSocket 의 상호작용,아래 의 그림 은 이미 상세 하고 명확 하 게 말 한 것 같 습 니 다.
Socket
구조 함수
Socket()
Socket(InetAddress address, int port)throws UnknownHostException, IOException
Socket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOException
Socket(String host, int port)throws UnknownHostException, IOException
Socket(String host, int port, InetAddress localAddress, int localPort)throws IOException
첫 번 째 인자 가 없 는 것 을 제외 하고 다른 구조 함 수 는 서버 와 의 연결 을 시도 합 니 다.실패 하면 IOException 오 류 를 던 집 니 다.성공 하면 Socket 대상 으로 돌아 갑 니 다.InetAddress 는 호스트 를 기록 하 는 클래스 입 니 다.정적 getHostByName(String msg)은 인 스 턴 스 를 되 돌려 줍 니 다.정적 방법 getLocalhost()도 현재 호스트 의 IP 주 소 를 얻 고 인 스 턴 스 를 되 돌려 줍 니 다.Socket(String host,int port,InetAddress localAddress,int localPort)구조 함수 의 매개 변 수 는 각각 목표 IP,목표 포트,로 컬 IP 연결,로 컬 포트 연결 입 니 다.
Socket 방법
getInetAddress(); 원 격 서버 의 IP 주소
getPort(); 원 격 서버 포트
getLocalAddress() 로 컬 클 라 이언 트 의 IP 주소
getLocalPort() 로 컬 클 라 이언 트 포트
getInputStream(); 입력 흐름 가 져 오기
getOutStream(); 출력 흐름 가 져 오기
주의해 야 할 것 은 이러한 방법 중에서 가장 중요 한 것 은 getInputStream()과 getOutputStream()이다.
소켓 상태
isClosed(); //연결 이 닫 혔 는 지,닫 히 면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
isConnect();//연 결 된 적 이 있다 면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
isBound(); //Socket 이 로 컬 포트 와 연결 되 어 있다 면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.
소켓 의 상태 가 연결 되 어 있 는 지 확인 하려 면 아래 문 구 는 좋 은 판단 방식 이다.
boolean isConnection=socket.isConnected() && !socket.isClosed(); //
반 닫 기 Socket얻 은 입력 흐름 에서 얼마나 읽 어야 끝 날 지 모 르 는 경우 가 많다.다음은 비교적 보편적 인 방법 이다.
사용자 정의 식별 자(예 를 들 어 아래 의 예,"by"문자열 을 받 았 을 때 Socket 을 닫 습 니 다)읽 기 길 이 를 알려 줍 니 다.
모든 데 이 터 를 읽 었 습 니 다.
구조 함수
ServerSocket()throws IOException
ServerSocket(int port)throws IOException
ServerSocket(int port, int backlog)throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException
주의 점:1.port 서버 에서 감청 할 포트;backlog 클 라 이언 트 연결 요청 대기 열 길이;bindAddr 서버 바 인 딩 IP
2.포트 가 점용 되 거나 일부 포트 를 사용 할 수 있 는 권한 이 없 으 면 BindException 오류 가 발생 합 니 다.예 를 들 어 1~1023 포트 는 관리자 가 있어 야 연결 할 수 있 습 니 다.
3.포트 를 0 으로 설정 하면 시스템 은 자동 으로 포트 를 할당 합 니 다.
4.biddr 는 서버 IP 를 연결 하 는 데 사 용 됩 니 다.왜 이런 설정 이 있 습 니까?예 를 들 어 일부 기계 에 여러 개의 네트워크 카드 가 있 습 니 다.
5.ServerSocket 이 감청 포트 에 연결 되면 변경 할 수 없습니다.ServerSocket()은 바 인 딩 포트 앞 에 다른 인 자 를 설정 할 수 있 습 니 다.
단일 스 레 드 의 ServerSocket 예
public void service(){
while(true){
Socket socket=null;
try{
socket=serverSocket.accept();// ,
System.out.println(" :"+socket.getInetAddress()+":"+socket.getPort());
...//
}catch(IOException e){e.printStackTrace();}finally{
try{
if(socket!=null) socket.close();// , Socket
}catch(IOException e){e.printStackTrace();}
}
}
}
다 중 스 레 드 ServerSocket다 중 스 레 드 의 장점 은 말 할 필요 도 없고 대부분 장면 은 다 중 스 레 드 입 니 다.우리 의 실시 간 게임 이 든 IM 이 든 다 중 스 레 드 의 수 요 는 필수 적 입 니 다.실현 방식 에 대해 말씀 드 리 겠 습 니 다.
여기 예 를 들 면:
다음 코드 는 서버 의 메 인 스 레 드 입 니 다.모든 고객 에 게 작업 스 레 드 를 할당 합 니 다:
public void service(){
while(true){
Socket socket=null;
try{
socket=serverSocket.accept(); //
Thread workThread=new Thread(new Handler(socket)); //
workThread.start(); //
}catch(Exception e){
e.printStackTrace();
}
}
}
물론 이곳 의 중점 은 Handler 라 는 종 류 를 어떻게 실현 하 느 냐 에 있다.Handler 는 Runnable 인 터 페 이 스 를 실현 해 야 합 니 다:
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
public void run(){
try{
System.out.println(" :"+socket.getInetAddress()+":"+socket.getPort());
Thread.sleep(10000);
}catch(Exception e){e.printStackTrace();}finally{
try{
System.out.println(" :"+socket.getInetAddress()+":"+socket.getPort());
if(socket!=null)socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
물론 먼저 다 중 스 레 드 와 다른 방식 이 있 습 니 다.예 를 들 어 스 레 드 탱크 나 JVM 자체 스 레 드 탱크 등 이 있 습 니 다.여 기 는 설명 안 할 게 요.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.