When writing the Demo of Socket, use BufferReader in Server to get the content sent from the client
package cn.lonecloud.socket; import cn.lonecloud.thread.factory.TraceThreadPool; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.time.Instant; import java.time.LocalDateTime; import java.util.concurrent.ExecutorService; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author lonecloud * @version v1.0 * @date 5:11pm 5/9/2018 */ public class SocketServer { //create thread static ExecutorService service = new ThreadPoolExecutor(0, 10, 60L, TimeUnit.SECONDS, new SynchronousQueue<>()); // handle message class static class HandlerMsg implements Runnable { //client socket Socket clientSocket; public HandlerMsg(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { BufferedReader reader = null; PrintWriter pr = null; try { // get message reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); pr = new PrintWriter(clientSocket.getOutputStream(), true); Instant now = Instant.now(); String s = null; while ((s = reader.readLine()) != null) { pr.append(s); } pr.close(); reader.close(); clientSocket.close(); System.out.println("spend "+(Instant.now().getNano()-now.getNano())); } catch (IOException e) { e.printStackTrace (); } } } }
client
package cn.lonecloud.socket; import java.io. *; import java.net.InetSocketAddress; import java.net.Socket; import java.util.Scanner; /** * @author lonecloud * @version v1.0 * @date 5:24 pm 5/9/2018 */ public class SocketClient { public static void main(String[] args) throws IOException { Socket socket = new Socket ();
//⁇ socket.connect(new InetSocketAddress("localhost",8000)); PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true); //Get input
Scanner scanner=new Scanner(System.in); String s = scanner.nextLine(); //must use println or it will keep stuck here
printWriter.println(s); printWriter.flush();
//Read data InputStream inputStream = socket.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream)); //打印
System.out.println("from server"+reader.readLine()); System.out.flush(); printWriter.close(); reader.close(); socket.close(); } }
Main
package cn.lonecloud.socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * @author lonecloud * @version v1.0 * @date 5:21 pm 5/9/2018 */ public class ServerMain { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; Socket clientSocket = null; serverSocket = new ServerSocket(8000); while (true) { clientSocket = serverSocket.accept(); System.out.println(clientSocket.getRemoteSocketAddress() + "connect"); SocketServer.service.execute(new SocketServer.HandlerMsg(clientSocket)); } } }
The following problem occurs, if the following code is used in the Socket
while ((s = reader.readLine()) != null) { pr.append(s); }
If it does not use println to print newlines on the client, it will cause the client and the server to be in a working state all the time, because it has never received "\n"