關於Socket服務器與客戶端雙向通訊時碰到的一個坑

學習Socket時,java

想實現一個讀寫分離,可以實時接收和發送消息的socket,卻一直髮送消息出去卻不能打印出來。socket

 

客戶端發送消息出去後。ide

 

 客戶端卻不能打印出消息,客戶端也不能打印出消息。學習

一直左思右想,一直到不到問題所在。this

直到spa

 

 發現 PrintWriter將 write  方法 改成 println後成功打印出消息。.net

 

 

 

 最後 附上源碼線程

客戶端:code

 1 package my.socket;
 2 
 3 import java.io.*;
 4 import java.net.Socket;
 5 
 6 public class SocketClient {
 7 
 8     public static void main(String[] args) throws IOException {
 9         Socket socket = new Socket("localhost",55532);
10 
11         ReadSocketThread readSocketThread = new ReadSocketThread(socket);
12         readSocketThread.start();
13 
14         WriteSocketThread writeSocketThread = new WriteSocketThread(socket);
15         writeSocketThread.start();
16 
17 
18 
19     }
20 }

服務端:server

 1 package my.socket;
 2 
 3 import java.io.*;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 
 7 public class SocketService {
 8 
 9     public static void main(String[] args) throws IOException {
10 
11         ServerSocket serverSocket = new ServerSocket(55532);
12 
13         System.out.println("ServiceSocket已啓動,等待Client鏈接");
14 
15         Socket socket = serverSocket.accept();
16 
17         WriteSocketThread writeSocketThread = new WriteSocketThread(socket);
18         writeSocketThread.start();
19         ReadSocketThread readSocketThread = new ReadSocketThread(socket);
20         readSocketThread.start();
21 
22     }
23 
24 }

消息寫入線程:

 1 package my.socket;
 2 
 3 import java.io.IOException;
 4 import java.io.OutputStream;
 5 import java.io.PrintWriter;
 6 import java.net.Socket;
 7 import java.util.Scanner;
 8 
 9 public class WriteSocketThread extends Thread {
10 
11     private Socket socket;
12     private OutputStream os;
13     private PrintWriter pw;
14 
15     public WriteSocketThread(Socket socket){
16         this.socket = socket;
17         try {
18             this.os = socket.getOutputStream();
19         } catch (IOException e) {
20             e.printStackTrace();
21         }
22         this.pw = new PrintWriter(os);
23     }
24 
25     @Override
26     public void run() {
27 
28         pw.flush();
29         while (true) {
30             Scanner scanner = new Scanner(System.in);
31             pw.println(scanner.nextLine());
32             pw.flush();
33         }
34 
35     }
36 }

消息讀取線程:

 1 package my.socket;
 2 
 3 
 4 import java.io.BufferedReader;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.io.InputStreamReader;
 8 import java.net.Socket;
 9 import java.util.Scanner;
10 
11 public class ReadSocketThread extends Thread   {
12 
13     private Socket socket;
14 
15     private Scanner scanner;
16 
17 
18     public ReadSocketThread(Socket socket) throws IOException {
19         this.socket = socket;
20         this.scanner = new Scanner(socket.getInputStream());
21     }
22 
23     @Override
24     public void run() {
25         while(true){
26             try {
27                 System.out.println(scanner.nextLine());
28 
29             } catch (Exception e) {
30                 e.printStackTrace();
31                 return;
32             }
33         }
34     }
35 }

 

參考連接:https://blog.csdn.net/paullinjie/article/details/80577155

相關文章
相關標籤/搜索