소켓은 특정 프로그래밍 모델에서 프로세스 간 통신 링크의 끝점을 나타냅니다. 이 특정 프로그래밍 모델의 인기로 인해 Socket이라는 이름은 Java 기술을 포함한 다른 영역에서 재사용되었습니다.
연결이 설정되려면 한 컴퓨터는 연결을 기다리는 프로세스를 실행해야 하고, 다른 컴퓨터는 첫 번째 컴퓨터에 연결을 시도해야 합니다. 이 전화 시스템은 비슷합니다. 한 쪽은 통화를 시작해야 하고 다른 쪽은 전화 통화를 기다려야 합니다.
다음은 "echo" 기능이 있는 서버와 클라이언트를 사용하여 네트워크 애플리케이션을 작성하기 위한 java.net 패키지 애플리케이션을 소개합니다.
이 예제의 주요 기능은 서버측 프로그램이 클라이언트의 입력을 기다린 후 읽은 정보를 클라이언트에 에코하는 동시에 서버측 콘솔에 출력하는 것입니다. 클라이언트는 콘솔에서 정보를 받은 후 클라이언트에 입력을 보내고 서버에서 에코 데이터를 받은 다음 이를 콘솔에 표시합니다.
package com.javapp.ch11;
import java.io.*;
import java.net.*;
/**
* 설명: "에코" 기능이 있는 서버측 및 클라이언트측 프로그램
*/
공개 클래스 EchoClientDemo {
// 서버측 서비스 포트입니다.
public static final int SERVERPORT = 990;
public static void main(String[] args) {
try {
// 연결 소켓을 설정합니다.
Socket s = new Socket("localhost",SERVERPORT);
System.out.println("socket = " s);
// 새 네트워크 연결의 입력 스트림을 생성합니다.
BufferedReader in = 새로운 bufferedReader
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())), true); 리더.
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("문자열을 입력하고 종료하려면 BYE를 입력하세요! ");
while(true) {
// 콘솔에서 입력된 문자열을 읽어서 네트워크 연결로 출력, 즉 서버로 데이터를 보냅니다.
out.println(stdin.readLine());
문자열 str = in.readLine();
String str = in.readLine();
~ ~ (IOException e) {
System.err.println("IOException" . 먼저 java.net 패키지의 Socket 클래스를 이용하여 연결 소켓을 설정한 후, Socket 객체의 getInputStream 메소드를 이용하여 서버로부터 데이터를 수신하고, Socket 객체의 getOuputStream 메소드를 이용하여 서버에 데이터를 전송한다. 입력 및 출력 스트림을 생성한 후에는 파일과 동일한 방식으로 데이터를 읽고 쓸 수 있습니다.
다중 클라이언트를 지원하는 "echo" 서버측 프로그램 코드는 다음과 같습니다.
코드 복사
코드는 다음과 같습니다:
package com.javapp.ch11;
import java.io.*;
import java.net.*;
/**
* 설명: 멀티 클라이언트 "echo" 서버 측 프로그램 지원
*/
공개 클래스 EchoServerThreadDemo {
// 서버측 서비스 포트입니다.
public static final int SERVERPORT = 990;
public static void main(String[] args) {
try {
// 연결된 클라이언트의 일련번호입니다.
정수 = 1;
~ 정수 숫자 = 1;
ServerSocket s = new ServerSocket(SERVERPORT);
System.out.println("Started: " s);
while (true) {
연결 소켓 설정 문자.
소켓 수신 = s.accept();
System.out.println("연결 " 번호 " 허용됨: ");
System.out.println(incoming);
스레드는 다음 용도로 사용됩니다. 서버와 클라이언트 간의 데이터 전송.
// 기본 프로그램은 요청이 들어오는지 계속 모니터링합니다. > }
}
}
class EchoThread는 Thread {
private Sockets를 확장합니다. ;
int n;
public EchoThread(소켓 수신, int 번호 ) {
s = 수신;
n = 번호;
}
} public void run() {
시도해 보세요 {
BufferedReader in = 새로운 bufferedReader
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())),true);
System.out.println("안녕하세요! 종료하려면 BYE를 입력하세요." );
// 클라이언트의 입력을 에코합니다.
While (TRUE) {
// 클라이언트로부터 데이터를 받기 위해 네트워크에서 한 줄을 읽습니다.
string line = in.readline ();
// 수신된 데이터가 비어 있는 경우(비어 있는 데이터가 아닌 Enter를 직접 누른 경우) 사이클을 종료하고 연결을 닫습니다.
if (라인 == 작별 인사")) {
System.out.println( "클라이언트 " n "이 BYE를 입력했습니다!");
System.out.out.println ("Echo" n ":" line)
// 네트워크에 연결하여 행을 출력합니다. 즉, 클라이언트에 데이터를 보냅니다.
out.println("Echo " n ": " line);
s.close();
} catch(IOException e) {
System.err.println("IOException");
}
}
}
서버측 프로그램에서는 먼저 java.net 패키지의 ServerSocket 클래스를 사용하여 서버측 청취 소켓을 생성합니다. 그런 다음 ServerSocket 클래스의 accept 메서드를 사용하여 사용자 요청을 기다리고 수신합니다. 서버가 연결 요청을 받으면 서버와 클라이언트 간의 데이터 전송을 별도로 처리하기 위해 스레드를 시작합니다. 서버 측 데이터의 수신 및 전송은 위에서 설명한 클라이언트 측 데이터의 전송 및 도입과 동일합니다.