1 OSI七层模型概念介绍
物理层:数据以比特的方式进行传递,典型的设备是集线器。该层主要规定了设备的电压或者端口等等一些列物理层面上的规定
数据链路层:该层数据以帧的方式进行传递,主要是两个相邻的结点之间的数据传递,典型的设备就是交换机
网络层:网络层顾名思义就是计算机网络之间的数据传递,包括子网之间。数据以包的方式传递。网络之间的路由规则等。典型的设备是路由器
传输层:该层负责端设备之间的数据传递,以可靠的形式或者不可靠的形式传递。信息的传递是报文
会话层:会话层负责进程之间的连接等一系列维护。数据的传递也是报文的形式
表示层:表示层会对数据进行处理。比如加密操作,或者压缩或者格式转化等等
应用层:确定数据的实际用途
2 TCP/IP协议
应用层 | FTP Telnet HTTP | SNMP DNS | |
传输层 | TCP | UDP | |
网络互联层 | IP | ||
主机-网络层 | 以太网:IEEE802.3 | ||
令牌环网:IEEE802.4 |
3 Echo(客户端-服务端)模型
客户端流程
客户端代码
package com.asiaInfo.caozg.ch_01;import java.io.*;import java.net.Socket;/** * @Authgor: gosaint * @Description: * @Date Created in 21:31 2018/1/7 * @Modified By:客户端代码 */public class EchoClient { // 本机的IP地址 private String host = "localhost"; // 本机的端口号 private int port = 8000; // socket 对象 private Socket socket; // 构造器初始化Socket对象 public EchoClient() throws IOException { socket = new Socket(host, port); } // 测试方法 public static void main(String args[]) throws IOException { new EchoClient().talk(); } private PrintWriter getWriter(Socket socket) throws IOException { OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public void talk() throws IOException { try { // 从socket读取数据 BufferedReader br = getReader(socket); // 向socket写入数据 PrintWriter pw = getWriter(socket); // 把控制台输入的数据转换为字符流,然后读取 BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String msg = null; while ((msg = localReader.readLine()) != null) { // 将读取的数据写出的输出流(打印流) pw.println(msg); System.out.println(br.readLine()); if (msg.equals("bye")) break; } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } }}
服务端流程
package com.asiaInfo.caozg.ch_01;import java.io.*;import java.net.*;public class EchoServer { private int port = 8000; private ServerSocket serverSocket; public EchoServer() throws IOException { serverSocket = new ServerSocket(port); System.out.println("服务器启动"); } public String echo(String msg) { return "echo:" + msg; } private PrintWriter getWriter(Socket socket) throws IOException { OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public void service() { while (true) { Socket socket = null; try { socket = serverSocket.accept(); //等待客户连接 System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort()); // 从socket获取输入流字符,阅读消息 BufferedReader br = getReader(socket); // 向socket写出数据 PrintWriter pw = getWriter(socket); String msg = null; // 阅读消息 while ((msg = br.readLine()) != null) { System.out.println(msg); // 写出消息 pw.println(echo(msg)); if (msg.equals("bye")) //如果客户发送的消息为“bye”,就结束通信 break; } } catch (IOException e) { e.printStackTrace(); } finally { try { if (socket != null) socket.close(); //断开连接 } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String args[]) throws IOException { new EchoServer().service(); }}
4 Socket用法
(1):连接本机1-1024端口
该Demo的作用是练习Socket对象的创建。我们通过连接端口,表明该端口被服务器监听了。在这个区间的大多端口已经被占用,但是我们还是可以连接没有被占用的端口。
public class PortScanner{ public static void main(String[] args){ private String host="localhost";//本机的IP地址 new PortScanner().scan(host); } public void scan(String host){ Socket s=null; try{ for(int port=1;port<1024;port++){ // 创建socket对象 s=new Socket(host,port); System.out.println("该端口没有被占用:"+port); } }catch(IOException e){ Systrm.out.println("该端口被占用:"+port); }finally{ try{ if(s!=null) s.close; }catch(Exception e){ e.printStackTrance(); } } }}