2014-03-05 38 views
3

我正在嘗試編寫一個簡單的SSLserver來偵聽https請求並將單行打印爲響應。我在Web瀏覽器中導入了正確的證書和所有這些證書,並在啓動服務器時使用-Djavax.net.ssl.keyStore = -Djavax.net.ssl.keyStorePassword =標誌。Java:可以通過SSLSocket發送任何字符串,但以h/H開頭的字符串除外

我面臨的問題是我可以發送任何字符串,我可以想到的,除了任何以'h'或'H'開頭的字符串。當我與我的瀏覽器連接時,如果發送的字符串以h開頭,但不以其他方式發送,則會重置/拒絕連接。

這可能是什麼原因?我想這可能與HTTPS協議有關,但我不知道爲什麼會這樣。

public class SecureSocketServer { 
private static int port = 8080; 
private static SSLServerSocket s; 

public static void main(String[] args) { 

     try { 
     SSLServerSocketFactory sslSrvFact; 
     sslSrvFact = (SSLServerSocketFactory) 
       SSLServerSocketFactory.getDefault(); 
     s =(SSLServerSocket)sslSrvFact.createServerSocket(port); 


     SSLSocket c = (SSLSocket)s.accept(); 

     DataOutputStream out = new DataOutputStream(c.getOutputStream()); 
     c.startHandshake(); 

     //out.writeBytes("hello"); Does not work 
     out.writeBytes("Yes, Hello"); Works 

     out.flush(); 
     c.close(); 
     } 


    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

你爲什麼不寫一個正確的HTTPS頭? –

+0

您的服務器不會打印單行作爲響應。沒有行終止符。 – EJP

+0

'最小代碼'仍然必須正確。這不是。 – EJP

回答

1

我想,這也可能和HTTPS協議

當然它做。你違反了它。你應該發送一個適當的HTTP響應頭。

注意:您不會收到'連接被拒絕'。你可能會得到許多東西,但你沒有得到。這種聯繫已經完全建立起來了,否則在握手之後你就沒有達到這樣的程度。

+0

我在我的標題中發生了錯誤,並沒有考慮到在嘗試查找仍然存在問題的最小代碼時。 – user3381590

1

這可能會失敗,因爲輸出結尾沒有換行符。此外,在關閉連接之前尚不清楚您是否建立了有效狀態。請記住,套接字是雙向的,因此如果客戶端正在嘗試向您發送某些內容,則在您關閉連接時可能會忙於此事。

此外,爲什麼你在while(true)循環中創建套接字?我會嘗試一次,而不是無限多次。

請注意,我認爲HTTP響應應該有一個行結尾是\r\n\r\n。除此之外,我認爲沒有技術要求。這取決於寬容瀏覽器。例如,「h」可能會與開始「HTTP/1.0 200 OK」的正常響應混淆。只要你把雙重的Windows風格的行結束,你應該得到一個輸出。

+0

Newline沒有幫助。 while true當我複製代碼時是一個錯字。這在實際的代碼中並不存在。 – user3381590

+1

呃,我們能否看到「實際代碼」? –

+0

@ user3381590請參閱對我的回答的編輯 –

相關問題