关于TCP/IP协议及网络通信相关问题
一、網(wǎng)絡(luò)模型:
OSI標(biāo)準(zhǔn)模型七層架構(gòu)以及其傳輸數(shù)據(jù)的模型如下:
?
傳輸信息的過程由上之下逐漸封裝,接收過程則是由下至上逐漸拆包,每一層只解析自己獨立的部分。
二、網(wǎng)絡(luò)的機要素
1、IP
1 public class NetTest { 2 public static void main(String[] args) throws UnknownHostException { 3 //獲取本地ip 4 InetAddress ip = InetAddress.getLocalHost(); 5 System.out.println(ip); 6 } 7 }?
2、域名
本地ip和域名映射文件? :? C:\Windows\System32\drivers\etc\hosts
?
當(dāng)用戶訪問的是服務(wù)器對應(yīng)的域名時候,首先會在本地該映射文件中找,如果沒有,則訪問第三方廠商提供的域名解析器進(jìn)行解析,最終將域名解析為ip地址進(jìn)行訪問。如下圖:
?
?
3、端口port
為了能夠?qū)崿F(xiàn)應(yīng)用程序之間的通訊,引入端口來區(qū)分。例如飛秋和qq之間的通訊。
4、傳輸層協(xié)議
傳輸層協(xié)議有一下幾個TCP 、UDP 、 TLS 、 DCCP 、 SCTP 、RSVP 、 PPTP,常用的有TCP和UDP。
?
?UDP:
面向無連接;將數(shù)據(jù)及源和和目的封裝成包,不需要建立連接;每一個數(shù)據(jù)包的大小限制在64kb以內(nèi);不需要連接,因此速度快;不安全(例如qq發(fā)送消息)。
TCP:
需要建立連接,形成傳輸通道;在連接中進(jìn)行大量的數(shù)據(jù)傳輸;通過三次握手完成連接,是安全可靠的;同比效率較低(例如用qq傳遞文件)。
5、網(wǎng)絡(luò)傳輸中的重要概念Soket
它是為通訊提供的一種機制;通信的兩端都有Soket;網(wǎng)絡(luò)通訊的實質(zhì)就是Soket之間的通訊;數(shù)據(jù)在兩個Soket之間及進(jìn)行IO傳輸。
?
?6、UDP
UDP傳輸如同碼頭、船、集裝箱和貨物一樣;發(fā)送的信息如同貨物,DatagramPacket就是集裝箱,多大的貨物就要用對應(yīng)的集裝箱;傳輸協(xié)議如同船只,soket就是碼頭。接收端必須要有明確的端口。然后用自己的DatagramPacket(集裝箱去封裝貨物)。代碼和步驟如下:
1 //基于UDP傳輸協(xié)議的多人聊天示例 2 public class UdpChat { 3 public static void main(String[] args) throws Exception { 4 DatagramSocket dsk = new DatagramSocket(); 5 DatagramSocket res = new DatagramSocket(10001);//接收方必須有固定端口 6 Send_Port send = new Send_Port(dsk); 7 Resive_Port resv = new Resive_Port(res); 8 new Thread(send).start();; 9 new Thread(resv).start();; 10 } 11 } 12 13 /* 14 * 發(fā)送端 15 */ 16 class Send_Port implements Runnable{ 17 /* 18 * 步驟: 19 * 1、創(chuàng)建UDP的Soket,使其具備發(fā)送能力; 20 * 2、創(chuàng)建及封裝需要傳輸?shù)臄?shù)據(jù); 21 * 3、使用Soket的send方法進(jìn)行發(fā)送; 22 * 4、關(guān)閉資源。 23 */ 24 25 //該對象用于發(fā)送 26 private DatagramSocket dsk; 27 public Send_Port(DatagramSocket sp) { 28 super(); 29 this.dsk = sp; 30 } 31 @Override 32 public void run() { 33 //鍵盤輸入文本 34 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); 35 String line = null; 36 System.out.println("請輸入:"); 37 try { 38 while((line = bf.readLine()) != null) { 39 if("886".equals(line)) { 40 System.out.println("發(fā)送方終止通話"); 41 break; 42 } 43 byte[] bt = line.getBytes(); 44 /*參數(shù):需要傳輸?shù)臄?shù)據(jù);數(shù)據(jù)長度,接收方的ip地址,接收方的端口號*/ 45 DatagramPacket packg = new DatagramPacket(bt, bt.length, InetAddress.getByName("172.16.10.255"), 10001); 46 dsk.send(packg); 47 } 48 dsk.close();//關(guān)閉資源 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } 52 } 53 } 54 55 /* 56 * 接收端 57 */ 58 class Resive_Port implements Runnable{ 59 /* 60 * 步驟: 61 * 1、創(chuàng)建UDP的Soket,用于接收 62 * 2、創(chuàng)建接受包,用于接收傳遞來的數(shù)據(jù),其中需要規(guī)定接收專用的集合及其大小 63 * 3、接收數(shù)據(jù) 64 * 4、關(guān)閉資源。 65 */ 66 private DatagramSocket drk; 67 //初始化參數(shù) 68 public Resive_Port(DatagramSocket drk) { 69 super(); 70 this.drk = drk; 71 } 72 @Override 73 public void run() { 74 byte[] res_byte = new byte[1024]; 75 DatagramPacket res = new DatagramPacket(res_byte , res_byte.length);//相當(dāng)于集裝箱。 76 while(true) { 77 try { 78 drk.receive(res); 79 String text = new String(res.getData(),0,res.getData().length); 80 if(text!=null) { 81 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 82 String date = df.format(new Date()); 83 if("886".equals(text)) { 84 System.out.println("用戶:"+res.getAddress()+"退出群聊!"); 85 } 86 System.out.println(res.getAddress()+":"+text); 87 System.out.print(date); 88 } 89 } catch (IOException e) { 90 e.printStackTrace(); 91 } 92 } 93 } 94 }?
7、TCP
面向連接,詳情人如下:
1 public class TCPTest { 2 /** 3 * 服務(wù)端編程思想:(開啟后將處于阻塞狀態(tài)) 4 * 1、創(chuàng)建服務(wù)端Socket,監(jiān)聽一個明確的端口; 5 * 2、獲取客戶端對象(不用自己創(chuàng)建流) 6 * 3、根據(jù)客戶端對象獲取到對應(yīng)的輸入流,讀取客戶端發(fā)來數(shù)據(jù) 7 * 4、邏輯處理 8 * 5、 9 * @throws Exception 10 */ 11 public static void main(String[] args) throws Exception { 12 13 //服務(wù)端socket,監(jiān)聽一個端口 14 ServerSocket ss = new ServerSocket(10003); 15 Service ser = new Service(ss); 16 ser.server(); 17 } 18 } 19 20 class test{ 21 /** 22 * 客戶端編程思路: 23 * 1、創(chuàng)建客戶端Soket,明確服務(wù)端的地址和端口。 24 * 2、三次握手,建立通道,如果通道建立成功,客戶端和服務(wù)器就會形成Soke IO流。 25 * 客戶端的任務(wù)就是獲取到Socket中的輸出流將,將信息傳輸服務(wù)器中。 26 * 3、通過輸出流發(fā)送數(shù)據(jù) 27 * 4、關(guān)閉資源 28 * 29 * 注意事項:面向連接編程首先應(yīng)該先啟動服務(wù)器,這樣客戶端才能夠像服務(wù)器發(fā)送請求 30 */ 31 public static void main(String[] args) throws Exception { 32 //客戶端socket,明確服務(wù)端ip和port 33 Socket s = new Socket(InetAddress.getByName("172.16.10.23"),10003); 34 Client cl = new Client(s); 35 cl.client(); 36 } 37 } 38 39 class Client{ 40 /*客戶端socket*/ 41 private Socket client_socket; 42 /* 初始化參數(shù) */ 43 public Client(Socket client_socket) { 44 super(); 45 this.client_socket = client_socket; 46 } 47 public void client() throws Exception { 48 OutputStream out = null; 49 try { 50 System.out.println("客戶端開始請求資源"); 51 out = client_socket.getOutputStream(); 52 out.write("請求資源".getBytes()); 53 } catch (IOException e) { 54 throw new Exception("連接超時:"+ e); 55 }finally{ 56 out.close(); 57 } 58 } 59 } 60 61 class Service{ 62 private ServerSocket service ; 63 public Service(ServerSocket service) { 64 super(); 65 this.service = service; 66 } 67 /*阻塞狀態(tài)*/ 68 public void server() throws Exception { 69 System.out.println("服務(wù)器初始化完成..."); 70 //獲取客戶端 71 Socket client = service.accept(); 72 if(client!=null) { 73 //從客戶端中獲取輸入流 74 InputStream in = client.getInputStream(); 75 //讀取 76 byte[] bt = new byte[1024]; 77 int line = in.read(bt); 78 String text = new String(bt,0,line); 79 String ip = client.getInetAddress().getHostAddress(); 80 System.out.println(ip+":"+text); 81 client.close(); 82 } 83 } 84 }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/L-W-T/p/7728844.html
總結(jié)
以上是生活随笔為你收集整理的关于TCP/IP协议及网络通信相关问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [数位dp] bzoj 3209 花神的
- 下一篇: python数据运算