查詢個人檔案所在地(上海)
阿新 • • 發佈:2021-11-28
網路程式設計
網路程式設計
計算機網路
將不同地理位置的計算機,通過網線,使多臺計算機通過軟體可以共享資料
java提供的網路類庫,將實現細節隱藏起來
網路的通訊要素
IP/埠號:精確找到計算機某臺主機
網路通訊協議:快速傳輸資料
IP地址:InetAddress
唯一的標識 Internet 上的計算機
本地迴環地址(hostAddress):127.0.0.1
主機名(hostName):localhost
埠號
不同的程序有不同的埠號
被規定為一個 16 0~65535
InetAddress類
Internet上的主機有兩種方式表示地址:
域名(hostName):www.baidu.com
IP 地址(hostAddress):220.181.111.37
方法:
InetAddress.getByName("www.baidu.com");
getHostAddress();
getHostName();
public static void main(String[] args) throws UnknownHostException { InetAddress inetAddress = InetAddress.getByName("www.baidu.com"); System.out.println(inetAddress); System.out.println(inetAddress.getHostAddress());//主機地址 System.out.println(inetAddress.getHostName());//主機名 }
網路通訊協議
–傳輸控制協議TCP(Transmission Control Protocol)
–使用者資料報協議UDP(User Datagram Protocol)。
傳輸控制協議TCP
使用前,需建立TCP連線,形成資料傳輸通道
可靠的資料傳輸方式
傳輸前"三次握手",斷開時"四次揮手"
斷開時比較煩雜,速度慢
使用者資料報協議UDP
使用時,不需要提前建立連線
不可靠
每個資料報的大小限制在64K
結束時無需釋放資源,速度快
Socket套接字
建立伺服器端
//建立伺服器 ServerSocket serverSocket = new ServerSocket(8888); System.out.println("等待連線"); //伺服器監聽等待連結的客戶端請求連線 Socket socket = serverSocket.accept();//阻塞式 監聽 System.out.println("連線成功");
建立客戶端
//建立客戶端,建立時需要建立連線
Socket socket = new Socket("127.0.0.1", 8888);
如何接收和傳送訊息
伺服器端
public static void main(String[] args) throws IOException {
//建立伺服器
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("等待連線");
//伺服器監聽等待連結的客戶端請求連線
Socket socket = serverSocket.accept();//阻塞式 監聽
System.out.println("連線成功");
//接收客戶端的資訊
InputStream in = socket.getInputStream();
byte[] b = new byte[1024];
int length = in.read(b);//將客戶端的資訊寫入byte陣列中
//轉字串
String s = new String(b, 0, length, "utf-8");
System.out.println("來自客戶端的資訊:" + s);
//伺服器端向客戶端傳送訊息
OutputStream out = socket.getOutputStream();
out.write("我已收到".getBytes("utf-8"));
}
客戶端
public static void main(String[] args) throws IOException {
//建立客戶端,建立時需要建立連線
Socket socket = new Socket("127.0.0.1", 8888);
//獲得輸出流物件
OutputStream out = socket.getOutputStream();
System.out.println("向伺服器傳送的內容:");
Scanner input = new Scanner(System.in);
String s = input.next();
out.write(s.getBytes("utf-8"));
//客戶端收到伺服器端的訊息
InputStream in = socket.getInputStream();
byte [] b= new byte[1024];
int length = in.read(b);
String ms = new String(b,0,length,"utf-8");
System.out.println("接收到伺服器端的資訊:"+ms);
out.close();
socket.close();
}
另外一種接收和傳送的方法
DataInputStream&&DataOutputStream
/*接收***發過來的資訊*/
DataInputStream dataInputStream = new DataInputStream(sss.getInputStream());
String ms = dataInputStream.readUTF();
System.out.println(ms);
/*向***傳送資訊*/
DataOutputStream dataOutputStream = new DataOutputStream(sss.getOutputStream());
String s = input.next();
dataOutputStream.writeUTF(s);
UDP網路通訊
類 DatagramSocket 和 DatagramPacket 實現了基於UDP 協議網路程式。
UDP資料報通過資料報套接字 DatagramSocket 傳送和接收,系統不保證UDP資料報一定能夠安全送到目的地,也不能確定什麼時候可以抵達。
客戶端
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
//封裝資料包/報
Scanner input = new Scanner(System.in);
String str = input.next();
byte[] b = str.getBytes("utf-8");
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket = new DatagramPacket(b,0,b.length,inetAddress,9999);
//傳送資料send();
datagramSocket.send(datagramPacket);
}
伺服器端
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] b= new byte[1024];
DatagramPacket datagramPacket= new DatagramPacket(b,b.length);
datagramSocket.receive(datagramPacket);//接收資料
//datagramPacket.getLength()實際向陣列中裝入的長度
String s = new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println(s);
}