(2) 서버 구현

6882 단어 서버
클라이언트에게 메시지를 보낼 수 있는 간단한 서버서버 프로그램을 시작하면 클라이언트가 포트에 연결되기를 기다립니다.모든 표준 서비스가 이 포트를 사용하지 않기 때문에 8189를 선택하십시오.(1) ServerSocket 클래스는 서버 소켓을 구현합니다.예: 모니터링 포트 8189 서버 구축
    ServerSocket serverSocket = new ServerSocket(8189);

(2) 이 플러그인의 연결을 정탐하고 받아들인다.
    Socket incoming = serverSocket.accept();

(3) 네트워크를 통해 이 포트에 정확한 연결 요청을 보내면 연결이 이미 이루어진 Socket 대상을 되돌려줍니다.동요 대상을 사용하여 입력 흐름과 출력 흐름을 얻을 수 있다
    InputStream inStream = incoming.getInputStream();
    OutputStream outStream = incoming.getOutputStream();

 
서버가 서버에 보내는 출력 흐름의 모든 정보는 클라이언트 프로그램의 입력이 되고 클라이언트 프로그램에서 온 모든 출력은 서버 입력 흐름에 포함된다.(4) 최종적으로 연결된 플러그인을 닫습니다.
    incoming.close();

 
DEMO
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
	public static void main(String[] args) {
		try{
			ServerSocket serverSocket = new ServerSocket(8189);
			Socket incoming = serverSocket.accept();
			
			try{
				
			
				InputStream inStream = incoming.getInputStream();
				OutputStream outStream = incoming.getOutputStream();
				
				BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "gbk"));
				// Scanner
//				Scanner in = new Scanner(is);
				// OutputStreamWriter   
, // OutputStreamWriter outWrite = new OutputStreamWriter(outStream, "gbk"); // PrintWriter PrintWriter out = new PrintWriter(outWrite, true); out.print("Hello! Enter BYE to exit."); boolean done = false; String line = null; while((line=in.readLine())!=null){ System.out.println(line); out.println("Echo: " + line); out.println("Hello! Enter BYE to exit."); if("bye".equalsIgnoreCase(line.trim())){ out.write("bye"); break; } } //Scanner // while(!done && in.hasNextLine()){ // String line = in.nextLine(); // System.out.println(line); // out.println("Echo: " + line); // out.println("Hello! Enter BYE to exit."); // if("bye".equalsIgnoreCase(line.trim())){ // done = true; // } // } }finally{ incoming.close(); } System.out.println(serverSocket.isClosed()); }catch(IOException e){ e.printStackTrace(); } } }

 
 
1. 여러 개의 클라이언트를 위한 서비스는 일반적으로 여러 개의 클라이언트가 동시에 서버에 연결되기를 원한다. 일반적으로 서버는 서버 컴퓨터에서 끊임없이 실행되고 전체 인터넷의 사용자 시스템에서 서버를 동시에 사용한다.다중 클라이언트 연결을 거부하면 사용자가 장시간 연결 서비스로 인해 독점 서비스를 받을 수 있습니다.사실은 라인을 통해 이 문제를 처리할 수 있다.프로그램이 새로운 플러그인 연결을 만들 때마다, 즉, accept를 성공적으로 호출할 때, 서버와 클라이언트 간의 연결을 처리하기 위한 새로운 라인을 만들 것이며, 메인 프로그램은 즉시 되돌아와 다음 연결을 기다릴 것이다.(1) 이 메커니즘을 실현하기 위해 서버는 다음과 같은 코드와 유사한 순환 조작을 해야 한다.
    while(true){
        Socket incoming = serverSocket.accept();
        Runnable run = new ThreadedEchoHandler(incoming);
        Thread t = new Thread(r);
        t.start;
    }

 
(2) ThreadedEchoHandler 클래스는 Runnable 인터페이스를 실현했고 run 방법에는 클라이언트와 순환 통신하는 코드가 포함되어 있다.
 
DEMO
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ThreadedEchoServer {
	public static void main(String[] args) {
		try{
			int i = 1;
			ServerSocket server = new ServerSocket(8189);
			while(true){
				Socket incoming = server.accept();
				System.out.println("Spawning : " + i);
				Runnable runnable = new ThreadedEchoHandler(incoming);
				Thread t = new Thread(runnable);
				t.start();
				i++;
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ThreadedEchoHandler implements Runnable {

	private Socket incoming;
	
	public ThreadedEchoHandler(Socket incoming){
		this.incoming = incoming;
	}
	
	@Override
	public void run() {
		try{
			try{
				InputStream inStream = incoming.getInputStream();
				OutputStream outStream = incoming.getOutputStream();
				
				BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "gbk"));
				PrintWriter out = new PrintWriter(new OutputStreamWriter(outStream, "gbk"), true);
				
				String line = null;
				while((line=in.readLine())!=null){
					System.out.println("in:" + line);
					out.println("Echo : " + line);
					if(line.trim().equals("bye")){
						break;
					}
				}
			}finally{
				incoming.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

 
2. 반 닫기 반 닫기(half-close)는 이러한 능력을 제공한다. 플러그인 연결의 한 단락은 출력을 중지할 수 있고 다른 쪽에서 온 데이터를 받아들일 수 있다.이것은 매우 전형적인 상황이다. 예를 들어 우리가 서버에 데이터를 전송하고 있지만 얼마나 많은 데이터를 전송해야 할지 모른다.파일을 쓸 때, 우리는 데이터를 쓴 후에 파일을 닫기만 하면 된다.그러나 플러그인을 닫으면 서버와의 연결이 끊어져 응답을 읽을 수 없습니다.반 닫는 방법을 사용하면 상술한 문제를 해결할 수 있다.서버에 보내는 요청 데이터가 끝났음을 표시하기 위해 플러그인의 출력 흐름을 닫을 수 있지만, 입력 흐름 처리가 열려 있는 상태를 유지해야 합니다.예: 클라이언트에서 절반 닫기 사용
        Socket socket = new Socket(host, port);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(outStream, "gbk"), true);
       
        out.println(...);
        // 
        socket.shutdownOutput();
        String line = null;
        while((line=in.readLine())!=null){
            ...
        }
        // “ ”。
        socket.shutdownInput();
        socket.close();

 
서버 측은 입력 정보를 읽고 입력 흐름의 끝에 도달한 후에 응답을 보낼 것입니다.이 프로토콜은 HTTP 서비스와 같은 원스톱(ont-shop) 서비스에만 적용된다. 이런 서비스에서 클라이언트는 서버에 연결하고 요청을 보내서 해당하는 정보를 캡처한 다음에 연결을 끊는다.

좋은 웹페이지 즐겨찾기