网络编程TCP/UDP

网络编程

小结:
1.网络编程中有两个主要的问题

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

2.网络编程中的要素

  • ip和端口号
  • 网络通信协议 udp;tcp

3.万物皆对象

IP地址

  • InetAddress不能new(没有构造器)只能同过静态方法来返回(InetAddress.getByName("localhost");)

通信协议

协议:约定 ,就好比我们现在说的普通话
网络通信协议:速率 传输码率 代码结构 传输控制…
问题:非常的复杂
大事化小:分层
TCP/IP协议簇实际上是一组协议
重要:

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

出名的协议:

  • TCP:
  • IP:网络互连协议

TCP和UDP对比
TCP:打电话

  • 连接,稳定

  • 三次握手 四次挥手

  • 最少需要三次 保持稳定连接!
    A:你愁啥
    B:瞅你咋地
    A:干一架吧!
    
    A:我要走了
    B:你真的要走了吗
    B:你真的真的要走了吗
    A:嗯呢 拜拜
    
  • 客户端 服务端

  • 传输完成 释放连接 效率低

UDP:发短信

  • 不连接 不稳定
  • 客户端 服务端 没有明确的界限
  • 不管有没有准备好 都可以发给你
  • 导弹
  • DDOS: 洪水攻击 (饱和攻击)

TCP实现聊天

注意:要先运行服务端哦~
客户端
1.连接服务器Socket
2.发送消息

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

客户端

  1. 连接服务器Socket
  2. 发送消息
package lesson2;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/*
客户端
 */
public class TCPClientDemo1 {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream outputStream  = null;
        try {
            //1.要知道服务器的地址
            InetAddress severIP = InetAddress.getByName("127.0.0.1");
            //端口号
            int port = 9999;
            //2.创建一个socket连接
            socket = new Socket(severIP,port);
            //3.发送消息
            outputStream = socket.getOutputStream();
            outputStream.write("xiaoqi".getBytes(StandardCharsets.UTF_8));

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

    }
}


服务器

  1. 建立服务端口SeverSocket
  2. 等待用户的连接accept()
  3. 接收用户消息
package lesson2;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
服务端
 */
public class TCPSeverDemo2 {

    public static void main(String[] args) {
        ByteArrayOutputStream bos = null;
        InputStream inputStream  =null;
        Socket socket = null;
        ServerSocket serverSocket  = null;
        try {
            //1.我的有一个地址
            serverSocket = new ServerSocket(9999);
            while(true) {
                //2.等待客户端连接进来
                socket = serverSocket.accept();
                //3.读取客户端的消息
                inputStream = socket.getInputStream();

                /*在传输的过程中,可能会出现问题
                byte[] bytes = new byte[1024];
                int len;
                while((len = inputStream.read(bytes)) != -1){
                String s = new String(bytes,0,len);
                System.out.println(s);
                }*/

                //管道流
                bos = new ByteArrayOutputStream();
                byte[] bytes = new byte[1024];
                int len;
                while ((len = inputStream.read(bytes)) != -1) {
                    bos.write(bytes, 0, len);
                }
                System.out.println(bos.toString());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            if (bos!=null){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null){
                try {
                    inputStream.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();
                }
            }
        }
    }
}

初识Tomcat

Tomcat

服务端

  • 自定义S
  • Tomcat服务器S:java后台开发
    客户端
  • 自定义C
  • 浏览器B

UDP消息发送

发短信:不用连接,需要知道对方的地址

循环发送:

发送方:

package lesson3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UdpSendDemo01 {
    public static void main(String[] args) throws Exception{
        DatagramSocket socket = new DatagramSocket(8888);
        // 准备数据:控制台读取
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while(true) {
            String data = reader.readLine();
            byte[] buffer = data.getBytes();
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length, new InetSocketAddress("localhost", 6666));
            // 发送包
            socket.send(packet);
            if (data.equals("bye")) {
                break;
            }
        }
        // 关闭socket
        socket.close();
    }
}

接受方:

package lesson3;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

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,packet.getLength());
            System.out.println(receiveData);
            if (receiveData.equals("bye")) {
                break;
            }
        }
        // 关闭socket
        socket.close();
    }
}

URL

  • https://www.baidu.com
  • 统一资源定位符:定位互联网上的某一个资源
  • DNS域名解释 :就是把域名www.baidu.com 解析成—>IP xxx.xxx.xxx.xx.x.x
  • URL组成(协议:// ip地址:端口号/项目名/资源)

下载文件

  • 1.启动tomcat服务器;

  • 2.在tomcat中放好文件;

  • 3.进行相关测试。

  • package com.fjbc.网络编程;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class URLDown {
        public static void main(String[] args) throws Exception{
            // 1.下载地址
            URL url = new URL("\thttps://imgessl.kugou.com/stdmusic/20210817/20210817174303365835.jpg");
            // 2.连接到这个资源 HTTP
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            InputStream is = urlConnection.getInputStream();
            FileOutputStream stream = new FileOutputStream(new File("one.jpg"));
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = is.read(bytes)) != -1){
                stream.write(bytes,0,len);
            }
            stream.close();
            is.close();
            urlConnection.disconnect();
        }
    }
    
    
posted @ 2022-12-09 09:45  醉读付人心  阅读(52)  评论(0)    收藏  举报