Java核心类库篇8——网络编程
Java核心類庫篇8——網(wǎng)絡(luò)編程
1、七層網(wǎng)絡(luò)模型
-
OSI(Open System Interconnect),即開放式系統(tǒng)互聯(lián),是ISO(國際標準化組織)組織在1985 年研究的網(wǎng)絡(luò)互連模型。
-
當發(fā)送數(shù)據(jù)時,需要對發(fā)送的內(nèi)容按照上述七層模型進行層層加包后發(fā)送出去。
-
當接收數(shù)據(jù)時,需要對接收的內(nèi)容按照上述七層模型相反的次序?qū)訉硬鸢@示出來
2、協(xié)議
計算機在網(wǎng)絡(luò)中實現(xiàn)通信就必須有一些約定或者規(guī)則,這種約定和規(guī)則就叫做通信協(xié)議,通信協(xié)議 可以對速率、傳輸代碼、代碼結(jié)構(gòu)、傳輸控制步驟、出錯控制等制定統(tǒng)一的標準。
2.1、TCP(傳輸控制協(xié)議Transmission Control Protocol)
- 面向連接的協(xié)議
- 建立連接 => 進行通信 => 斷開連接
- 在傳輸前采用"三次握手"方式
- 在通信的整個過程中全程保持連接,形成數(shù)據(jù)傳輸通道
- 保證了數(shù)據(jù)傳輸?shù)目煽啃院陀行蛐?/li>
- 是一種全雙工的字節(jié)流通信方式,可以進行大數(shù)據(jù)量的傳輸
- 傳輸完畢后需要釋放已建立的連接,發(fā)送數(shù)據(jù)的效率比較低
2.2、UDP(用戶數(shù)據(jù)報協(xié)議User Datagram Protocol)
- 非面向連接的協(xié)議
- 在通信的整個過程中不需要保持連接,其實是不需要建立連接
- 不保證數(shù)據(jù)傳輸?shù)目煽啃院陀行蛐?/li>
- 是一種全雙工的數(shù)據(jù)報通信方式,每個數(shù)據(jù)報的大小限制在64K內(nèi)
- 發(fā)送數(shù)據(jù)完畢后無需釋放資源,開銷小,發(fā)送數(shù)據(jù)的效率比較高,速度快
3、IP與端口
- IP地址是互聯(lián)網(wǎng)中的唯一地址標識,本質(zhì)上是由32位二進制組成的整數(shù),叫做IPv4,當然也有128 位二進制組成的整數(shù),叫做IPv6,目前主流的還是IPv4
- 端口號本質(zhì)上是16位二進制組成的整數(shù),表示范圍是:0 ~ 65535,其中0 ~ 1024之間的端口號通 常被系統(tǒng)占用,建議編程從1025開始使用
- IP地址 - 可以定位到具體某一臺設(shè)備
- 端口號 - 可以定位到該設(shè)備中具體某一個進程
- 網(wǎng)絡(luò)編程需要提供:IP地址 + 端口號,組合在一起叫做網(wǎng)絡(luò)套接字(InetSocketAddress):Socket
4、TCP網(wǎng)絡(luò)編程
ServerSocket
| public ServerSocket(int port) | 根據(jù)參數(shù)指定的端口號來構(gòu)造對象 |
| public Socket accept() | 偵聽并接收到此套接字的連接請求 |
| public void close() | 用于關(guān)閉套接字 |
Socket
| public Socket(String host, int port) | 根據(jù)指定主機名和端口來構(gòu)造對象 |
| public InputStream getInputStream() | 用于獲取當前套接字的輸入流 |
| public OutputStream getOutputStream() | 用于獲取當前套接字的輸出流 |
| public void close() | 用于關(guān)閉套接字 |
4.1、客戶端發(fā)給服務(wù)器端
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、服務(wù)器響應(yīng)
字節(jié)輸入輸出流會出現(xiàn)問題read無法讀到-1,此時應(yīng)當
outputStream.flush();
socket.shutdownOutput();
但在多次通信時,關(guān)閉流顯然不合適
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("服務(wù)器收到消息");outputStream = socket.getOutputStream();outputStream.write("i know".getBytes());outputStream.flush();socket.shutdownOutput();System.out.println("服務(wù)器發(fā)送消息");} 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("客戶端發(fā)送消息成功");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("服務(wù)器收到消息");outputStream = socket.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF("i know!");System.out.println("服務(wù)器發(fā)送消息");} 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("客戶端發(fā)送消息成功");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網(wǎng)絡(luò)編程
DatagramSocket
用于描述發(fā)送和接收數(shù)據(jù)報的套接字(包裹投遞服務(wù)的發(fā)送或接收點)
| public DatagramSocket() | 使用無參的方式構(gòu)造對象 |
| public DatagramSocket(int port) | 根據(jù)參數(shù)指定的端口號來構(gòu)造對象 |
| public void receive(DatagramPacket p) | 用于接收數(shù)據(jù)報存放到參數(shù)指定的位置 |
| public void send(DatagramPacket p) | 用于將參數(shù)指定的數(shù)據(jù)報發(fā)送出去 |
| public void close() | 關(guān)閉Socket并釋放相關(guān)資源 |
DatagramPacket
要用于描述數(shù)據(jù)報(用來實現(xiàn)無連接包裹投遞服務(wù))
| public DatagramPacket(byte[] buf, int length) | 根據(jù)參數(shù)指定的數(shù)組來構(gòu)造對象,用于接 收長度為length的數(shù)據(jù)報 |
| public DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 根據(jù)參數(shù)指定數(shù)組來構(gòu)造對象,將數(shù)據(jù)報 發(fā)送到指定地址和端口 |
| public InetAddress getAddress() | 用于獲取發(fā)送方或接收方的通信地址 |
| public int getPort() | 用于獲取發(fā)送方或接收方的端口號 |
| public int getLength() | 用于獲取發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的長度 |
InetAddress
| public static InetAddress getLocalHost() | 用于獲取當前主機的通信地址 |
| public static InetAddress getByName(String host) | 根據(jù)參數(shù)指定的主機名獲取通信地址 |
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("等待發(fā)送消息");datagramSocket.receive(datagramPacket);System.out.println("等待到的內(nèi)容"+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、帶回復(fù)的廣播
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("等待發(fā)送消息");datagramSocket.receive(datagramPacket);System.out.println("等待到的內(nèi)容"+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("等待回復(fù)消息");datagramSocket.receive(datagramPacket1);System.out.println("等待到的回復(fù)內(nèi)容"+new String(bytes,0,datagramPacket1.getLength()));} catch (IOException e) {e.printStackTrace();} finally {if (datagramSocket!=null){datagramSocket.close();}}} }6、URL
統(tǒng)一資源定位器
<傳輸協(xié)議>://<主機名>:<端口號>/<資源地址>| URL(String spec) | 根據(jù)參數(shù)指定的字符串信息構(gòu)造對象 |
| String getProtocol() | 獲取協(xié)議名稱 |
| String getHost() | 獲取主機名稱 |
| int getPort() | 獲取端口號 |
| String getPath() | 獲取路徑信息 |
| String getFile() | 獲取文件名 |
| URLConnection openConnection() | 獲取URLConnection類的實例 |
URLConnection
| InputStream getInputStream() | 獲取輸入流 |
| void disconnect() | 斷開連接 |
總結(jié)
以上是生活随笔為你收集整理的Java核心类库篇8——网络编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下yolov3的配置
- 下一篇: 吴恩达深度学习笔记2-Course1-W