zoukankan      html  css  js  c++  java
  • TCP/IP以及Socket对象基本

    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();
                 }
             }
        }
    }
  • 相关阅读:
    A* Pathfinding for Beginners
    OpenGL Draw Mesh
    CentOS6.5下安装、配置SSH
    Ubuntu18.04下搭建LAMP环境
    滚动合集
    关闭页面触发事件
    在table中tr的display:block在firefox下显示布局错乱问题
    sharepoint添加模板及删除模板
    常用正则表达式
    javascript对象的property和prototype是这样一种关系
  • 原文地址:https://www.cnblogs.com/gosaint/p/8249909.html
Copyright © 2011-2022 走看看