이 기사에서는 Java 네트워크 프로그래밍의 간단한 서버측 클라이언트 애플리케이션을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부사항은 다음과 같습니다:
Java에서는 java.net.Socket 및 관련 클래스를 사용하여 네트워크 관련 기능을 완성합니다. Socket 클래스는 Java 기술이 네트워크 연결을 설정하고 연결을 통해 데이터를 전송하는 복잡한 프로세스를 숨기기 때문에 매우 간단하고 사용하기 쉽습니다. 아래 내용은 TCP 프로토콜에만 적용됩니다.
1. 서버에 연결
Socket 클래스의 생성자를 사용하여 다음과 같은 소켓을 열 수 있습니다.
소켓 sk = new Socket("210.0.235.14",13);
그 중 210.0.235.14는 점으로 구분된 십진수 String 객체로 목적지 호스트의 IP 주소(혹은 호스트 이름)을 나타내며, 13은 목적지 호스트에 접속하기 위해 지정된 포트 13을 나타낸다. 여기서 210.0.235.14는 홍콩에 위치한 타이밍 서버입니다. 타이밍 서버의 기본 포트는 일반적으로 13입니다.
프로그램은 서버에 성공적으로 연결될 때까지 차단됩니다.
다음으로, Socket 클래스의 getInputStream() 메소드를 사용하여 InputStream 객체를 얻을 수 있습니다. 이 객체를 통해 대상 호스트가 우리에게 보낸 정보를 얻을 수 있습니다.
InputStream inStream = sk.getInputStream();
마찬가지로 대상 호스트에 데이터를 보내려면 getOutputStream() 메서드를 호출하여 출력 스트림 객체를 얻을 수 있습니다.
다음 예제 함수는 타이밍 서버에 연결하고 반환된 정보를 표준 출력으로 인쇄하는 것입니다.
try { Socket sk = new Socket("210.0.235.14",13); sk.setSoTimeout(3000); InputStream inStream = sk.getInputStream(); //입력 스트림 개체 가져오기 Scanner sc = new Scanner(inStream); / 데이터를 콘솔에 인쇄합니다. while(sc.hasNextLine()) { String str = sc.nextLine(); System.out.println("출력: " + str); } sk.close(); } catch(SocketTimeoutException e) //시간 초과 예외 { System.out.println("시간 초과!") } catch(예외 e ) { e.printStackTrace() }
코드의 setSoTimeout() 메소드는 시간 초과를 설정할 수 있습니다. 즉, 설정된 시간 이후에 읽기 및 쓰기 작업이 완료되지 않은 경우 SocketTimeoutException이 발생하고 이 예외를 포착하여 연결을 닫을 수 있습니다.
또한 해결해야 할 시간 초과 문제가 있는데, 이는 Socket 클래스의 생성자입니다.
새로운 소켓(호스트, 포트);
대상 호스트에 대한 연결이 성공적으로 설정될 때까지 무기한 차단됩니다. 이것은 확실히 우리가 원하는 것이 아닙니다. 다음을 호출하여 이 문제를 해결할 수 있습니다.
소켓 sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000);//시간 초과를 2초로 설정
2. 호스트 주소 얻기
InetAddress 클래스의 정적 메소드 getByName(hostname)은 호스트 주소를 나타내는 InetAddress 개체를 반환할 수 있습니다. 이 개체는 호스트의 IP 주소인 4바이트 시퀀스를 포함합니다. 그런 다음 getHostAddress() 메서드를 호출하여 IP 주소를 나타내는 String 객체를 반환합니다.
트래픽 볼륨이 높은 일부 호스트 이름은 일반적으로 로드 밸런싱을 달성하기 위해 여러 IP 주소에 해당합니다. InetAddress 객체의 배열을 반환하는 getAllByName() 메서드를 호출하여 모든 호스트 주소를 얻을 수 있습니다.
다음은 명령줄에 매개변수가 설정되지 않은 경우 로컬 IP 주소를 출력하는 간단한 작은 프로그램입니다. 호스트 이름이 지정되면 호스트의 모든 IP 주소가 출력됩니다.
package cls; import java.net.*; public class ShowIP { public static void main(String[] args) { try { if(args.length > 0) { String 호스트 이름 = args[0]; ] addr = InetAddress.getAllByName(hostName); //호스트의 모든 주소를 가져옵니다. //콘솔에 출력을 인쇄합니다. for(InetAddress address : addr) { System.out.println(address.getHostAddress()); } } else { System.out.println(InetAddress.getLocalHost().getHostAddress()) } } catch(Exception e) { e.printStackTrace() } }
3. 서버측 프로그램
서버 측 애플리케이션은 ServerSocket 클래스를 사용하여 소켓을 생성하고 이를 로컬 포트에 바인딩합니다.
ServerSocket 양말 = 새 ServerSocker(8000);
sock.accept() 메소드를 사용하면 프로그램이 계속해서 연결을 기다릴 수 있습니다. 이 메소드는 클라이언트가 연결될 때 새 연결을 나타내는 Socket 객체만 반환합니다. 즉, 이 메소드는 차단됩니다.
여기서는 일반적으로 이를 제공하기 위해 각 연결마다 새 스레드를 열어야 합니다.
다음은 완전한 예입니다. 서버는 포트 8400에서 연결을 기다립니다. 연결이 도착할 때마다 이를 제공하기 위해 새 스레드가 열리고 연결 정보가 로그 파일에 기록됩니다.
패키지 cls; import java.net.*; import public class ServerDemo { /** * @param args */ public static void main(String[] args) { //ServerSocket servSocket = new ServerSocket(8000); ServerSocket servSocket = new ServerSocket(8400); while(true) { 소켓 클라이언트 = servSocket.accept(); ++amount; 날짜 시간 = new Date(); 문자열 프롬프트 = time.toString() + ":th" + 금액 + "user" + client.getInetAddress( ).getHostAddress() + "Connected/n"; System.out.print(prompt); //콘솔에 정보 출력 ServerDemo.writeLog(prompt); //파일에 쓰기//새 스레드 시작 스레드 th = new Thread(new ServThread(client,amount)) th.start() } } catch(Exception e) { e.printStackTrace(); 로그 파일에 쓰기 public static void writeLog(String str) { File logFile = new File("server-log.txt") try { FileWriter out = new FileWriter(logFile,true); out.append(str); out.close(); } catch(Exception e) { e.printStackTrace(); } } } /* * 서비스 스레드 클래스*/ 클래스 ServThread는 Runnable을 구현합니다. 소켓 클라이언트; public ServThread(Socket soc,int ix) { client = soc = ix; { try { InputStream inStream = client.getInputStream(); OutputStream outStream = client.getOutputStream(); Scanner recv = new Scanner(inStream); PrintWriter send = new PrintWriter(outStream,true); 몇 마디! [연결을 종료하려면 'bye'를 입력하세요.]"); while(recv.hasNextLine()) { String str = recv.nextLine(); if(str.equals("bye")) { send.println("또 뵙겠습니다. 나중에 ~ ^-^"); break; } send.println("이것은 테스트 프로그램이며 아직 기능이 없습니다."); } 날짜 시간 = new Date(); 문자열 프롬프트 = time.toString() + ": user" + ix + "th" + client.getInetAddress().getHostAddress() + "Disconnected/n" System.out.print(prompt); /파일에 쓰기 client.close(); } catch(Exception e) { e.printStackTrace() } } }
이 프로그램은 서버에 설치되어 있으며 telnet youthol.tk 8400 명령을 사용하여 이 프로그램의 실행 결과를 경험할 수 있습니다.
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.