자바 소켓 프로 그래 밍(4)중복 및 병렬 서버
중복 및 병렬 서버
이 프로그램 은 중 복 된 서버 로 여 겨 집 니 다.하나의 프로 세 스 를 처리 한 후에 만 다른 연결 을 받 아들 일 수 있 기 때 문 입 니 다.더 많은 복잡 한 서버 는 동시 다발 적 입 니 다.모든 요청 에 하나의 스 레 드 를 할당 합 니 다.여러 사람의 요청 을 동시에 처리 하 는 것 같 습 니 다.모든 비 즈 니스 서버 는 동시 다발 적 인 서버 입 니 다.
자바 데이터 클래스
연결 을 위 한 클래스 가 아 닙 니 다.데이터 신문 의 클 라 이언 트 와 서버 엔 드 의 클래스 는 겉 으로 는 같 습 니 다.아래 프로그램 은 클 라 이언 트 와 서버 업 체 의 데이터 신문 sockets 를 만 들 었 습 니 다.
DatagramSocket serverSocket = new DatagramSocket( 4545 );
DatagramSocket clientSocket = new DatagramSocket();
서버 는 매개 변수 4545 로 포트 번 호 를 지정 합 니 다.클 라 이언 트 가 서버 를 호출 할 것 이기 때문에 클 라 이언 트 는 이용 가능 한 포트 를 이용 할 수 있 습 니 다.두 번 째 매개 변 수 를 생략 하면 프로그램 은 운영 체제 에 사용 가능 한 포트 를 할당 합 니 다.클 라 이언 트 는 지정 한 포트 를 요청 할 수 있 습 니 다.그러나 다른 프로그램 이 이 포트 에 연결 되 어 있 으 면요청 이 실 패 했 습 니 다.서버 로 서 의 의도 가 아니라면 포트 를 지정 하지 않 는 것 이 좋 습 니 다.
흐름 은 대화 에서 얻 을 수 없 기 때문에,우 리 는 어떻게 데이터 신문 Socket 과 대 화 를 합 니까?답 은 데이터 신문 류 에 있 습 니 다.
데이터 신문 을 접수 하 다
DatagramPacket 클래스 는 DatagramSocket 클래스 를 통 해 데 이 터 를 수신 하고 전송 하 는 클래스 입 니 다.packet 클래스 는 연결 정보 와 데 이 터 를 포함 합 니 다.앞에서 말 한 바 와 같이 데이터 보고 서 는 자체 독립 된 전송 단위 입 니 다.datagramPacket 클래스 는 이 단원 들 을 압축 했 습 니 다.아래 프로그램 은 하나의 데이터 보고 socket 으로 데 이 터 를 수신 하 는 것 을 표시 합 니 다.
DatagramPacket packet = new DatagramPacket(new byte[512], 512); clientSocket.receive(packet);
clientSocket.receive(packet);
패 킷 의 구축 기 는 얻 은 데 이 터 를 어디 에 두 는 지 알 아야 합 니 다.512 바이트 의 캐 시가 구축 되 고 구축 기의 두 번 째 매개 변수 입 니 다.두 개의 구축 기 매개 변 수 는 캐 시 크기 입 니 다.ServerSocket 류 의 accept()방법 처럼 receive()방법 은 사용 가능 하기 전에 막 힙 니 다.
데이터 신문 을 발송 하 다
데이터 보고 서 를 보 내 는 것 은 매우 간단 합 니 다.필요 한 것 은 하나의 주소 일 뿐 입 니 다.주 소 는 InetAddress 류 에 의 해 만들어 집 니 다.이 종 류 는 공공 빌 더 가 없 지만 몇 가지 static 방법 이 있 습 니 다.이러한 인 스 턴 스 를 만 들 수 있 습 니 다.아래 목록 은 InetAddress 류 를 만 드 는 인 스 턴 스 방법 을 보 여 줍 니 다.
Public InetAddress Creation Methods
InetAddress getByName(String host);
InetAddress[] getAllByName(String host);
InetAddress getLocalHost();
로 컬 호스트 의 주 소 를 얻 는 것 은 매우 유용 합 니 다.앞의 두 가지 방법 만 패 킷 을 보 내 는 데 사 용 됩 니 다.getByName()과 getAllByName()은 목적 호스트 의 주 소 를 필요 로 합 니 다.첫 번 째 방법 은 첫 번 째 조건 에 맞 는 것 만 되 돌려 줍 니 다.두 번 째 방법 은 컴퓨터 에 여러 개의 주소 가 있 을 수 있 기 때 문 입 니 다.이 경우 이 컴퓨터 는 multi-homed 라 고 합 니 다.
모든 생 성 방법 은 static 로 표 시 됩 니 다.아래 와 같이 호출 되 어야 합 니 다.
InetAddress addr1 = InetAddress.getByName("merlin");
InetAddress addr2[] = InetAddress.getAllByName("merlin");
InetAddress addr3 = InetAddress.getLocalHost();
이 모든 호출 은 Unknown Host Exception 위반 을 던 질 수 있 습 니 다.만약 한 컴퓨터 가 DNS 서버 에 연결 되 지 않 았 거나 호스트 가 확실히 찾 지 못 했다 면 이 위반 은 던 져 질 것 입 니 다.만약 한 컴퓨터 가 활성 화 된 TCP/IP 설정 이 없다 면 getLocalhost()도 실패 하고 위반 을 던 질 것 입 니 다.
주소 가 확정 되면 데이터 신문 을 보 낼 수 있 습 니 다.아래 프로그램 은 목적 socket 에 문자열 을 전송 합 니 다.
String toSend = "This is the data to send!");
byte[] sendbuf = new byte[ toSend.length() ];
toSend.getBytes( 0, toSend.length(), sendbuf, 0 );
DatagramPacket sendPacket = new DatagramPacket( sendbuf, sendbuf.length,
addr, port);
clientSocket.send( sendPacket );
우선,문자열 은 하나의 바이트 배열 로 변환 되 어야 합 니 다.그리고 새로운 DatagramPacket 인 스 턴 스 가 만들어 져 야 합 니 다.빌 더 의 마지막 두 매개 변 수 를 주의 하 십시오.가방 을 보 내 려 면 주소 와 포트 가 지정 되 어야 합 니 다.하나의 applt 은 서비스 기기 의 주 소 를 알 수 있 지만 서버 는 클 라 이언 트 의 주 소 를 어떻게 알 수 있 습 니까?어떤 가방 이 받 았 을 때,되 돌아 오 는 주소 와 포트 는 압축 을 풀 고 getAddress()와 getPort()방법 을 통 해 얻 을 수 있 습 니 다.이것 은 서버 가 클 라 이언 트 의 가방 에 어떻게 응답 하 는 지 입 니 다.
DatagramPacket sendPacket = new DatagramPacket( sendbuf, sendbuf.length,
recvPacket.getAddress(), recvPacket.getPort() );
serverSocket.send( sendPacket );
연결 을 위 한 조작 과 달리 데이터 보고 서버 서버 는 데이터 보고 클 라 이언 트 보다 더 간단 합 니 다.
데이터 서버
데이터 서버 의 기본 절차:
1.지정 한 포트 에 데이터 보고 socket 을 만 듭 니 다.
2.receive 방법 으로 들 어 오 는 가방 을 기다린다.
3.특정한 협의 로 받 은 가방 에 응답 합 니 다.
4.두 번 째 단계 로 돌아 가 거나 두 번 째 단 계 를 계속한다.
5.데이터 소켓 을 닫 습 니 다.
목록 9.3 은 간단 한 데이터 응답 서버 를 보 여 줍 니 다.받 은 가방 에 응답 합 니 다.
목록 9.3.간단 한 데이터 응답 서버
import java.io.*;
import java.net.*;
public class SimpleDatagramServer
{
public static void main(String[] args)
{
DatagramSocket socket = null;
DatagramPacket recvPacket, sendPacket;
try
{
socket = new DatagramSocket(4545);
while (socket != null)
{
recvPacket= new DatagramPacket(new byte[512], 512);
socket.receive(recvPacket);
sendPacket = new DatagramPacket(
recvPacket.getData(), recvPacket.getLength(),
recvPacket.getAddress(), recvPacket.getPort() );
socket.send( sendPacket );
}
}
catch (SocketException se)
{
System.out.println("Error in SimpleDatagramServer: " + se);
}
catch (IOException ioe)
{
System.out.println("Error in SimpleDatagramServer: " + ioe);