文章目錄
-
- TCP和UDP
-
- TCP協定
- UDP協定
- InetAddress 類
- Socket通信
- 案例
java.net 包下使用的網絡
IP位址使用4個位元組 32位
一個位元組的範圍 0~255
ipv6 16個位元組 128位
TCP和UDP
TCP協定
1、使用tcp協定前 必須先建立TCP連接配接 形成傳輸資料通道
2、傳輸前 采用三次握手的方式 可靠的
3、TCP協定進行通信的過長城應用程序:用戶端 服務端
4、連接配接中 可以進行大資料量的傳輸
5、傳輸完畢 需釋放已建立的連接配接 效率低
UDP協定
1、将資料、源、目的封裝資料包 不需要建立連接配接
2、每個資料報的大小限制在64k内
3、因無需連接配接 故不可靠
4、發送的資料結束時 無釋放資源 因為不是面向連接配接的 速度快
InetAddress 類
相關方法
1、擷取本機InetAddress 對象 getLocalHost
2、根據指定主機名 / 域名擷取ip位址對象getByName
3、擷取InetAddress 對象的主機名 getHostName
4、擷取InetAddress 對象的位址getHostAddress
也是序列化的對象
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGLwEzXlpXazxyX5RTNQFnY1wUa2Uja1xUNyUGc1cXYwVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0IDO4IWYjRTOwUzYiFWYhFzN2QzMzMTNzMmNmhDOmNzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
public static void main(String[] args) throws UnknownHostException {
//1、擷取本機的InetAddress對現象
InetAddress localhost = InetAddress.getLocalHost();
System.out.println(localhost);
//2、 根據指定的主機名擷取InetAddress 對象
InetAddress host1 = InetAddress.getByName("");
System.out.println(host1);
//3、根據傳回InetAddress對象 比如百度對應的wwww.baidu.com對應的
InetAddress host2 = InetAddress.getByName("www.baidu.com");
System.out.println("host2="+host2;
//4、通過InetAddress 對象 擷取對應的位址
String hosrAddress = host2.getHostAddress();
//5、通過InetAddress 對象 擷取對應的主機名 或者域名
String hostName = host2.getHostName();
}
Socket通信
1、套節字開發 廣泛應用與應用程式
2、通信的兩端都需要有Socket 是兩台機器之間通信的端點
3、網絡通信 其實就是Socket間的通信
4、socket 允許程式把網絡當成一個流 資料在兩個socket之間通過IO傳輸
4、一般主動發起通信的應用沉痼屬于用戶端 等待通信請求的為服務端
案例
public static void main(String[] args) throws Exception {
//1、伺服器在本機監聽8888端口
ServerSocket serverSocket = new ServerSocket(8888);
//2、等待連接配接
Socket socket = serverSocket.accept();
//3、讀取用戶端發送的資料
///通過socket得到輸入的流
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamToByteArray(bis);
String destfilepath = "";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfilepath));
bos.write(bytes);
//關閉流
bos.close();;
bis.close();
socket.close();
serverSocket.close();
}
public class StreamUtils {
public static byte[] streamToByteArray(InputStream is) throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len;
while ((len=is.read(b))!=-1){
bos.write(b,0,len);
}
byte[] array = bos.toByteArray();
bos.close();
return array;
}
}
public class demo4 {
public static void main(String[] args) throws Exception {
//建立用戶端連接配接伺服器 得到socket對象
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
//建立讀取磁盤檔案的輸入流
String filepath = "";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(""));
//bytes就是filePath對應的位元組數組
byte[] bytes = StreamUtils.streamToByteArray(bis);
//通過socket擷取到輸出流 将bytes資料發送給服務端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(bytes); //将檔案對應的位元組數組的内容寫入到資料通道中
bis.close();
socket.shutdownOutput(); //設定寫入資料的結束标志
//關閉相對應的流
bos.close();
socket.close();
}
}