Java Socket 編程

最近看到別的開源項目都在使用Socket 寫一些東西,我也練習一下:

package com.example.socket;

import java.net.Socket;

/**
 * =======================================================================================
 * 作    者:caoxinyu
 * 創建日期:2020/3/15.
 * 類的作用:
 * 修訂歷史:
 * =======================================================================================
 */
public interface ISocketServer {
    void open();
    void handle(Socket socket);
    void close();

}

package com.example.socket;

import android.text.TextUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

/**
 * =======================================================================================
 * 作    者:caoxinyu
 * 創建日期:2020/3/15.
 * 類的作用:
 * 修訂歷史:
 * =======================================================================================
 */
public class SocketServerImpl implements ISocketServer {

    private ServerSocket mServerSocket;
    private ScheduledExecutorService mScheduledExecutorService;

    @Override
    public void open() {
        mScheduledExecutorService = Executors.newScheduledThreadPool(4);
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    mServerSocket = new ServerSocket(8888);
                    //這裏一定要有一個死循環  監聽mServerSocket.accept()  方法
                    // 不然你的socket 只能請求一次
                    while (true){
                        Socket accept = mServerSocket.accept();
                        mScheduledExecutorService.execute(new Runnable() {
                            @Override
                            public void run() {
                                handle(accept);
                            }
                        });
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });


    }

    @Override
    public void handle(Socket socket) {
        PrintStream output = null;
        InputStream inputStream;
        try {
            inputStream = socket.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            StringBuilder out = new StringBuilder();
            while (!TextUtils.isEmpty(line = bufferedReader.readLine())){
                out.append(line);
                out.append("\n");
            }

            OutputStream outputStream = socket.getOutputStream();

            output = new PrintStream(outputStream);

            //這些都有嚴格的格式要求  input  和 output  stream 要好好研究下
            output.println("HTTP/1.0 200 OK");
            output.println("Content-Type: " + "text/html");
            out.append("\n");
            out.append("媳婦,天天開心啊~");


            String outString = out.toString();
            output.println("Content-Length: " + outString.getBytes().length);
            output.println();
            output.write(outString.getBytes());
            output.flush();

            output.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (output != null) {
                    output.close();
                }
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void close() {
        try {
            mServerSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章