日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java知多少(105)套接字(Socket)

發(fā)布時(shí)間:2023/11/29 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java知多少(105)套接字(Socket) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)絡(luò)應(yīng)用模式主要有:

  • 主機(jī)/終端模式:集中計(jì)算,集中管理;
  • 客戶(hù)機(jī)/服務(wù)器(Client/Server,簡(jiǎn)稱(chēng)C/S)模式:分布計(jì)算,分布管理;
  • 瀏覽器/服務(wù)器模式:利用Internet跨平臺(tái)。


www(萬(wàn)維網(wǎng))就是建立在客戶(hù)機(jī)/服務(wù)器模式上,以HTML語(yǔ)言和HTTP協(xié)議為基礎(chǔ),能夠提供各種Internet服務(wù)的信息瀏覽系統(tǒng)。網(wǎng)絡(luò)信息放在主機(jī)的不同位置,www服務(wù)器利用超文本鏈路鏈接各項(xiàng)信息。www客戶(hù)機(jī)(瀏覽器Brower)負(fù)責(zé)與服務(wù)器建立聯(lián)系,向服務(wù)器發(fā)送請(qǐng)求,處理HTML超媒體,提供圖形用戶(hù)界面(GUI),顯示信息等。

在客戶(hù)機(jī)/服務(wù)器工作模式中,在Server端,要準(zhǔn)備接受多個(gè)Client端計(jì)算機(jī)的通信。為此,除用IP地址標(biāo)識(shí)Internet上的計(jì)算機(jī)之外,另還引入端口號(hào),用端口號(hào)標(biāo)識(shí)正在Server端后臺(tái)服務(wù)的線程。端口號(hào)與IP地址的組合稱(chēng)為網(wǎng)絡(luò)套接字(socket)。

Java語(yǔ)言在實(shí)現(xiàn)C/S模式中,套接字分為兩類(lèi):

  • 在Server端,ServerSocket類(lèi)支持底層的網(wǎng)絡(luò)通信;
  • 在Client端,Socket類(lèi)支持網(wǎng)絡(luò)的底層通信。

Server機(jī)通過(guò)端口(總線I/O地址)提供面向Client機(jī)的服務(wù);Server機(jī)在它的幾個(gè)不同端口分別同時(shí)提供幾種不同的服務(wù)。Client接入Server的某一端口,通過(guò)這個(gè)端口提請(qǐng)Server機(jī)為其服務(wù)。規(guī)定:端口號(hào)0~1023供系統(tǒng)專(zhuān)用。例如,HTTP協(xié)議在端口80,telnet協(xié)議在端口23。端口1024~65535供應(yīng)用程序使用。

當(dāng)Client程序和Server程序需要通信時(shí),可以用Socket類(lèi)建立套接字連接。套接字連接可想象為一個(gè)電話呼叫:最初是Client程序建立呼叫,Server程序監(jiān)聽(tīng);呼叫完成后,任何一方都可以隨時(shí)講話。

雙方實(shí)現(xiàn)通信有流式socket和數(shù)據(jù)報(bào)式socket兩種可選方式:

  • 流式socket是有連接的通信,即TCP(Transmission Control Protocol):每次通信前建立連接,通信結(jié)束后斷開(kāi)連接。特點(diǎn)是可以保證傳輸?shù)恼_性、可靠性。
  • 數(shù)據(jù)報(bào)式socket是無(wú)連接的通信,即UDP(User Datagram Protocol):將欲傳輸?shù)臄?shù)據(jù)分成 小包,直接上網(wǎng)發(fā)送。無(wú)需建立連接和拆除連接,速度快,但無(wú)可靠保證。


流式socket在Client程序和Server程序間建立通信的通道。每個(gè)socket可以進(jìn)行讀和寫(xiě)兩種操作。對(duì)于任一端,與對(duì)方的通信會(huì)話過(guò)程是:
建立socket連接,獲得輸入/輸出流,讀數(shù)據(jù)/寫(xiě)數(shù)據(jù),通信完成后關(guān)閉socket(拆除連接)。流式Socket的通信過(guò)程見(jiàn)【例 13-1】。

