最近看到別的開源項目都在使用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();
}
}
}