간단한 네트워크 서버 클래스의 실현
15804 단어 서버
1. 여러 연결 가능
2. 네트워크 서버 클래스(또는 인터페이스)를 계승하거나 실현하는 처리만으로 서로 다른 연결 기능을 실현할 수 있다
3. 서버가 종료되었을 때 이미 만들어진 개인 연결은 중단되지 않지만 서버는 새로운 연결을 받지 않습니다
위의 기능에 맞추어 실현할 모듈을 분해해 보겠습니다.
1. 다중 스레드는 여러 개의 연결을 실현하고 서버Socket accept가 하나의 연결 요청에 도달하면 독립된 스레드를 엽니다.
2. 이를 실현하려면 위에 새로 지은 라인이 네트워크 서버에 잠겨 관리될 수 있도록 요구한다
3. 서버가 다른 연결을 받지 않고 루트로 끊을 수 있으며 개인 연결은 계속될 수 있다. 이것은 서버가 연결을 받는 서비스 종류는 반드시 개인 연결 처리와 분리되어야 한다.
다음은 마지막 완성품이 아니지만 시도 과정도 많은 시사점을 줄 수 있다고 생각하니 저와 함께 시도해 보세요.
우리가 먼저 생각한 방식은 다음과 같다.
TCPServer 클래스:
1 public class TCPServer extends Thread {
2
3 ServerSocket server = null;
4 volatile boolean shouldstop = false;
5
6 public synchronized void startServer(int port) throws Exception {
7 server = new ServerSocket(port);
8 new TCPServer().start();
9 }
10
11 public void run() {
12 while (!shouldstop) {
13 try {
14 Socket dataSocket = server.accept();
15 TCPConnection newConnection = new TCPConnection(dataSocket);
16 newConnection.start();
17 } catch (IOException e) {
18 e.printStackTrace();
19 }
20 }
21 }
22
23 public synchronized void stopServer(){
24 if(server!=null){
25 shouldstop = true;
26 interrupt();
27 try {
28 server.close();
29 } catch (Exception e) {
30 }
31 server = null;
32 }
33 }
34 }
TCPConnection 클래스:
1 import java.net.Socket;
2
3
4 public class TCPConnection extends Thread{
5
6 public TCPConnection(Socket dataSocket) {
7
8 }
9
10 public void run(){
11 // dosomething();
12 }
13 }
TCPServer 클래스는run 방법에서 요청 연결을 받기 위해 순환합니다. 요청 연결이 오면 이 개인 연결을 위해 TCPConnection 라인을 새로 만들고 시작합니다.
보아하니 위의 실현은 가능할 것 같다. 모든 연결은 독립적으로 실행될 수 있을 뿐만 아니라stopServer 방법도 서버를 닫은 후에 개인 연결의 통신에 영향을 줄 수 있다.그러나 "TCPServer를 계승하거나 실현하는 것만으로 연결 기능을 수정할 수 있다"고 요구한다.
상기 요구를 완성하기 위해서는 TCPConnection을 TCPServer에 통합해야 한다.그러면 어떻게 통합해야 TCPServer를 계승하거나 실현함으로써 연결에 대한 수정을 할 수 있습니까?
여기서 제가 사용하는 방식은 개인 연결과 TCPServer가run 방법을 공유하고 로고 위치를 이용하여 개인 연결을 실현하여 자신의 일을 처리하고 서버 Socket이 순환하여 연결을 기다리는 것입니다.
1 package com.choi.net.server;
2
3 import java.io.IOException;
4 import java.net.ServerSocket;
5 import java.net.Socket;
6
7 /**
8 * @author Choi
9 *
10 * @version 1.0
11 *
12 * */
13
14 public class TCPServer implements Cloneable, Runnable {
15
16 Thread runner = null;
17 protected ServerSocket server = null;
18 Socket data = null;
19 volatile boolean shouldStop = false;
20
21 public synchronized void startServer(int port) throws IOException {
22 if (runner == null) {
23 server = new ServerSocket(port);
24 runner = new Thread(this);
25 runner.start();
26 }
27 }
28
29 public synchronized void stopServer() {
30 if (server != null) {
31 shouldStop = true;
32 runner.interrupt();
33 runner = null;
34 try {
35 server.close();
36 } catch (Exception e) {
37 }
38 server = null;
39 }
40 }
41
42 @Override
43 public void run() {
44 if (server != null) {
45 while (!shouldStop) {
46 try {
47 Socket dataSocket = server.accept();
48 System.out.println(" ");
49 TCPServer newServer = (TCPServer) clone();
50 newServer.server = null;
51 newServer.data = dataSocket;
52 newServer.runner = new Thread(newServer);
53 newServer.runner.start();
54 } catch (Exception e) {
55 }
56 }
57 } else {
58 System.out.println(" ");
59 run(data);
60 }
61 }
62
63 public void run(Socket dataSocket) {
64 System.out.println(" ");
65 }
66 }
TCPServer가 cloneable 인터페이스를 실현하는 방식으로 새로운 연결을 구축하는 것은 단지 편의를 위한 것이다.개인 연결을 위한 새 라인을 만든 후에 새 대상의 서버를null로 지정하면run 방법의if(서버!=null)는 서버 Socket과 개인 연결 Socket의 처리를 분리할 수 있습니다.개인 연결의 처리는 63~65의 빈 방법이다.
특유의 기능을 실현하려면 TCPServer를 계승하고 하위 클래스에서 run(Socket dataSocket)을 쓰면 된다.
전체 코드와 실례는 나의 github 홈페이지에서 다운로드할 수 있습니다.https://github.com/choitony/TCPServer
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
집 서버 설계 (하드웨어 편)자신의 Redmine이나 ownCloud를 운용하기 위해 사쿠라 VPS, DigitalOcean, OpenShift 등을 놀랐습니다만, 침착 해 왔으므로 현상을 정리하고 싶습니다. 먼저 하드웨어 구성을 정리합니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.