在編寫Socket的Demo的時候,在Server中使用BufferReader獲取從客服端發送過來的內容java
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:11 2018/5/9 */ public class SocketServer { //建立線程 static ExecutorService service = new ThreadPoolExecutor(0, 10, 60L, TimeUnit.SECONDS, new SynchronousQueue<>()); //處理消息類 static class HandlerMsg implements Runnable { //客戶端socket Socket clientSocket; public HandlerMsg(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { BufferedReader reader = null; PrintWriter pr = null; try { //獲取消息 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 2018/5/9 */ 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); //獲取輸入
Scanner scanner=new Scanner(System.in); String s = scanner.nextLine(); //必須使用println否則會一直卡在這裏
printWriter.println(s); printWriter.flush();
//讀取數據 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(); } }
Mainapp
package cn.lonecloud.socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * @author lonecloud * @version v1.0 * @date 下午5:21 2018/5/9 */ 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)); } } }
出現以下問題,若是Socket中若是對採用以下代碼socket
while ((s = reader.readLine()) != null) { pr.append(s); }
若是其在客戶端不採用println打印換行符,將致使客戶端與服務器端一直處於工做狀態,由於其一直都未接收到"\n"ide