1. java開發聊天功能用什麼技術
Java開發聊天功能可以使用Socket和ServerSocket技術來實現。
在這種情況下,伺服器端需要創建一個ServerSocket對象來監聽客戶端的連接請求槐伍。當有新的連接請求到達時,伺服器會創建一個鉛敏或新的Socket對象來與客戶端進行通信,並將該Socket對象加入到線程池中。通過這種方式,伺服器可拿御以同時處理多個客戶端的連接請求和消息交互。
客戶端需要創建一個Socket對象,並指定伺服器端的IP地址和埠號來連接伺服器。連接成功後,客戶端可以向伺服器發送消息,也可以接收來自伺服器的消息。當客戶端退出聊天室時,需要關閉Socket連接,並通知伺服器該客戶端已經離開。
在實際開發中,還需要考慮到消息的編碼和解碼、異常處理、線程安全等問題。可以使用現成的開源框架如Netty、Spring Boot等來簡化聊天功能的開發。同時,還需要進行充分的測試和優化,以提高聊天功能的性能和用戶體驗。
2. java TCP做聊天程序是應該一個聊天窗口一個線程還是一個Socket一個線程
socket通訊是阻塞的,一個聊天就有一個socket,需要一直在哪裡阻塞讀取數據,所以就一個socket就要用一個線程了。如果用nio的話,通訊是非阻塞的,就不用一個聊天一個線程了。如果聊天人數大的話,建議用nio。現在netty框架就非常不錯。
3. 關於 java socket的消息推送問題
使用線程池會比較好。方便管理。你也要對鏈接的線程做一個限制,無限的鏈接創建線程會耗盡內存的。比如:
{
;
;
publicNetworkService(intport,intpoolSize)
throwsIOException{
serverSocket=newServerSocket(port);
pool=Executors.newFixedThreadPool(poolSize);
}
publicvoidrun(){//runtheservice
try{
for(;;){
pool.execute(newHandler(serverSocket.accept()));
}
}catch(IOExceptionex){
pool.shutdown();
}
}
}
{
privatefinalSocketsocket;
Handler(Socketsocket){this.socket=socket;}
publicvoidrun(){
//readandservicerequestonsocket
}
}
在沒有消息的時候,線程要處於wait狀態,當有消息的時候,用notify來激活。
4. java 如何多次使用緩存中的socket
java中用socket一次傳多個文件,參考思路如下: 1、把線程放到Vector 線程池裡面; 2 、每次從專Vector裡面拿到第一個空閑的,屬如果沒有,就新建一個線程,並保存到線程池, 線程狀態為使用中; 3 、線程完畢後,通知管理類,管理類把線程標識為空...
5. Java Socket重要參數講解
Java Socket的api可能很多人會用 但是Java Socket的參數可能很多人都不知道用來幹嘛的 甚至都不知道有這些參數
backlog
用於ServerSocket 配置ServerSocket的最大客戶端等待隊列 等待隊列的意思 先看下面代碼
public class Main { public static void main(String[] args) throws Exception { int port = int backlog = ServerSocket serverSocket = new ServerSocket(port backlog) Socket clientSock = serverSocket accept() System out println( revcive from + clientSock getPort()) while (true) { byte buf[] = new byte[ ] int len = clientSock getInputStream() read(buf) System out println(new String(buf len)) }這段測試代碼在第一次處理一個客戶端時 就不會處理第二個客戶端 所以除了第一個客戶端 其他客戶端就是等待隊殲罩列了 所以這個伺服器最多可以同時連接 個客戶端 其中 個等待隊列 大家可以telnet localhost 測試下
這個參數設置為 表示無限制 默認是 個最大等待隊列 如果設置無限制 那麼你要小心了 如果你伺服器無法處理那麼多連接 那麼當很多客戶端連到你的伺服器時 每一個TCP連接都會佔用伺服器的內存 最後會讓伺服器崩潰的
另外 就算你設置了backlog為 如果你的代碼中是一直Socket clientSock = serverSocket accept() 假設我們的族唯機器最多可以同時處理 個請求 總共有 個線程在運行 然後你把在 個線程的線程池處理clientSock 不能處理的clientSock就排隊 最後clientSock越來越多 也意味著TCP連接越來越多 也意味著我們的伺服器的內存使用越來越高(客戶端連接進程 肯定會發送數據過來 數據會保存到伺服器端的TCP接收緩存區) 最後伺服器就宕機了 所以如果你不能處理那麼多請求 請不要循環無限制地調用serverSocket accept() 否則backlog也無法生效 如果真的請求過多 只會讓你的伺服器宕機(相信很多人都是這么寫 要注意點)
TcpNoDelay
禁用納格演算法 將數據立即發送出去 納格演算法是以減少封包傳送量來增進TCP/IP網路的效能 當我們調用下面代碼 如
Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) 我們發送了hello 當hello沒有收到ack確認(TCP是可靠連接 發送的每一個數據都要收到對方的一個ack確認 否則就要重發)的時候 根據納格演算法 world不會立馬發送 會等待 要麼等到ack確認(最多等 ms對方會氏穗鬧發過來的) 要麼等到TCP緩沖區內容>=MSS 很明顯這里沒有機會 我們寫了world後再也沒有寫數據了 所以只能等到hello的ack我們才會發送world 除非我們禁用納格演算法 數據就會立即發送了
SoLinger
當我們調用socket close()返回時 socket已經write的數據未必已經發送到對方了 例如
Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) socket close()
這里調用了socket close()返回時 hello和world未必已經成功發送到對方了 如果我們設置了linger而不小於 如
bool on = true int linger = ……
socket setSoLinger(boolean on int linger)
……
socket close() 那麼close會等到發送的數據已經確認了才返回 但是如果對方宕機 超時 那麼會根據linger設定的時間返回
UrgentData和OOBInline
TCP的緊急指針 一般都不建議使用 而且不同的TCP/IP實現 也不同 一般說如果你有緊急數據寧願再建立一個新的TCP/IP連接發送數據 讓對方緊急處理
所以這兩個參數 你們可以忽略吧 想知道更多的 自己查下資料
SoTimeout
設置socket調用InputStream讀數據的超時時間 以毫秒為單位 如果超過這個時候 會拋出 SocketTimeoutException
KeepAlive
keepalive不是說TCP的常連接 當我們作為服務端 一個客戶端連接上來 如果設置了keeplive為true 當對方沒有發送任何數據過來 超過一個時間(看系統內核參數配置) 那麼我們這邊會發送一個ack探測包發到對方 探測雙方的TCP/IP連接是否有效(對方可能斷點 斷網) 在Linux好像這個時間是 秒 如果不設置 那麼客戶端宕機時 伺服器永遠也不知道客戶端宕機了 仍然保存這個失效的連接
SendBufferSize和ReceiveBufferSize
TCP發送緩存區和接收緩存區 默認是 一般情況下足夠了 而且就算你增加了發送緩存區 對方沒有增加它對應的接收緩沖 那麼在TCP三握手時 最後確定的最大發送窗口還是雙方最小的那個緩沖區 就算你無視 發了更多的數據 那麼多出來的數據也會被丟棄 除非雙方都協商好
lishixin/Article/program/Java/hx/201311/26575
6. java中短時間new Socket次數過多,並且socket.close() 並不是釋放連接,而是設置成了time_wait狀態怎麼處理
如果短時間內需要建立的連接過多的話,建議使用Socket線程池來做處理。new 太多的話,占的內存會很多,速度變慢。
7. java:ServerSocket中獲取所有連接上的Socket
可以的。
首先確保你已經建立了ServerSocket(對象名字是server),並接受到了連接:
ArrayList<Socket
>
sockets
=
new
ArrayList<Socket>();
//保存所有接受的socket
while(true){
//一直接受連接
Socket
s
=
server.accept();
sockets.add(s);
}
///得到仍處於連接當中的Socket
public
ArrayList<Socket
>
getConnectedSockets(){
ArrayList<Socket
>
alivedSockets
=
new
ArrayList<Socket>();
for(int
i=0;i<sockets.size();i++){
if(sockets.get(i).isConnected()){
alivedSockets
.add(sockets.get(i));
}
}
return
alivedSockets;
}
8. Java socket 編程 連接失敗!
如果是不停的發送來數據,你可源以維持一個socket長連接,當客戶端連接上發送完數據後不要關閉socket,繼續發送握手信息以維持連接。客戶端很多的話就用線程池ThreadPoolExecutor.
具體資料: