----------- android培訓、java培訓、java學習型技術博客、期待與您交流! ------------
網絡編程----說白了就是Socket編程.....
✔網絡模型
OSI參考模型
TCP/IP參考模型
✔網絡通訊要素
IP地址
端口號
傳輸協議
應用層--協議:http,ftp等
傳輸層--協議:tcp,udp
網際層—協議:ip
網絡通訊要素
✔IP地址
網絡中設備的標識
不易記憶,可用主機名
本地迴環地址:127.0.0.1 主機名:localHost
✔端口號
用於標識進程的邏輯地址,不同進程標識
有效端口:0~65535,其中0~1024系統使用或保留端口
✔傳輸協議
通訊的規則
常見協議:TCP,UDP
✔UDP
將數據及源和目的封裝成數據包中,不需要建立連接
每個數據報的大小限制在64K內
因無連接,是不可靠協議
不需要建立連接,速度快
✔TCP
建立連接,形成傳輸數據的通道
在連接中進行大數據量的傳輸
通過三次握手完成連接,是可靠協議
必須建立連接,效率會稍低
UDP面向無連接,數據需要封包(限制在沒包64K以內).現實比擬,郵局發包裹.
TCP面向連接,現實比擬打電話過程.UDP現實比擬對講機傳話過程.
java.net 包中,用於描述IP地址的
類 InetAddress
Socket
✔Socket就是爲網絡服務提供的一種機制
✔通信的兩端都有Socket
✔網絡通信其實就是Socket間的通信
✔數據在兩個Socket間通過IO傳輸
Socket[插座;套接字]玩Socket主要記住流程.----網絡編程就是Socket編程
Socket就是港口.接送貨物的...
UDP傳輸
✔DatagramSocket與DatagramPacket
✔建立發送端,接受端
✔建立數據包
✔調用Socket的發送接受方法
✔關閉Socket
發送端與接收端是兩個獨立的運行程序
需求一:通過UDP協議傳輸一段文字數據到指定目的地.
思路:
1,建立UDPSocket服務
2,提供數據,並將數據封裝到數據包中
3,通過socket服務的發送功能,將數據包發出去
4,關閉資源
需求二:接受一個UDP協議傳輸過來的數據
思路:
1,定義UDPSocket服務,通常會監聽一個端口,其實就是給這個接受網絡應喲個程序定義數字標識.
方便於明確那些數據過來該應用程序可以處理.
2,定義一個數據包,因爲要存儲接受到的字節數據
因爲數據包對象中有更多功能可以提取字節數據中的不同數據信息
3,通過socket服務的receive()方法將收到的數據存入已經定義好的數據包中
4,通過數據包對象的特有功能,將這些不同的數據取出,打印在控制檯上
5,關閉資源ok
接收端要指定一個監聽的端口,時刻關注屬於自己的包裹.
實例:實現,循環輸入,循環接收………
import java.io.*;
import java.net.*;
class UdpSend{
public static void main(String[] args)throws Exception{
//建立socket服務,參數默認,系統自動分配端口.
DatagramSocket ds=new DatagramSocket();
//實現,鍵盤錄入,實時發送消息
BufferedReader bur=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bur.readLine())!=null){
if(line.equals("exit"))
break;
byte[] btbuf=line.getBytes();
//建立包裹,指定數據緩衝byte數組和其長度,並指定ip,和端口
DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("127.0.0.1"),10000);
//發送.
ds.send(dp);
}
//exit後,關閉
ds.close();
}
}
class UdpRece{
public static void main(String[] args)throws Exception{
//建立服務,指定以下端口,讓他在這個端口處等候,包裹的到來
DatagramSocket ds=new DatagramSocket(10000);
//建立循環接受---內部有阻塞方法,不能構成死循環
while(true){//注意 new DatagramSocket不要丟盡循環,會報[端口綁定異常]
//建立byte緩存,以便下面等待包裹
byte[] buf=new byte[1024];
//建立包裹存儲收到的包裹
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//結束命令啓動
ds.receive(dp);
//獲取信息
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data+"---"+dp.getPort());
}
}
}
注意:
192.168.1.0網絡段
192.168.1.255廣播地址,所有的ip段內的ip都能接收到.
用UDP自制簡單局域網聊天小程序
import java.io.*;
import java.net.*;
class UdpSend implements Runnable{
private DatagramSocket ds;
UdpSend(DatagramSocket ds){
this.ds=ds;
}
public void run(){
//建立socket服務,參數默認,系統自動分配端口.
try{
//實現,鍵盤錄入,實時發送消息
System.out.println("----------------------------------");
BufferedReader bur=
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bur.readLine())!=null){
if(line.equals("exit"))
break;
byte[] btbuf=line.getBytes();
//建立包裹,指定數據緩衝byte數組和其長度,並指定ip,和端口
DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("192.168.1.255"),10000);
//發送.
ds.send(dp);
}
//exit後,關閉
ds.close();
}
catch(Exception i){
throw new RuntimeException("檢修");
}
}
}
class UdpRece implements Runnable{
private DatagramSocket ds;
UdpRece(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
//建立服務,指定以下端口,讓他在這個端口處等候,包裹的到來
//建立循環接受
while(true){
//建立byte緩存,以便下面等待包裹
byte[] buf=new byte[1024];
//建立包裹存儲收到的包裹
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//結束命令啓動
ds.receive(dp);
//獲取信息
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println("*******************************");
System.out.println(ip+":"+data+"---"+dp.getPort());
System.out.println("*******************************");
}
}catch(Exception e){
throw new RuntimeException(" ");
}
}
}
class chat{
public static void main(String[] args)throws Exception{
DatagramSocket ds=new DatagramSocket();
DatagramSocket d=new DatagramSocket(10000);
System.out.println("聊天模式啓動");
new Thread(new UdpSend(ds)).start();
new Thread(new UdpRece(d)).start();
}
}