后端开发学习日志(网络编程篇)

目录

什么是计算机网络

网络编程中有两个主要的问题

网络编程的目的

网络通信的要素

IP

ip地址分类:

端口

通信协议

TCP

文件上传

UDP

消息发送

UDP聊天实现 

URL


什么是计算机网络

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程中有两个主要的问题

如何准确的定位到网络上的一台或者多台主机
找到主机之后如何进行通信
 

网络编程的目的

传播交流信息
数据交换
通信

网络通信的要素

通信双方地址:
·IP  
·端口号

规则:网络通信的协议

TCP/IP参考模型

IP

ip地址:lnetAddress

 · 唯一定位一台网络上计算机
 · 127.0.0.1︰本机   localhost

ip地址分类:

IPV4/IPV6:

IPV4     127.0.0.1  四个字节组成   0~255    42亿

IPV6     fe80::915d:470e:d522:4339%16  128位   8个无符号整数

公网(互联网)- 私网(局域网):

192.168.xx.xx,专门给组织内部使用的
 

    public static void main(String[] args) {
        try {
            //查询本机地址
            InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
            System.out.println(inetAddress1);
            InetAddress inetAddress3 = InetAddress.getByName("localhost");
            System.out.println(inetAddress3);
            InetAddress inetAddress4 = InetAddress.getLocalHost();
            System.out.println(inetAddress4);
            //查询网站ip地址
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress2);
        }catch (UnknownHostException e){
            e.printStackTrace();
        }
    }

端口

端口表示计算机上的一个程序的进程:
不同的进程有不同的端口号,用来区分软件
被规定0~65535
TCP,UDP :65535* 2   tcp: 80,udp:80,单个协议下,端口号不能冲突

端口分类

公有端口0~1023 
HTTP: 80
HTTPS: 443
FTP∶21
Telent : 23
Http:80
HTTPS:443
FTP:21
Telent:23

程序注册端口:1024~49151,分配用户或者程序 
Tomcat:8080
MysQL : 3306
Oracle : 1521

动态、私有:49152~65535

netstat -ano #查看所有的端口
netstat -ano |findstr "5900"#查看指定的端口
tasklist/findstr "8696"#查看指定端口的进程
ctr1+ shift + ESC

    public static void main(String[] args) {

        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",8080);
        System.out.println(socketAddress);
        System.out.println(socketAddress2);

        System.out.println(socketAddress.getAddress());
        System.out.println(socketAddress.getHostName());//地址
        System.out.println(socketAddress.getPort());//端口

    }

通信协议

网络通信协议:速率、传输码率、代码结构、传输控制……

TCP/IP协议簇:实际上是一组协议

TCP :用户传输协议
UDP:用户数据报协议

较出名的协议:
TCP
IP:网络互联协议

TCP与UDP对比:

TCP:打电话
·连接,稳定
·三次握手四次挥手
·客户端、服务端
·传输完成,释放连接,效率低

 UDP:发短信
·不连接,不稳定
·客户端、服务端:没有明确的界限。
·不管有没有准备好,都可以发给你
· DDOS:洪水攻击!(饱和攻击)

TCP

客户端
1.连接服务器Socket
2.发送消息

    public static void main(String[] args){
        Socket socket = null;
        OutputStream os = null;
        try {
            //1.要知道服务器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //2.创建一个socket连接
            socket = new Socket(serverIP,port);
            //3.发送消息IO流
            os = socket.getOutputStream();
            os.write("你好".getBytes());

        } catch (Exception e) {
            e.printStackTrace();
        }  finally {
            if (os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

服务器
1.建立服务的端口ServerSocket
2.等待用户的链接accept
3.接收用的消息
 

    public static void main(String[] args) {
        ServerSocket serverSocket =null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        Socket socket = null;
        try {
            //1.我得有一个地址
            serverSocket = new ServerSocket();
            //2.等待客广端连接过来
            socket =  serverSocket.accept();
            //3.读取客户端的消息
            is = socket.getInputStream();
/*
            byte[] buffer = new byte[1024];
            int len;
            while (len = is.read(buffer)!= -1){
                String msg = new String(buffer,0,len);
                System.out.println(msg);
                }
 */
            //管道流
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len=is.read(buffer))!= -1){
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());


        } catch (IOException e) {
           e.printStackTrace();
        }finally {
            //关闭流
            if (baos!= null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is!= null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!= null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

文件上传

客户端

   public static void main(String[] args) throws IOException {
        //1.创建一个Socket连接
        Socket socket= new Socket(InetAddress.getByName("127.0.0.1"),9000);
        //2.创建一个输出流
        OutputStream os = socket.getOutputStream();

        //3.文件流
        FileInputStream fis = new FileInputStream(new File("preview.jpg"));
        //4.写出文件
        byte[] buffer = new byte[2014];
        int len;
        while ((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }

        //通知服务器,我已经结束了
        socket.shutdownOutput();

        //确定服务器接收完华,才能够断开连接
        InputStream ips = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[2014];
        int len2;
        while ((len2=ips.read(buffer))!=-1){
            baos.write(buffer2,0,len2);
        }

        //5.关闭资源
        baos.close();
        ips.close();
        fis.close();
        os.close();
        socket.close();
    }

 服务器

    public static void main(String[] args) throws IOException {
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2.监听客户端的连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
        //3.获取输入流
        InputStream is = socket.getInputStream();

        //4.文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }

        //通知客户端接收完毕了
        OutputStream os = socket.getOutputStream();
        os.write("接收完毕可断开".getBytes());

        //关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }

UDP

消息发送

发送端

    public static void main(String[] args) throws Exception {
        //1.建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        //2.建个包
        String msg = "你好";

        //发送给谁
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;

        //数据,数据的长度起始,要发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);

        //3.发送包
        socket.send(packet);

        //4.关闭流
        socket.close();

    }

接收端

    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        socket.receive(packet);//阻塞接收

        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new  String(packet.getData(),0,packet.getLength()));

        //关闭
        socket.close();

    }

UDP聊天实现 

public class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(8888);

        //准备数据:控制台读取System.in
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        while (true) {

            String data = reader.readLine();
            byte[] datas = data.getBytes();

            DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));

            socket.send(packet);

            if (data.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}
public class UdpReceiveDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);
        while (true) {
            //准备接收包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            socket.receive(packet);//阻塞式接收包裹

            byte[] data = packet.getData();
            String ReceiveData = new String(data, 0, data.length);

            System.out.println(ReceiveData);

            if (ReceiveData.equals("bye")){
                break;
            }

        }
        socket.close();
    }
}

URL

统一资源定位符:定位资源的,定位互联网上的某一个资源

DNS  域名解析  www.baidu.com xxx.x..x..x

协议:// ip地址:端口 / 项目名

public class URLDemo01 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=xian&password=123");
        System.out.println(url.getProtocol());//协议
        System.out.println(url.getHost());//主机ip
        System.out.println(url.getPort());//端口
        System.out.println(url.getPath());//文件
        System.out.println(url.getFile());//全路径
        System.out.println(url.getQuery());//参数

    }
}
public class UrlDown {
    public static void main(String[] args) throws Exception {

        //1.下载地址
        URL url = new URL("http://localhost:8080/xiaoxian/StudyMaterials.txt");

        //2.连接到这个资源   HTTP
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream fos = new FileOutputStream("StudyMaterials.txt");

        byte[] buffer = new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1){
            fos.write(buffer,0,len);//写出这个数据
        }
        fos.close();
        inputStream.close();
        urlConnection.disconnect();//断开连接
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值