socket网络编程-基础知识

什么是网络编程

网络编程的本质是两个设备之间的数据交换。

Socket、TCP/IP和Udp

TCP

  • 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
  • 主要特点:基于流的方式、面向连接、可靠通信方、在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销、通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点
  • 工作方式
    1、三次握手连接
    背景:你想泡女神

1:哦,亲爱的女神,我可以牵你的手吗
2:女神害羞点头
3:你愉快的牵着女神的手(走向了网吧)

2、四次挥手
背景:你和女神手挽着手,要分开各自回家找妈妈

1、女神舍不得说:我要走了
2、你说:我也走了
3、你放开她的手
4、她放开你的手

udp

  • Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议
  • UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的

TCP和UDP协议区别

  • TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务
  • TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;
  • UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;-
  • UDP 具有较好的实时性,工作效率较 TCP 协议高
  • UDP 段结构比 TCP 的段结构简单,因此网络开销也小。
  • TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据

socket

  • 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据
  • socket可对其进行像对文件一样的打开、读写和关闭等操作。
  • socket允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信
  • 网络套接字socket是IP地址与端口的组合

Socket实现客户端

public class Client {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket();
        //超时时间
        socket.setSoTimeout(3000);
        //连接本地
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);
        System.out.println("客户端已发起连接,等待服务器连接...........");
        System.out.println("客户端信息" + socket.getLocalAddress() + ",本地端口号Port:" + socket.getLocalPort());
        System.out.println("服务器信息" + socket.getInetAddress() + ",服务器端口号Port:" + socket.getPort());


        //发送数据
        todo(socket);
        //释放资源
        socket.close();

        System.out.println("客户端已退出");
    }

    private static void todo(Socket client) throws IOException {
        //键盘输入流
        InputStream in = System.in;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
        //socket输出流,并转换为打印流,用于发送数据
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream = new PrintStream(outputStream);

        //得到输入流
        InputStream inputStream = client.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        boolean flag = true;

        do {
            //键盘读取一行
            String str = bufferedReader.readLine();
            //发送到服务器
            socketPrintStream.println(str);

            //服务器中读取一行
            String s = reader.readLine();
            if ("bye".equalsIgnoreCase(s)) {
                flag = false;
            } else {
                System.out.println(s);
            }
        } while (flag);
        //资源释放
        reader.close();
        socketPrintStream.close();
    }
}

Socket实现服务端

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(2000);
        System.out.println("服务器准备就绪...........");
        System.out.println("服务器信息" + server.getInetAddress() + ",服务器端口号Port:" + server.getLocalPort());

        //等待客户端连接
        for (;;){
            //得到客户端
            Socket client = server.accept();
            ClientHandler clientHandler=new ClientHandler(client);
            clientHandler.start();
        }

    }

    private static class ClientHandler extends Thread{
        private Socket socket;
        private boolean isFlag=true;

        public ClientHandler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            super.run();
            System.out.println("新客户端连接:"+socket.getInetAddress()+"客户端端口号:"+socket.getPort());

            try {
                //得到打印流,用于数据输出,服务器回收数据
                PrintStream socketPrintStream=new PrintStream(socket.getOutputStream());
                //得到输出流,用于接受数据
                BufferedReader socketInput=new BufferedReader(new InputStreamReader(socket.getInputStream()));

                do{
                    //客户端得到一条数据
                    String str = socketInput.readLine();
                    if("bye".equalsIgnoreCase(str)){
                        isFlag=false;
                        //回送bye
                        socketPrintStream.println("bye");
                    }else{
                        //回送一条数据
                        System.out.println("接收到客户端发来的信息:"+str);
                        socketPrintStream.println("服务器得到内容是:"+ str);
                    }

                }while (isFlag);
                socketInput.close();
                socketPrintStream.close();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("连接异常断开了...");
            }finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("客户端已退出:"+socket.getInetAddress()+",客户端端口号:"+socket.getPort());
        }
    }
}

报文、协议、Mac地址,IP和端口

IP地址

  • IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议
  • IP主要包含三方面内容:IP编址方案、分组封装格式及分组转发规则
  • IP协议版本:IPv4和IPv6
  • IP地址的结构:由网络地址与主机地址两部分所组成

协议

  • 为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。
  • 协议总是指某一层的协议。准确地说,它是在同等层之间的实体通信时,有关通信规则和约定的集合就是该层协议,例如物理层协议、传输层协议、应用层协议。

Mac地址

  • MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址

报文

  • 报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

端口
可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,如计算机背板的RJ45网口

你可能感兴趣的:(socket网络编程-基础知识)