Java核心类库篇8——网络编程
生活随笔
收集整理的這篇文章主要介紹了
Java核心类库篇8——网络编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java核心類庫篇8——網絡編程
1、七層網絡模型
-
OSI(Open System Interconnect),即開放式系統互聯,是ISO(國際標準化組織)組織在1985 年研究的網絡互連模型。
-
當發送數據時,需要對發送的內容按照上述七層模型進行層層加包后發送出去。
-
當接收數據時,需要對接收的內容按照上述七層模型相反的次序層層拆包并顯示出來
2、協議
計算機在網絡中實現通信就必須有一些約定或者規則,這種約定和規則就叫做通信協議,通信協議 可以對速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等制定統一的標準。
2.1、TCP(傳輸控制協議Transmission Control Protocol)
- 面向連接的協議
- 建立連接 => 進行通信 => 斷開連接
- 在傳輸前采用"三次握手"方式
- 在通信的整個過程中全程保持連接,形成數據傳輸通道
- 保證了數據傳輸的可靠性和有序性
- 是一種全雙工的字節流通信方式,可以進行大數據量的傳輸
- 傳輸完畢后需要釋放已建立的連接,發送數據的效率比較低
2.2、UDP(用戶數據報協議User Datagram Protocol)
- 非面向連接的協議
- 在通信的整個過程中不需要保持連接,其實是不需要建立連接
- 不保證數據傳輸的可靠性和有序性
- 是一種全雙工的數據報通信方式,每個數據報的大小限制在64K內
- 發送數據完畢后無需釋放資源,開銷小,發送數據的效率比較高,速度快
3、IP與端口
- IP地址是互聯網中的唯一地址標識,本質上是由32位二進制組成的整數,叫做IPv4,當然也有128 位二進制組成的整數,叫做IPv6,目前主流的還是IPv4
- 端口號本質上是16位二進制組成的整數,表示范圍是:0 ~ 65535,其中0 ~ 1024之間的端口號通 常被系統占用,建議編程從1025開始使用
- IP地址 - 可以定位到具體某一臺設備
- 端口號 - 可以定位到該設備中具體某一個進程
- 網絡編程需要提供:IP地址 + 端口號,組合在一起叫做網絡套接字(InetSocketAddress):Socket
4、TCP網絡編程
ServerSocket
| public ServerSocket(int port) | 根據參數指定的端口號來構造對象 |
| public Socket accept() | 偵聽并接收到此套接字的連接請求 |
| public void close() | 用于關閉套接字 |
Socket
| public Socket(String host, int port) | 根據指定主機名和端口來構造對象 |
| public InputStream getInputStream() | 用于獲取當前套接字的輸入流 |
| public OutputStream getOutputStream() | 用于獲取當前套接字的輸出流 |
| public void close() | 用于關閉套接字 |
4.1、客戶端發給服務器端
public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream inputStream=null;try {serverSocket = new ServerSocket(8099);System.out.println("等待客戶端連接");socket = serverSocket.accept();System.out.println("終于等到你");//Thread.sleep(10000);inputStream = socket.getInputStream();int len=0;byte[] buffer = new byte[1024];while ((len=inputStream.read(buffer))!=-1){System.out.println(new String(buffer,0,len));}} catch (IOException | InterruptedException e) {e.printStackTrace();} finally {if (inputStream!=null){try {inputStream.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();}}}} } public class Client {public static void main(String[] args) {Socket socket = null;OutputStream outputStream=null;try {socket = new Socket("127.0.0.1", 8099);outputStream = socket.getOutputStream();outputStream.write("hello, i am ruoye!".getBytes());outputStream.flush();socket.shutdownOutput();} catch (IOException e) {e.printStackTrace();} finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }4.2、服務器響應
字節輸入輸出流會出現問題read無法讀到-1,此時應當
outputStream.flush();
socket.shutdownOutput();
但在多次通信時,關閉流顯然不合適
public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream inputStream=null;OutputStream outputStream=null;try {serverSocket = new ServerSocket(8099);System.out.println("等待客戶端連接");socket = serverSocket.accept();System.out.println("終于等到你"); // Thread.sleep(10000);inputStream = socket.getInputStream();int len=0;byte[] buffer = new byte[1024];while ((len=inputStream.read(buffer))!=-1){System.out.println(new String(buffer,0,len));}System.out.println("服務器收到消息");outputStream = socket.getOutputStream();outputStream.write("i know".getBytes());outputStream.flush();socket.shutdownOutput();System.out.println("服務器發送消息");} catch (IOException e) {e.printStackTrace();} finally {if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (outputStream!=null){try {outputStream.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();}}}} } public class Client {public static void main(String[] args) {Socket socket = null;OutputStream outputStream=null;InputStream inputStream=null;try {socket = new Socket("127.0.0.1", 8099);outputStream = socket.getOutputStream();outputStream.write("hello, i am ruoye!".getBytes());System.out.println("客戶端發送消息成功");outputStream.flush();socket.shutdownOutput();inputStream = socket.getInputStream();int len=0;byte[] buffer = new byte[1024];while ((len=inputStream.read(buffer))!=-1){System.out.println(new String(buffer,0,len));}System.out.println("客戶端接收消息");} catch (IOException e) {e.printStackTrace();} finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }4.3、DataInputStream流
public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream inputStream=null;OutputStream outputStream=null;try {serverSocket = new ServerSocket(8099);System.out.println("等待客戶端連接");socket = serverSocket.accept();System.out.println("終于等到你"); // Thread.sleep(10000);inputStream = socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);System.out.println(dataInputStream.readUTF());System.out.println("服務器收到消息");outputStream = socket.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF("i know!");System.out.println("服務器發送消息");} catch (IOException e) {e.printStackTrace();} finally {if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (outputStream!=null){try {outputStream.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();}}}} } public class Client {public static void main(String[] args) {Socket socket = null;OutputStream outputStream=null;InputStream inputStream=null;try {socket = new Socket("127.0.0.1", 8099);outputStream = socket.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF("i am ruoye!");System.out.println("客戶端發送消息成功");System.out.println("================="+outputStream);outputStream.write("hello, i am ruoye!".getBytes());inputStream = socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);System.out.println(dataInputStream.readUTF());System.out.println("客戶端接收消息");} catch (IOException e) {e.printStackTrace();} finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }4.4、簡易聊天室
public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream inputStream=null;OutputStream outputStream=null;try {serverSocket = new ServerSocket(8099);System.out.println("等待客戶端連接");socket = serverSocket.accept();System.out.println("終于等到你");while (true) {inputStream = socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);String s = dataInputStream.readUTF();System.out.println(s);if ("bye".equalsIgnoreCase(s)){break;}outputStream = socket.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF("收到"+s);}} catch (IOException e) {e.printStackTrace();} finally {if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (outputStream!=null){try {outputStream.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();}}}} } public class Client {public static void main(String[] args) {Socket socket = null;OutputStream outputStream=null;InputStream inputStream=null;Scanner scanner=new Scanner(System.in);try {socket = new Socket("127.0.0.1", 8099);outputStream = socket.getOutputStream();while (true) {String next = scanner.next();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF(next);if ("bye".equalsIgnoreCase(next)){break;}inputStream = socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);System.out.println(dataInputStream.readUTF());}} catch (IOException e) {e.printStackTrace();} finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }4.5、多人聊天室
public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(8099);while (true){System.out.println("等待客戶端連接");Socket socket = serverSocket.accept();System.out.println("終于等到你");new Thread(new Conversation(socket)).start();}} catch (IOException e) {e.printStackTrace();} finally {if (serverSocket!=null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}} } public class Conversation implements Runnable {private Socket socket;public Conversation(Socket socket) {this.socket = socket;}@Overridepublic void run() {InputStream inputStream=null;OutputStream outputStream=null;try {while (true) {inputStream = socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);String s = dataInputStream.readUTF();System.out.println("收到 "+socket.getInetAddress()+" "+socket.getPort()+"的消息:"+s);if ("bye".equalsIgnoreCase(s)){break;}outputStream = socket.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF("收到 "+socket.getInetAddress()+" "+socket.getPort()+":"+s);}} catch (IOException e) {e.printStackTrace();} finally {if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} } public class Client {public static void main(String[] args) {Socket socket = null;OutputStream outputStream=null;InputStream inputStream=null;Scanner scanner=new Scanner(System.in);try {socket = new Socket("127.0.0.1", 8099);outputStream = socket.getOutputStream();while (true) {String next = scanner.next();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF(next);if ("bye".equalsIgnoreCase(next)){break;}inputStream = socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);System.out.println(dataInputStream.readUTF());}} catch (IOException e) {e.printStackTrace();} finally {if (outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (inputStream!=null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }5、UDP網絡編程
DatagramSocket
用于描述發送和接收數據報的套接字(包裹投遞服務的發送或接收點)
| public DatagramSocket() | 使用無參的方式構造對象 |
| public DatagramSocket(int port) | 根據參數指定的端口號來構造對象 |
| public void receive(DatagramPacket p) | 用于接收數據報存放到參數指定的位置 |
| public void send(DatagramPacket p) | 用于將參數指定的數據報發送出去 |
| public void close() | 關閉Socket并釋放相關資源 |
DatagramPacket
要用于描述數據報(用來實現無連接包裹投遞服務)
| public DatagramPacket(byte[] buf, int length) | 根據參數指定的數組來構造對象,用于接 收長度為length的數據報 |
| public DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 根據參數指定數組來構造對象,將數據報 發送到指定地址和端口 |
| public InetAddress getAddress() | 用于獲取發送方或接收方的通信地址 |
| public int getPort() | 用于獲取發送方或接收方的端口號 |
| public int getLength() | 用于獲取發送數據或接收數據的長度 |
InetAddress
| public static InetAddress getLocalHost() | 用于獲取當前主機的通信地址 |
| public static InetAddress getByName(String host) | 根據參數指定的主機名獲取通信地址 |
5.1、簡易廣播
public class Receive {public static void main(String[] args) {DatagramSocket datagramSocket = null;try {datagramSocket = new DatagramSocket(8099);byte[] bytes=new byte[512];DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);System.out.println("等待發送消息");datagramSocket.receive(datagramPacket);System.out.println("等待到的內容"+new String(bytes));} catch (IOException e) {e.printStackTrace();} finally {if (datagramSocket!=null){datagramSocket.close();}}} } public class Send {public static void main(String[] args) {DatagramSocket datagramSocket = null;try {datagramSocket = new DatagramSocket(8100);String str="hello udp!";DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(), str.length(),new InetSocketAddress("127.0.0.1",8099));datagramSocket.send(datagramPacket);} catch (IOException e) {e.printStackTrace();} finally {if (datagramSocket!=null){datagramSocket.close();}}} }5.1、帶回復的廣播
public class Receive {public static void main(String[] args) {DatagramSocket datagramSocket = null;try {datagramSocket = new DatagramSocket(8099);byte[] bytes=new byte[512];DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);System.out.println("等待發送消息");datagramSocket.receive(datagramPacket);System.out.println("等待到的內容"+new String(bytes,0,datagramPacket.getLength()));String str = "i know";DatagramPacket datagramPacket1 = new DatagramPacket(str.getBytes(), str.length(),datagramPacket.getAddress(),datagramPacket.getPort());datagramSocket.send(datagramPacket1);} catch (IOException e) {e.printStackTrace();} finally {if (datagramSocket!=null){datagramSocket.close();}}} } public class Send {public static void main(String[] args) {DatagramSocket datagramSocket = null;try {datagramSocket = new DatagramSocket(8100);String str="hello udp!";DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(), str.length(),new InetSocketAddress("127.0.0.1",8099));datagramSocket.send(datagramPacket);byte[] bytes=new byte[512];DatagramPacket datagramPacket1 = new DatagramPacket(bytes,bytes.length);System.out.println("等待回復消息");datagramSocket.receive(datagramPacket1);System.out.println("等待到的回復內容"+new String(bytes,0,datagramPacket1.getLength()));} catch (IOException e) {e.printStackTrace();} finally {if (datagramSocket!=null){datagramSocket.close();}}} }6、URL
統一資源定位器
<傳輸協議>://<主機名>:<端口號>/<資源地址>| URL(String spec) | 根據參數指定的字符串信息構造對象 |
| String getProtocol() | 獲取協議名稱 |
| String getHost() | 獲取主機名稱 |
| int getPort() | 獲取端口號 |
| String getPath() | 獲取路徑信息 |
| String getFile() | 獲取文件名 |
| URLConnection openConnection() | 獲取URLConnection類的實例 |
URLConnection
| InputStream getInputStream() | 獲取輸入流 |
| void disconnect() | 斷開連接 |
總結
以上是生活随笔為你收集整理的Java核心类库篇8——网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下yolov3的配置
- 下一篇: Java基础篇4——数组