OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。
OSI七层模型和TCP/IP五层模型的划分如下:
当发送数据时,需要对发送的内容按照上述七层模型进行层层加包后发送出去。
当接收数据时,需要对接收的内容按照上述七层模型相反的次序层层拆包并显示出来。
java.net.ServerSocket类主要用于描述服务器套接字信息(大插排)。
常用的方法如下:
方法声明 功能介绍 ServerSocket(int port) 根据参数指定的端口号来构造对象 Socket accept() 侦听并接收到此套接字的连接请求 void close() 用于关闭套接字
java.net.Socket类主要用于描述客户端套接字,是两台机器间通信的端点(小插排)。
常用的方法如下:
方法声明 功能介绍 Socket(String host, int port) 根据指定主机名和端口来构造对象 InputStream getInputStream() 用于获取当前套接字的输入流 OutputStream getOutputStream() 用于获取当前套接字的输出流 void close() 用于关闭套接字
package com.FirstStage.FourthModule.Four; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket; public class ServerThread extends Thread { private Socket accept; public ServerThread(Socket accept) { this.accept = accept; } @Override public void run() { BufferedReader bufferedReader = null; PrintStream printStream = null; // 3.使用输入输出流进行通信 try { bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream())); printStream = new PrintStream(accept.getOutputStream()); while (true) { // 实现对客户端发送来的字符串内容接收并打印 // 当没有数据发来时,下面的方法会形成阻塞 String str = bufferedReader.readLine(); InetAddress inetAddress = accept.getInetAddress(); System.out.println("客户端" + inetAddress + "发来的字符串内容是:" + str); // 当客户端发来bye时,聊天结束 if ("bye".equalsIgnoreCase(str)) { System.out.println("客户端" + inetAddress + "已下线!"); break; } // 实现服务器想客户端回发字符串内容"I received!" printStream.println("I received!"); System.out.println("服务器发送数据成功!"); } } catch (IOException e) { e.printStackTrace(); } finally { if (null != accept) { try { accept.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != printStream) { printStream.close(); } if (null != bufferedReader) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != accept) { try { accept.close(); } catch (IOException e) { e.printStackTrace(); } } } } } package com.FirstStage.FourthModule.Four; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class ServerStringTest { public static void main(String[] args) { // 1.创建ServerSocket类型的对象并提供端口号 ServerSocket serverSocket = null; Socket accept = null; try { serverSocket = new ServerSocket(8888); // 2.等待客户端的连接请求, 调用accept方法 while (true) { System.out.println("等待客户端的连接请求..."); // 当没有客户端连接时,则服务器阻塞在accept方法的调用这里 accept = serverSocket.accept(); System.out.println("客户端" + accept.getInetAddress() + "连接成功!"); // 每当有一个客户端连接成功,则需要启动一个新的线程为之服务 new ServerThread(accept).start(); } } catch (IOException e) { e.printStackTrace(); } finally { // 4.关闭Socket并释放有关资源 if (null != serverSocket) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } package com.FirstStage.FourthModule.Four; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner; public class ClientStringTest { public static void main(String[] args) { // 1.创建Socket类型的对象并提供服务器的主机名和端口号 Socket socket = null; PrintStream printStream = null; Scanner sc = null; BufferedReader bufferedReader = null; try { socket = new Socket("127.0.0.1", 8888); System.out.println("连接服务器成功!"); // 2.使用输入输出流进行通信 sc = new Scanner(System.in); printStream = new PrintStream(socket.getOutputStream()); bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { //Thread.sleep(10000); // 实现客户端发送的内容由用户从键盘输入 System.out.println("请输入要发送的数据内容:"); String str = sc.next(); // 实现客户端想服务器发送字符串内容"hello" //printStream.println("hello"); printStream.println(str); System.out.println("客户端发送数据内容成功!"); // 当发送的聊天内容为bye时,则聊天结束 if ("bye".equalsIgnoreCase(str)) { System.out.println("聊天结束!"); break; } // 实现接收服务器发来的字符串内容并打印 String str1 = bufferedReader.readLine(); System.out.println("服务器回发的内容是:" + str1); } } catch (IOException /*| InterruptedException*/ e) { e.printStackTrace(); } finally { // 3.关闭Socket并释放有关资源 if (null != bufferedReader) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != printStream) { printStream.close(); } if (null != sc) { sc.close(); } if (null != socket) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
java.net.DatagramSocket类主要用于描述发送和接收数据报的套接字(邮局)。换句话说,该类就是包裹投递服务的发送或接收点。
常用的方法如下:
方法声明 功能介绍 DatagramSocket() 使用无参的方式构造对象 DatagramSocket(int port) 根据参数指定的端口号来构造对象 void receive(DatagramPacket p) 用于接收数据报存放到参数指定的位置 void send(DatagramPacket p) 用于将参数指定的数据报发送出去 void close() 关闭Socket并释放相关资源
方法声明 功能介绍 DatagramPacket(byte[] buf, int length) 根据参数指定的数组来构造对象,用于接收长度为length的数据报 DatagramPacket(byte[] buf, int length, InetAddress address, int port) 根据参数指定数组来构造对象,将数据报发送到指定地址和端口 InetAddress getAddress() 用于获取发送方或接收方的通信地址 int getPort() 用于获取发送方或接收方的端口号 int getLength() 用于获取发送数据或接收数据的长度
方法声明 功能介绍 static InetAddress getLocalHost() 用于获取当前主机的通信地址 static InetAddress getByName(String host) 根据参数指定的主机名获取通信地址
package com.FirstStage.FourthModule.Four; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveTest { public static void main(String[] args) { // 1.创建DatagramSocket类型的对象并提供端口号 DatagramSocket datagramSocket = null; try { datagramSocket = new DatagramSocket(8888); // 2.创建DatagramPocket类型的对象并提供缓冲区 byte[] bArr = new byte[20]; DatagramPacket datagramPacket = new DatagramPacket(bArr,bArr.length); // 3.通过Socket接收数据内容存放到Pocket里面,调用receive方法 System.out.println("等待数据的到来..."); datagramSocket.receive(datagramPacket); System.out.println("接收到的数据内容是:" + new String(bArr, 0, datagramPacket.getLength()) + "!"); // 实现将字符串内容"I received!"回发过去 byte[] bArr2 = "I received!".getBytes(); DatagramPacket datagramPacket1 = new DatagramPacket(bArr2, bArr2.length, datagramPacket.getAddress(),datagramPacket.getPort()); datagramSocket.send(datagramPacket1); System.out.println("回发数据成功!"); } catch (IOException e) { e.printStackTrace(); } finally { // 4.关闭Socket并释放有关资源 if (null != datagramSocket) { datagramSocket.close(); } } } } package com.FirstStage.FourthModule.Four; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendTest { public static void main(String[] args) { // 1.创建DatagramSocket类型的对象 DatagramSocket datagramSocket = null; try { datagramSocket = new DatagramSocket(); // 2.创建DatagramPacket类型的对象并提供接收方法的通信地址和端口号 byte[] bArr = "hello".getBytes(); DatagramPacket datagramPacket = new DatagramPacket(bArr, bArr.length, InetAddress.getLocalHost(), 8888); // 3.通过Socket发送Packet,调用send方法 datagramSocket.send(datagramPacket); System.out.println("发送数据成功!"); // 接收回发的数据内容 byte[] bArr1 = new byte[20]; DatagramPacket datagramPacket1 = new DatagramPacket(bArr1, bArr1.length); datagramSocket.receive(datagramPacket1); System.out.println("接收到的回发消息是:" + new String(bArr1,0,datagramPacket1.getLength())); } catch (IOException e) { e.printStackTrace(); } finally { // 4.关闭Socket方法并释放有关资源 if (null != datagramSocket) { datagramSocket.close(); } } } }
方法声明 功能介绍 URL(String spec) 根据参数指定的字符串信息构造对象 String getProtocol() 获取协议名称 String getHost() 获取主机名称 int getPort() 获取端口号 String getPath() 获取路径信息 String getFile() 获取文件名 URLConnection openConnection() 获取URLConnection类的实例
方法声明 功能介绍 InputStream getInputStream() 获取输入流 void disconnect() 断开连接
package com.FirstStage.FourthModule.Four; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class URLTest { public static void main(String[] args) { // 1.使用参数指定的字符串来构造对象 try { URL url = new URL("https://kaiwu.lagou.com/"); // 2.获取相关信息并打印出来 System.out.println("获取到的协议名称是:" + url.getProtocol()); System.out.println("获取到的主机名称是:" + url.getHost()); System.out.println("获取到的端口号是:" + url.getPort()); // 3.建立连接并读取相关信息打印出来 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String str = null; while ((str = bufferedReader.readLine()) != null) { System.out.println(str); } bufferedReader.close(); // 断开连接 urlConnection.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }