亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多線程服務器轉換為SSL后,回顯消息的問題

多線程服務器轉換為SSL后,回顯消息的問題

狐的傳說 2021-08-19 21:23:47
我有一個多線程聊天服務器,我已將其轉換為使用 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() 不讀取數據。
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

我想通了:問題是可用(),Java 中的 SSL 沒用。


查看完整回答
反對 回復 2021-08-19
  • 1 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號