利用socket的構(gòu)造方法,可以在客戶(hù)端建立到服務(wù)器的套接字對(duì)象:
? ? Socket(String host,int port):host是服務(wù)器的IP地址,port是端口號(hào),這些是預(yù)先約定的。
例如,代碼:

1 try{ 2 Socket mySocket = new Socket(“http://www.weixueyuan.net” ,1860); 3 }catch(IOException e){}

然后,用getInputStream()方法獲得輸入流,用這個(gè)輸入流讀取服務(wù)器放入“線路”的信息;用getOutputStream()方法獲得輸出流,用這個(gè)輸出流將信息寫(xiě)入“線路”。


利用ServerSocket的構(gòu)造方法可以在服務(wù)器建立接受客戶(hù)套接字的服務(wù)器套接字對(duì)象:

ServerSocket(int port):指定端口號(hào),創(chuàng)建一個(gè)ServerSocket對(duì)象。端口號(hào)port要與客戶(hù)呼叫的端口號(hào)相同。為此,用以下形式代碼:try{ServerSocket serverSocket = new ServerSocket(1860);}catch(IOException e){}

服務(wù)器端程序在指定的端口監(jiān)聽(tīng),當(dāng)收到Client程序發(fā)出的服務(wù)請(qǐng)求時(shí),創(chuàng)建一個(gè)套接字對(duì)象與該端口對(duì)應(yīng)的Client程序通信。例如,執(zhí)行上述建立服務(wù)器套接字對(duì)象的代碼,確立了對(duì)象serverSocket后,就可能它使用accept()方法,得到Socket對(duì)象,接收Client程序來(lái)自套接字mySocket的信息。如以下代碼所示:

try{Socket sc = serverSocket.accept();//ac是一個(gè)Socket對(duì)象}catch(IOException e){} 要撤銷(xiāo)服務(wù),可以關(guān)閉Socket對(duì)象sc:sc.close();

【例 13-3】C/S模式中的Client端應(yīng)用程序。這是一個(gè)Client端的流式Socket通信的簡(jiǎn)單實(shí)例,代碼說(shuō)明Client端程序的編寫(xiě)方法。例中,Client程序向服務(wù)器主機(jī)的端口4441提出請(qǐng)求,連接建立后完成對(duì)服務(wù)器的讀寫(xiě)

1 import java.io.*; 2 import java.net.*; 3 public class Client{ 4 public static void main(String args[]){ 5 String s = null;Socket mySocket; 6 DataInputStream in = null;DataOutputStream out = null; 7 try{ 8 mySocket = new Socket(“l(fā)ocalhost”,4441); 9 in = new DataInputStream(mySocket.getInputStream()); 10 out = new DataOutputStream(mySocket.getOutputStream()); 11 out.writeUTF(“good server!”); 12 while(true){ 13 s = in.readUTF(); 14 if(s==null) break; 15 else System.out.println(s); 16 } 17 mySocket.close(); 18 }catch(IOException e){ 19 System.out.println(“can’t connect”); 20 } 21 } 22 }

【例 13-4】與例10.3 Client端應(yīng)用程序?qū)?yīng)的Server端應(yīng)用程序。程序在4441端口監(jiān)聽(tīng),當(dāng)檢測(cè)到有客戶(hù)機(jī)請(qǐng)求時(shí),產(chǎn)生一個(gè)內(nèi)為“客戶(hù),你好,我是服務(wù)器”的字符串輸出到客戶(hù)端

1 import java.io.*;import java.net.*; 2 public class Server{ 3 public static void main(String args[]){ 4 ServerSocket server = null; 5 Socket you = null;String s = null; 6 DataOutputStream out = null; 7 DataInputStream in = null; 8 try{ 9 server = new ServerSocket(4441); 10 }catch(IOException e1){ 11 system.out.println(“ERROR:” +e1); 12 } 13 try{ 14 you = server.accept(); 15 in = new DataInputStream(you.getInputStream()); 16 out = new DataOutputStream(you. getOutputStream()); 17 while(true){ 18 s = in.readUTF(); 19 if(s!=null) break; 20 } 21 out.writeUTF(“客戶(hù),你好,我是服務(wù)器”); 22 out.close(); 23 } 24 catch(IOException e){System.out.println(“ERROR:”+e);} 25 } 26 }

為了充分發(fā)揮計(jì)算機(jī)的平行工作能力,可以把套接字連接工作讓一個(gè)線程完成。當(dāng)客戶(hù)端要請(qǐng)求服務(wù)器給予服務(wù),或當(dāng)服務(wù)器端接收到一個(gè)客戶(hù)的服務(wù)請(qǐng)求,就啟動(dòng)一個(gè)專(zhuān)門(mén)完成信息通信的線程,在該線程中創(chuàng)建輸入輸出流,并完成客戶(hù)端與服務(wù)器端的信息交流。


【例 13-5】 將套接字連接工作置于線程的客戶(hù)端小應(yīng)用程序。界面在有一個(gè)發(fā)送信息按紐、一個(gè)文本框和一個(gè)文本區(qū)。客戶(hù)端應(yīng)用程序首先與服務(wù)器建立套接字連接。使用數(shù)據(jù)輸入流in反復(fù)讀取服務(wù)器放入線路里的信息,將收到的信息在文本區(qū)中顯示。婐志取的信息是“結(jié)束”,則關(guān)閉套接字連接,并結(jié)束程序。用戶(hù)也可在文本框輸入信息,并按發(fā)送信息按鈕,則客戶(hù)端程序利用數(shù)據(jù)輸出流out,將文本框中的內(nèi)容發(fā)送給服務(wù)器。

1 import java.net.*; 2 import java.io.*; 3 import java.awt.*; 4 import javax.swing.*; 5 import java.awt.event.*; 6 import java.applet.*; 7 public class Aclient extends Applet implements Runnable,ActionListener{ 8 JButton button; JTextField textF; JTextArea textA; 9 Socket socket; Thread thread; 10 DataInputStream in; DataOutputStream out; 11 public void init(){ 12 setBackground(new Color(120,153,137)); 13 setLayout(new BorderLayout()); 14 Button = new JButton(“發(fā)送信息”); 15 textF = new JTextField(20); 16 textA = new JTextArea(20,30); 17 setSize(450,350); 18 JPanel p = new JPanel(); 19 p.add(textF); p.add(button); 20 add(textA,”Center”); add(p,”South”); 21 button.addActionListener(this); 22 } 23 public void start(){ 24 try{ 25 socket = new Socket(this.getCodeBase().getHost(),4441); 26 in = new DataInputStream(socket.getInputStream()); 27 out = new DataOutputStream(socket.getOutputStream()); 28 }catch(IOException e){} 29 if(thread==null){ 30 thread = new Thread(this); 31 thread.setPriority(Thread.MIN_PRIORITY); 32 thread.start(); 33 } 34 } 35 public void run(){ 36 String s = null; 37 while(true){ 38 try{ 39 s = in.readUTF(); 40 }catch(IOException e){} 41 if(s.equals(“結(jié)束”)){ 42 try{ 43 socket.close();break; 44 }catch(IOException e){} 45 }else texA.append(s + “\n”); 46 } 47 } 48 public void actionPerformed(ActionEvent e){ 49 if(e.getSource()==button){ 50 String s = textF.getText(); 51 if(s! = null){ 52 try{ 53 out.writeUTF(s); 54 }catch(IOException e1){} 55 } 56 else{ 57 try{ 58 out.writeUTF(“請(qǐng)說(shuō)話”); 59 } 60 catch(IOException e1){} 61 } 62 } 63 } 64 }

【例 13-6】對(duì)應(yīng)例10.5客戶(hù)端小應(yīng)用程序的服務(wù)器端小應(yīng)用程序。程序以端4441建立與客戶(hù)端的套接字連接,服務(wù)器端收到客戶(hù)端的申請(qǐng)后,以客戶(hù)的套接字建立一個(gè)線程,并啟動(dòng)。如果沒(méi)有客戶(hù)申請(qǐng),則繼續(xù)監(jiān)聽(tīng)客戶(hù)的申請(qǐng)。線程按客戶(hù)的套接字建立輸入數(shù)據(jù)流in和輸數(shù)據(jù)流out。線程利用in讀取客戶(hù)放入線路里的信息。如果接受的信息是“結(jié)束”,則服務(wù)器回復(fù)“結(jié)束”后關(guān)閉套接字連接;否則回復(fù):“我是服務(wù)器你對(duì)我說(shuō)“,以及服務(wù)器接收到的信息

1 import java.net.*; 2 import java.io.*; 3 import java.awt.*; 4 import javax.swing.*; 5 import java.awt.event.*; 6 import java.applet.*; 7 public class Aclient extends Applet implements Runnable,ActionListener{ 8 JButton button; JTextField textF; JTextArea textA; 9 Socket socket; Thread thread; 10 DataInputStream in; DataOutputStream out; 11 public void init(){ 12 setBackground(new Color(120,153,137)); 13 setLayout(new BorderLayout()); 14 Button = new JButton(“發(fā)送信息”); 15 textF = new JTextField(20); 16 textA = new JTextArea(20,30); 17 setSize(450,350); 18 JPanel p = new JPanel(); 19 p.add(textF); p.add(button); 20 add(textA,”Center”); add(p,”South”); 21 button.addActionListener(this); 22 } 23 public void start(){ 24 try{ 25 socket = new Socket(this.getCodeBase().getHost(),4441); 26 in = new DataInputStream(socket.getInputStream()); 27 out = new DataOutputStream(socket.getOutputStream()); 28 }catch(IOException e){} 29 if(thread==null){ 30 thread = new Thread(this); 31 thread.setPriority(Thread.MIN_PRIORITY); 32 thread.start(); 33 } 34 } 35 public void run(){ 36 String s = null; 37 while(true){ 38 try{ 39 s = in.readUTF(); 40 }catch(IOException e){} 41 if(s.equals(“結(jié)束”)){ 42 try{ 43 socket.close();break; 44 }catch(IOException e){} 45 }else texA.append(s + “\n”); 46 } 47 } 48 public void actionPerformed(ActionEvent e){ 49 if(e.getSource()==button){ 50 String s = textF.getText(); 51 if(s! = null){ 52 try{ 53 out.writeUTF(s); 54 }catch(IOException e1){} 55 } 56 else{ 57 try{ 58 out.writeUTF(“請(qǐng)說(shuō)話”); 59 }catch(IOException e1){} 60 } 61 } 62 } 63 }

系列文章:

Java知多少(上) Java知多少(中) Java知多少(78)Java向量(Vector)及其應(yīng)用 Java知多少(79)哈希表及其應(yīng)用 Java知多少(80)圖形界面設(shè)計(jì)基礎(chǔ) Java知多少(81)框架窗口基礎(chǔ) Java知多少(82)標(biāo)簽、按鈕和按鈕事件簡(jiǎn)介 Java知多少(83)面板基礎(chǔ):JPanel和JScrollPane Java知多少(84)圖形界面之布局設(shè)計(jì) Java知多少(85)文本框和文本區(qū) Java知多少(86)文本框和文本區(qū)的輸入輸出 Java知多少(87)選擇框和單選按鈕 Java知多少(88)列表和組合框 Java知多少(89)列表和組合框 Java知多少(90)菜單 Java知多少(91)對(duì)話框 Java知多少(92)滾動(dòng)條 Java知多少(93)鼠標(biāo)事件 Java知多少(94)鍵盤(pán)事件 Java知多少(95)繪圖基礎(chǔ) Java知多少(96)繪圖之設(shè)置字型和顏色 Java知多少(97)繪圖模式概述 Java知多少(98)Graphics類(lèi)的繪圖方法 Java知多少(99)Graphics2D類(lèi)的繪圖方法 Java知多少(100)圖像處理基礎(chǔ) Java知多少(101)圖像緩沖技術(shù) Java知多少(102)多媒體基礎(chǔ) Java知多少(103)網(wǎng)絡(luò)編程之IP地址和InetAddress類(lèi) Java知多少(104)網(wǎng)絡(luò)編程之統(tǒng)一資源定位符URL

轉(zhuǎn)載于:https://www.cnblogs.com/Coda/p/4603758.html

總結(jié)

以上是生活随笔為你收集整理的Java知多少(105)套接字(Socket)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。