Java網路程式設計(二)實現簡單通訊含程式碼(狂神說)
阿新 • • 發佈:2021-12-17
1.5、通訊協議
協議:約定,就好比我們現在說的是普通話。+
網路通訊協議:速率,傳輸位元速率,程式碼結構,傳輸控制......
問題:非常複雜
大事化小:分層
TCP/IP協議簇:實際上是一組協議
重要:
- TCP:傳輸控制協議
- UDP:使用者資料報協議
出名的協議:
- TCP:
- IP:網路互連協議
TCP UDP對比
TCP:打電話
-
連線,穩定
-
三次握手四次揮手
最少需要三次,保證穩定連線! A:你瞅啥? B:瞅你咋地? A:幹一場? 四次揮手。 A:我要走了 B:我真的你要走了嗎? A:你真的真的要走了嗎 B:我真的要走了 A:我給你發東西了你接收一下 B:好的我接收了,你先別斷等我接收完了給你說 B:我接收完了你關閉把 A:好的我已經關閉合作愉快~
-
客戶端和服務端
-
傳輸完成,釋放連線,效率低
UDP:發簡訊
- 不連線,不穩定
- 客戶端、服務端:沒有明確的界限
- 不管有沒有準備好,都可以發給你......
- DDOS:洪水攻擊!(飽和攻擊)
1.6、TCP
客戶端
1.連線伺服器Socket
2.傳送訊息
package comip.study.lesson02; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; //客戶端 public class TcpServerDemo01 { public static void main(String[] args) { Socket socket =null; OutputStream os =null; //1.要知道伺服器的地址 try { InetAddress serverIP = InetAddress.getByName("127.0.01"); //2.埠號 int port =9999; //3.建立一個socket連線 socket = new Socket(serverIP,port); //3.傳送訊息IO os = socket.getOutputStream(); os.write("你好,歡迎來到鎖子哥的部落格園".getBytes()); } catch (Exception e) { }finally { if (os!=null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
服務端
1.建立服務的埠ServerSocket
2.等待使用者的連線accept
3.接收使用者的訊息
package comip.study.lesson02; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; //服務端 public class TcpClientDemo01 { public static void main(String[] args) { ServerSocket serverSocket =null; Socket socket =null; InputStream is =null; ByteArrayOutputStream baos =null; try { //1.我得有一個地址 serverSocket = new ServerSocket(9999); //2.等待客戶端連線過來 socket =serverSocket.accept(); //3.讀取客戶端的訊息 is = socket.getInputStream(); /* 有中文,超過1024後面會亂碼 byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer))!=-1){ String msg = new String(buffer, 0, len); System.out.println(msg); } */ //管道流 baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer))!=-1){ baos.write(buffer,0,len); } System.out.println(baos.toString()); } catch (IOException e) { e.printStackTrace(); }finally { //關閉資源 if (baos!=null){ try { baos.close(); } catch (IOException e) { e.printStackTrace(); } } if (is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } }if (serverSocket!=null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } //if(流 != null)不是指資料還在傳輸,意思是通過這個判斷流有傳輸資料,finally時資料已經傳輸完畢, 此時資料流已經不再傳輸了,但功能還在,通過這個判斷能夠有效準確地關閉傳輸流。 } } }
服務端先啟動,然後再開啟客戶端就可以看到
迴圈監聽
再啟動一次客戶端,你就會再收到一條訊息。
程式碼只需對客戶端做如下改動:
while (true){
//2.等待客戶端連線過來
socket =serverSocket.accept();
//3.讀取客戶端的訊息
is = socket.getInputStream();
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
}