套接字(Socket)

套接字(socket)是通信的基石,套接字鏈接需要五個元素:連接使用的協(xié)議,本地主機的IP地址,本地進程的協(xié)議端口,遠程主機的 IP地址,遠程主機的協(xié)議端口;

套接字(Socket)連接需要的三個步驟:1.服務(wù)器監(jiān)聽,2.客戶端請求,3.連接確認;

套接字(Socket)連接的作用:應(yīng)用層通過傳輸層進行通信時,TCP會遇到同時為多個應(yīng)用程序提供并發(fā)服務(wù)的問題,多個TCP連接或多個應(yīng)用程序可能會同時使用同一個協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)分不同運用程序和連接,操作系統(tǒng)為應(yīng)用程序和TCP/IP協(xié)議提供了套接字(Socket)接口應(yīng)用層和傳輸層可以通過Socket接口,區(qū)分來自不同應(yīng)用程序和網(wǎng)絡(luò)通信的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。

示例:

//server,本例服務(wù)器與客戶端都在本機,使用8888端口,本地ip:127.0.0.1

Map<Socket,ObjectOutputStream> soosMap ;

Map<Socket,ObjectInputStream> sois;

ServerSocket ss = new ServerSocket(8888);

while(true){

Socket s = ss.accept();//socket通信是阻塞的,當(dāng)沒有接收到ClientSocket連接請求時,程序一直阻塞,不向下執(zhí)行,直到收到連接請求

ObjectOutputStream oos = new ObjectOutputStream();

soosMap.put(s,oos);//為每一個客戶端產(chǎn)生一個輸出流,進行通信,同樣的,客戶端也有一個輸入流用于通信;在客戶端也創(chuàng)建一個輸入流來接受服務(wù)器發(fā)出的消息

new AcceptMessageThread(s).start();//消息監(jiān)聽線程一直監(jiān)聽客戶端,等待消息通信;

}

Thread AcceptMessageThread extends Thread{

private Socket s;

public AcceptMessageThread(Socket s){

this.s = s;

}

public void run(){

ObjectInputStream ois = new ObjectInputStream(s.getInputStream);//為每一個socket連接對象創(chuàng)建一個對象輸入流來接收客戶端的通信消息,在客戶端也同樣創(chuàng)建一個輸出流來發(fā)送消息

while(true){//保持監(jiān)聽

Message msg = ois.readObject();

}

}

}

//Client

private Socket s;

private ObjectOutputStream oos;

private ObjectInputStream ois;

private void initClient() {

while(true){

try {

s =new Socket("127.0.0.1",8888);

oos = new ObjectOutputStream(s.getOutputStream());

ois = new ObjectInputStream(s.getInputStream());

break;

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容