TCP(Transmission Control Protocol傳輸控制協(xié)議)是一種面向連接的裸弦、可靠的劲适、基于字節(jié)流的傳輸層通信協(xié)議楷掉。
今天利用java的封裝了TCP協(xié)議的類(lèi) ---- java.net.Socket;? java.net.ServerSocket霞势;使用它們可以與遠(yuǎn)端計(jì)算機(jī)通訊烹植。
實(shí)現(xiàn)聊天室的案例的要點(diǎn):
1)客戶(hù)端實(shí)例化Socket時(shí)需要傳入兩個(gè)參數(shù):服務(wù)端計(jì)算機(jī)的地址信息(IP地址);服務(wù)端計(jì)算機(jī)上運(yùn)行的服務(wù)端應(yīng)用程序申請(qǐng)的服務(wù)端口愕贡;
通過(guò)IP可以找到服務(wù)端的計(jì)算機(jī)草雕,通過(guò)端口可以連接到運(yùn)行在服務(wù)端計(jì)算機(jī)上的服務(wù)端應(yīng)用程序。
實(shí)例化Socket的過(guò)程就是連接服務(wù)端的過(guò)程固以,若服務(wù)端無(wú)響應(yīng)墩虹,實(shí)例化過(guò)程會(huì)拋出異常嘱巾。
端口號(hào)是一個(gè)整數(shù),2字節(jié)內(nèi)的整數(shù)0-65535诫钓,但3000以?xún)?nèi)的端口號(hào)不要使用旬昭,因?yàn)榫o密的綁定著系統(tǒng)程序,和世界上流行的應(yīng)用程序菌湃。10000以上也很少被使用问拘。
2)運(yùn)行在服務(wù)端的ServerSocket主要負(fù)責(zé)兩個(gè)工作:
向系統(tǒng)申請(qǐng)服務(wù)端口,客戶(hù)端就是通過(guò)這個(gè)端口與服務(wù)端應(yīng)用程序建立連接的惧所。
監(jiān)聽(tīng)服務(wù)端口骤坐,一旦客戶(hù)端通過(guò)該端口嘗試連接時(shí),ServerSocket就會(huì)實(shí)例化一個(gè)Socket與該客戶(hù)端通訊下愈。
3)客戶(hù)端用戶(hù)輸入等待時(shí)不能耽誤服務(wù)端返回信息纽绍,因此要多線程實(shí)現(xiàn)不輸入也能同時(shí)接收信息。
服務(wù)端要能夠接收多個(gè)客服端势似,因此要多線程與讀取信息分開(kāi)顶岸。
由于服務(wù)端要返回對(duì)每個(gè)客戶(hù)端返回不同線程輸出流的信息,需將不同線程中的輸出流裝入集合叫编,并遍歷信息返回客戶(hù)端,并在客戶(hù)端離線時(shí)清除該輸出流
客戶(hù)端具體代碼如下:
服務(wù)端具體代碼如下:
內(nèi)部類(lèi)實(shí)現(xiàn)Runnable為線程的任務(wù)
最后效果為(自己客戶(hù)端連自己服務(wù)端):