我有一個多線程聊天服務器,我已將其轉換為使用 Java SSL 套接字。與我在 Github 上轉換的版本相比,您可以看到沒有 SSL 套接字的版本。(主分支有 SSL,其他分支有常規套接字)這個原始模型(沒有 SSL)使用由客戶端控制的“ServerThreads”通過向服務器端的“ClientThreads”發送消息來與其他客戶端通信,然后將它們的消息回顯到所有其他 ServerThreads。這里是ServerThread_w_SSL的run方法(客戶端) @Overridepublic void run(){ System.out.println("Welcome :" + userName); System.out.println("Local Port :" + socket.getLocalPort()); System.out.println("Server = " + socket.getRemoteSocketAddress() + ":" + socket.getPort()); //setup handshake socket.setEnabledCipherSuites(socket.getSupportedCipherSuites()); try{ PrintWriter serverOut = new PrintWriter(socket.getOutputStream(), false); InputStream serverInStream = socket.getInputStream(); Scanner serverIn = new Scanner(serverInStream); // BufferedReader userBr = new BufferedReader(new InputStreamReader(userInStream)); // Scanner userIn = new Scanner(userInStream); socket.startHandshake(); while(!socket.isClosed()){ if(serverInStream.available() > 0){ if(serverIn.hasNextLine()){ System.out.println(serverIn.nextLine()); } }原始程序使用常規套接字,但在轉換為 SSL 套接字后,我遇到了一個問題:輸入沒有從 ClientThreads(服務器端)回顯到 ServerThreads(客戶端)。在我第一次嘗試轉換為 SSL 時,我使用了證書、密鑰庫和信任庫。我遇到了同樣的問題,就像我在這里沒有它們一樣,而是只使用依賴于 JDK 附帶的 cacerts 文件的默認套接字工廠。請注意,在遇到此錯誤之前,要解決的第一個問題是客戶端和服務器之間發生的握手失敗。由于 SSL 和 Java PrintWriter 類的工作方式,握手在第一次調用 PrintWriter.flush() 時啟動,一旦客戶端向服務器發送聊天消息,就會發生這種情況。這只能通過在 ClientThread(服務器)和 ServerThread(客戶端)中手動啟用支持的密碼套件來解決,然后至少在 ClientThread 中調用 SSLSocket.StartHandshake(),如果不是同時調用的話?,F在服務器正在接收來自客戶端的消息,但它沒有將它們回顯給客戶端。當我在調試器中運行它并嘗試單步執行代碼時,我發現 ClientThread 接收客戶端的消息并通過為每個 ClientThread 調用 PrintWriter 上的 write() 將其發送回,然后刷新 ()。ServerThread 應該通過調用 InputStream.available() 在不阻塞的情況下檢查輸入來接收它,但 available() 總是返回“0 字節”,因此它永遠不會命中 Scanner.nextLine()因此 Printwriter.write() 和 .flush() 不發送數據或 InputStream.available() 不讀取數據。
添加回答
舉報
0/150
提交
取消