zoukankan      html  css  js  c++  java
  • Java精选笔记_网络编程

    网络编程

    概述

        现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈

        在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。

    网络通信协议

        连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换

    IP地址和端口号

        IP地址:InetAddress
            网络中设备的标识
            不易记忆,可用主机名
            本地回环地址:127.0.0.1  主机名:localhost
        端口号
            用于标识进程的逻辑地址,不同进程的标识。逻辑地址,区分不同的服务
            有效端口:0~65535,其中0~1024系统使用或保留端口。
            备注:不是所谓的物理端口!

    InetAddress

        InetAddress:构造方法私有,不能直接创建对象。

        InetAddress getByName(String host): 在给定主机名的情况下确定主机的ip地址。

        InetAddress getLocalHost():返回本地主机。

        InetAddress[] getAllByName(String host);

        ip.getHostAddress()

        ip.getHostName()


    Eg:
    package com.li.net;
    import java.net.InetAddress;

    public class Demo1 {
        public static void main(String[] args) throws Exception {
            InetAddress i = InetAddress.getLocalHost();
            System.out.println(i);
            i = InetAddress.getByName("www.baidu.com");
            System.out.println(i);
            System.out.println(i.getHostAddress());
            System.out.println(i.getHostName());
        }
    }
    输出:
    XP-201706252326/10.6.147.2
    www.baidu.com/61.135.169.105
    61.135.169.105
    www.baidu.com

    UDP与TCP协议

        TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控制协议/英特网互联协议),它是一个包括TCP协议和IP协议。
    UDP(User Datagram Protocol)用户数据报协议
    ICMP(Internet Control Message Protocol)协议和其它一些协议的协议组

    区别

    类似于图像、声音等对可靠性要求没有那么高的业务可以用UDP,他们不需要准确存储对准确性无要求但要求速度快
    类似于文本、程序、文件等要求可靠的数据最好就用TCP,但会牺牲一些速度。 
    对系统资源的要求:TCP较多,UDP少。 
    程序结构:UDP程序结构较简单,TCP复杂。 
    流模式与数据报模式:TCP保证数据正确性,UDP可能丢包; TCP保证数据顺序,UDP不保证

    用途

        TCP是面向连接的,有比较高的可靠性,一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等,而 UDP是面向无连接的,使用这个协议的常见服务有DNS、SNMP、QQ等。

        UDP是一种面向无连接的通信协议,该协议使得数据传输的速度得到大幅度的提高。视频聊天语音聊天基本都是用UDP协议。 

    总结

    UDP:

        1、将数据源和目的地封装到数据包中,不需要建立连接

        2、每个数据包的大小限制在64k以内

        3、因无连接,是不可靠协议

        4、不需要建立连接,速度快

    例子:聊天、对讲机就是UDP的,面向无连接(不管在不在,知不知道,只管发送,求速度),丢数据也不管。速度快。数据被分成包

    TCP:

        1、建立连接,形成传输数据的通道

        2、在连接中进行大量数据的传输

        3、通过三次握手完成连接、是可靠协议

        4、必须建立连接,效率会稍低

    例子:电话通话,必须连接,对方同意才可以发送数据(不然就等待),不能丢失数据。


    UDP通信

    DatagramPacket

    DatagramPacket类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据

    通过这个对象中的方法,就可以获取到数据包中的各种信息
        byte[] getData()

        int getLength()

        int getPort()

        setData(byte[]

        setPort()

    DatagramSocket

    DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,封装了udp传输协议的socket对象
    具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。

        receive(DatagramPacket)

        send(DatagramPacket)

    UDP网络编程

    udp的发送端

        ①:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。

        ②:明确要发送的具体数据。

        ③:将数据封装成了数据包。

        ④:用socket服务的send方法将数据包发送出去。

        ⑤:关闭资源。

    发送端(客户端)
    import java.net.*;
    class  UdpSend {
         public static void main(String[] args)throws Exception {
               // 1,建立udp的socket服务。
               DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。
                // 2,明确要发送的具体数据。
                String text = "udp传输演示 哥们来了";
                byte[] buf = text.getBytes();
                 // 3,将数据封装成了数据包。
                 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);
                 // 4,用socket服务的send方法将数据包发送出去。
                 ds.send(dp);
                 // 5,关闭资源。
                 ds.close();
         }
    }


    udp的接收端

    ①:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。

    ②:定义数据包,用于存储接收到数据。

    ③:通过socket服务的接收方法将收到的数据存储到数据包中。

    ④:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。

    ⑤:关闭资源。

    接收端(服务器端)

    import java.net.*;
    class UdpRece {
         public static void main(String[] args) throws Exception {
               // 1,创建udp的socket服务。
               DatagramSocket ds = new DatagramSocket(10000); //必须指定,并且和上面的端口号一样!
               // 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。
               byte[] buf = new byte[1024];
               DatagramPacket dp = new DatagramPacket(buf,buf.length);
               // 3,通过socket服务的接收方法将收到的数据存储到数据包中。
               ds.receive(dp); //该方法是阻塞式方法。
               // 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。
               String ip = dp.getAddress().getHostAddress();
               int port = dp.getPort();
               String text = new String(dp.getData(),0,dp.getLength()); //将字节数组中的有效部分转成字符串。
               System.out.println(ip+":"+port+"--"+text);
               // 5,关闭资源。
               ds.close();
        }

    }


    UDP案例--聊天程序

    通过键盘录入获取要发送的信息。

    将发送和接收分别封装到两个线程中。

    package com.li.net;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    //客户端,发送端
    class Send implements Runnable {
        private DatagramSocket ds;
        public Send(DatagramSocket ds) {
            super();
            this.ds = ds;
        }
        @Override
        public void run() {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//数据源是键盘录入
                String line;
                while ((line = br.readLine()) != null) {
                    byte[] buf = line.getBytes();
                    DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"), 10225);
                    ds.send(dp);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    	}
    }
    // 服务器端,接收端
    class Rece implements Runnable {
        private DatagramSocket ds;
        public Rece(DatagramSocket ds) {
            super();
            this.ds = ds;
        }
        @Override
        public void run() {
            try {
                while (true) {
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf, 0, buf.length);
                    ds.receive(dp);
                    String ip = dp.getAddress().getHostAddress();
                    String data = new String(dp.getData(), 0, dp.getLength());
                    System.out.println(ip + "     " + data);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public class Demo6 {
        public static void main(String[] args) throws Exception {
            DatagramSocket sendDs = new DatagramSocket();
            DatagramSocket receDs = new DatagramSocket(10225);
            new Thread(new Send(sendDs)).start();
            new Thread(new Rece(receDs)).start();
        }
    }
    输出:
    你好
    127.0.0.1     你好
    你好
    127.0.0.1     你好

    TCP通信

    TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接

    在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端

    ServerSocket

        ServerSocket(端口) - 构造器

        setSoTimeout(int)

        Socket accept()

        close()

    Socket

    Socket就是为网络服务提供的一种机制。

        Socket(IP地址, 端口) - 构造器

        getInputStream()

        getOutputStream()

        getChannel()

        close()


    TCP案例--文件上传

    题目:上传文件,多客户端上传,并且保证不会因为文件的名称而重复!
    客户端:
    package com.li.net;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    public class Demo22 {
        public static void main(String[] args) throws Exception {
            Socket s = new Socket("localhost", 12036);
            BufferedReader br = new BufferedReader(new FileReader("E:/你好.txt"));
            PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
            BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String line;
            while((line = br.readLine()) != null) {
                pw.println(line);
            }
            s.shutdownOutput();
            String str = br2.readLine();
            System.out.println(str);
            s.close();
        }
    }

    服务器端:
    package com.li.net;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    class MyUpdate implements Runnable {
        private Socket s;
        public MyUpdate(Socket s) {
            super();
            this.s = s;
        }
        @Override
        public void run() {
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+".........connected!");
            int count = 0;
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                File file = new File("E:/");
                File f = new File(file,"你好"+count+".txt");
                while(f.exists()) {	//如果写成if,就不可以!
                    f = new File(file,"你好"+(++count)+".txt"); 
                }
                PrintWriter pw = new PrintWriter(new FileWriter(f),true);
                PrintWriter pw2 = new PrintWriter(s.getOutputStream(),true);
                String line;
                while((line = br.readLine()) != null) {
                    pw.println(line);
                }			
                pw2.println("恭喜您,上传成功!");
                s.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public class Demo23 {
        public static void main(String[] args) throws Exception {	
            ServerSocket ss = new ServerSocket(12036);
            while(true) {
                Socket s = ss.accept();
                new Thread(new MyUpdate(s)).start();
            }
        }
    }

  • 相关阅读:
    Datazen地图Chart自定义数据
    Datazen地图Chart介绍
    TFS Express backup and restore
    [BI项目记]-TFS Express备份和恢复
    [BI项目记]-新任务处理
    [BI项目记]-新任务创建
    Datazen图表创建和发布
    开闭原则(OCP)
    Fragment XXX not attached to Activity
    问题解决:Fragment not attached to Activity
  • 原文地址:https://www.cnblogs.com/justdoitba/p/7582136.html
Copyright © 2011-2022 走看看