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();
            }
        }
    }

  • 相关阅读:
    2.Android之按钮Button和编辑框EditText学习
    《DSP using MATLAB》Problem 3.8
    《DSP using MATLAB》Problem 3.7
    《DSP using MATLAB》Problem 3.6
    《DSP using MATLAB》Problem 3.5
    《DSP using MATLAB》Problem 3.4
    《DSP using MATLAB》Problem 3.3
    《DSP using MATLAB》Problem 3.2
    《DSP using MATLAB》Problem 3.1
    《DSP using MATLAB》Problem 2.20
  • 原文地址:https://www.cnblogs.com/justdoitba/p/7582136.html
Copyright © 2011-2022 走看看