실시간 응용 프로그램 또는 실시간 게임의 경우 HTTP 프로토콜은 종종 우리의 요구를 충족시킬 수 없습니다. 소켓은 우리에게 매우 실용적입니다. 아래는이 연구의 메모입니다. 주로 예외 유형, 상호 작용 원리, 소켓, 서버 소켓 및 멀티 스레딩의 측면을 설명합니다.
예외 유형
소켓의 내용을 이해하기 전에 관련된 예외 유형을 이해해야합니다. 다음 네 가지 유형은 모두 ioexception에서 상속되어 있으므로 많은 IOException이 직접 나타납니다.
UnkownhostException : 호스트 이름 또는 IP 오류
ConnectException : 서버는 연결을 거부하고 서버가 시작되지 않습니다 (대기열 수가 초과되고 연결이 거부됨)
SockettimeOutException : 연결 시간 초과
BindException : 소켓 객체는 공식화 된 로컬 IP 주소 또는 포트에 바인딩 할 수 없습니다.
상호 작용 프로세스
다음 그림이 자세하고 명확하게 설명되었다고 생각합니다.
소켓
건설자
소켓 () 소켓 (inetAddress 주소, int port)은 알 수없는 호스트 덱스크, ioExceptionSocket (inetAddress 주소, int port, inetAddress localAddress, int localport) 던지기 IoExceptionSocket (String Host, int port) 던지기, IoExceptionsocket (String host, intaddress, intaddresscort, intaddress intaddress) 던지기.
매개 변수가없는 첫 번째를 제외하고 다른 생성자는 서버에 대한 연결을 설정하려고합니다. 실패하면 IOException 오류가 발생합니다. 성공하면 소켓 객체가 반환됩니다.
InetAddress는 호스트를 녹음하는 데 사용되는 클래스입니다. 정적 gethostbyName (String MSG)은 인스턴스를 반환 할 수 있으며 정적 메소드 GetLocalHost ()는 현재 호스트의 IP 주소를 얻고 인스턴스를 반환 할 수 있습니다. 소켓 (문자열 호스트, int 포트, inetAddress localAddress, int localport) 생성자의 매개 변수는 대상 IP, 대상 포트, 로컬 IP 및 로컬 포트입니다.
소켓 방법
getInetAddress (); 원격 서버의 IP 주소
getport (); 원격 서버의 포트
로컬 클라이언트의 getLocalAddress () IP 주소
로컬 클라이언트의 getLocalport () 포트
getInputStream (); getInputStream ();
getoutStream (); 출력 스트림을 얻으십시오
이 방법들 중에서 가장 중요한 방법은 getInputStream () 및 getOutputStream ()이라는 점에 주목할 가치가 있습니다.
소켓 상태
isclosed (); // 연결이 닫혀 있습니까? 닫으면 진실을 반환하십시오. 그렇지 않으면 거짓을 반환하십시오
isconnect (); // 연결된 경우 true를 반환합니다. 그렇지 않으면 false를 반환합니다
isbound (); // 소켓이 로컬 포트에 바인딩 된 경우 True를 반환하십시오. 그렇지 않으면 거짓을 반환하십시오
소켓의 상태가 관련되어 있는지 확인하려면 다음 진술이 판단하는 좋은 방법입니다.
부울 isconnection = socket.isconnected () &&! socket.isclosed (); // 현재 관련된 지 여부를 판단합니다
반 부패한 소켓
여러 번, 우리는 얻은 입력 스트림에서 마무리하는 데 시간이 얼마나 걸리는지 알 수 없습니다. 몇 가지 일반적인 방법은 다음과 같습니다.
서버 코켓
건설자
serversocket () 던지기 ioexceptionserversocket (int port) 던지기 ioexceptionserversocket (int port, int backlog) 던지
메모:
1. 포트 서버에서들을 포트; 백 로그 클라이언트 연결 요청의 큐 길이; BindAddr 서버는 IP를 바인딩합니다
2. 포트가 점유되어 있거나 특정 포트를 사용할 수있는 권한이없는 경우 BindException 오류가 발생합니다. 예를 들어, 1에서 1023까지의 포트에는 관리자에게 권한 바인딩이 필요합니다.
3. 포트가 0으로 설정되면 시스템은 자동으로 포트를 할당합니다.
4. BindAddr은 서버 IP를 바인딩하는 데 사용됩니다. 왜 그런 설정이 있습니까? 예를 들어, 일부 기계에는 여러 개의 네트워크 카드가 있습니다.
5. 서버 소켓이 청취 포트에 바인딩되면 변경할 수 없습니다. Serversocket ()은 포트를 바인딩하기 전에 다른 매개 변수를 설정할 수 있습니다.
단일 스레드 서버 스켓 예제
public void service () {while (true) {소켓 소켓 = null; try {socket = serversocket.accrect (); // 연결 큐에서 연결을 가져 가십시오. ... // data} catch (ioexception e) {e.printstacktrace ();} finally {try {if (socket! = null) socket.close (); // 클라이언트와의 통신 후, Close Socket} catch (ioexception e) {e.printstacktrace ();}}}}}}}}}}}}}}}멀티 스레드 서사 소켓
말할 것도없이, 멀티 스레딩의 이점은 멀티 스레딩이며 대부분의 시나리오는 멀티 스레딩입니다. 실시간 게임이든 IM이든, 멀티 스레딩 요구가 필요합니다. 아래 구현 방법에 대해 이야기 해 봅시다.
멀티 스레딩을 구현하는 메소드는 스레드 클래스를 상속하거나 실행 가능한 인터페이스를 구현합니다. 물론 스레드 풀도 사용할 수 있지만 구현의 본질은 비슷합니다.
예는 다음과 같습니다.
다음 코드는 서버의 기본 스레드입니다. 각 클라이언트에 작업자 스레드를 할당하십시오.
public void service () {while (true) {소켓 소켓 = null; try {socket = serversocket.accrect (); // 기본 스레드는 클라이언트 연결 스레드를 가져옵니다. workthread = 새 스레드 (새 핸들러 (소켓)); // 스레드를 만들어 workthread.start (); // START THREAK} catch (예외 e) {e.printstacktrace (); }}}물론 여기서는 핸들러 클래스를 구현하는 방법에 중점을 둡니다. 핸들러는 실행 가능한 인터페이스를 구현해야합니다.
클래스 핸들러는 실행 가능한 {개인 소켓 소켓; 공개 처리기 (소켓 소켓) {this.socket = 소켓; } public void run () {try {system.out.println ( "new Connection :"+socket.getInetAddress ()+":"+socket.getport ()); Thread.sleep (10000); } catch (예외 e) {e.printstacktrace ();} 마지막으로 {try {system.out.println ( "연결을 닫습니다 :"+socket.getInetAddress ()+":"+socket.getport ()); if (socket! = null) socket.close (); } catch (ioexception e) {e.printstacktrace (); }}}} 물론, 스레드 풀 또는 JVM에 내장 된 스레드 풀과 같은 멀티 스레드를 먼저 할 수있는 다른 방법이 있습니다. 여기서 설명하지 않겠습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.