Java code
<ol class=" list-paddingleft-2"> <li><p>public void handleConnection(Socket connectionToHandle) { </p></li> <li><p>new Thread(new ConnectionHandler(connectionToHandle)).<br>start(); </p></li> <li><p>} </p></li> <li><p>public void handleConnection(Socket connectionToHandle) { </p></li> <li><p>new Thread(new ConnectionHandler(connectionToHandle)).<br>start(); </p></li> <li><p>} </p></li> </ol>
RemoteFileServer에 대한 큰 변경 사항이 이 메서드에 반영됩니다. 서버가 연결을 수락한 후에도 여전히 handlerConnection()을 호출하지만 이제 Runnable인 ConnectionHandler 인스턴스에 소켓을 전달합니다. ConnectionHandler를 사용하여 새 스레드를 생성하고 시작합니다. ConnectionHandler의 run() 메소드에는 소켓 읽기/쓰기 및 파일 읽기를 위한 코드가 포함되어 있으며 이는 원래 RemoteFileServer의 handlerConnection()에 있습니다.
4. 연결 처리: 2부
다음은 ConnectionHandler 클래스의 구조입니다.
Java 코드
import java.io.*; import java.net.*; public class ConnectionHandler implements Runnable{ Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle; } public void run() { } } import java.io.*; import java.net.*; public class ConnectionHandler implements Runnable{ Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle; } public void run() { }
이 도우미 클래스는 매우 간단합니다. 지금까지의 다른 클래스와 마찬가지로 java.net 및 java.io를 가져옵니다. 이 클래스에는 이 인스턴스가 처리하는 소켓을 보유하는 하나의 인스턴스 변수인 SocketToHandle만 있습니다. 클래스의 생성자는 Socket 인스턴스를 매개변수로 사용하고 이를 SocketToHandle에 할당합니다.
이 클래스는 Runnable 인터페이스를 구현한다는 점에 유의하세요. 이 인터페이스를 구현하는 클래스는 우리 클래스가 수행하는 run() 메서드를 구현해야 합니다. 나중에 run()의 세부 사항을 살펴보겠습니다. 이제 앞서 RemoteFileServer 클래스에서 본 것과 동일한 코드를 사용하여 실제로 연결을 처리한다는 점만 알아두세요.
run() 구현
여기서 연결 스트림을 가져오고 이를 사용하여 연결을 읽고 쓰고 작업이 완료된 후 닫는 run() 메서드를 구현합니다.
Java 코드
public void run() { try { PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } } public void run() { try { PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } }
ConnectionHandler run() 메서드는 RemoteFileServer의 handlerConnection()이 수행하는 작업을 수행합니다. 먼저, (소켓의 getOutputStream()과 getInputStream()을 사용하여) InputStream과 OutputStream을 각각 BufferedReader와 PrintWriter로 래핑합니다. 그런 다음 이 코드를 사용하여 대상 파일을 한 줄씩 읽습니다.
Java 코드
FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); } FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); }
클라이언트에서 유효한 파일 경로를 가져와야 하므로 해당 경로 이름으로 새 파일을 구성하고 읽기를 처리하기 위해 FileReader에 래핑합니다. 그런 다음 파일을 한 줄씩 읽을 수 있는 BufferedReader로 래핑합니다. 읽을 줄이 더 이상 없을 때까지 Java while 루프의 BufferedReader에서 readLine()을 호출합니다. readLine() 호출은 바이트가 올 때까지 차단됩니다. 일부 바이트를 얻은 후 이를 로컬 라인 변수에 넣고 클라이언트에 씁니다.
위 내용은 while 루프 문을 사용하여 Java에서 주요 링크를 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!