计算机网络顺带复习一下io流的小总结

计算机网络

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

网络编程的目的?

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

网络编程:TCP/IP C/S

网络通信的要素

​ 1.如何实现网络通信?
​ 通信双方地址: IP port

​ 规则:网络通信的协议

TCP/IP参考模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOV4t0x2-1604324495562)(C:\Users\2020\AppData\Roaming\Typora\typora-user-images\image-20201102104936638.png)]

小结:

​ 1.网络编程中两个主要问题

​ 如何准确定位到网络上的一台或者多台主机

​ 找到主机之后如何进行通信

​ 2.网络编程中的要素

​ IP和端口号port

​ 网络通信协议 udp tcp

​ 3.万物皆对象

IP

IP地址:InetAddress

​ 唯一定位一台网络上计算机

​ IP地址分类:

​ .ipv4/ipv6

​ IPV4: 127.0.0.1, 4个字节组成. 0~255

​ IPV6: 128位

​ .公网-私网

​ ABCD类地址

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

​ 域名:记忆IP问题

端口

端口表示计算机上的一个程序的进程:

​ 不同的进程有不同端口号,用来区分软件

​ 被规定在0~65535

​ TCP,UDP : 65535*2 单个协议下,端口号不能冲突

​ 端口分类:

​ 拥有端口0-1023

​ 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 "" #查看特定进程
InstSocketAddress(hostname,port);

通信协议

​ 协议:约定

网络通信协议: 速率,传输码率,代码传输结构,传输控制…
TCP/IP协议簇: 实际上是一组协议

​ TCP:用户传输协议

​ UDP:用户数据报协议

​ IP:网络互连协议

TCP与UDP的对比

​ TCP:打电话

​ 连接,稳定

三次握手,四次挥手

​ 客户端,服务端

​ 传输完成释放连接.效率低

​ UDP:发短信

​ 不连接不稳定

​ 客户端,服务端:没有明确界限

​ 不管有没有准备好都可以发送(不管能不能收得到) //会丢失数据

​ DDOS: 洪水攻击 (饱和攻击)

TCP

客户端

​ 1.连接服务器Socket

​ 2.发送消息

public static void main(String[] args) {
        Socket socket = null;
        OutputStream outputStream = null;
        try {
            //得到服务器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //端口
            int port = 9999;
            //3.创建一个socket
             socket = new Socket(serverIP,port);

            //发送消息IO流
             outputStream = socket.getOutputStream();

            outputStream.write("你好,欢迎学习".getBytes());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } 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.建立服务端口 ServerSocket

​ 2.等待用户连接 accept

​ 3.接收用的消息

public static void main(String[] args) {
        ServerSocket serverSocket =null;
        Socket accept = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream =null;
        try {

            serverSocket = new ServerSocket(9999);
            
            while(true){
            //等待客户端连接
            accept = serverSocket.accept();
            //读取客户端消息
             inputStream = accept.getInputStream();


            //管道流
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len=inputStream.read(buffer))!=-1){
                byteArrayOutputStream.write(buffer,0,len);
            	}
            System.out.println(byteArrayOutputStream.toString());
			}
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (byteArrayOutputStream != null) {
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (accept != null) {
                try {
                    accept.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("C:\\Users\\2020\\IdeaProjects\\SpringCloud\\JDK8-new\\4.png"));
        //4.写出文件
        byte[] buffer = new byte[1024];
        int len;
        while ( (len = fis.read(buffer)) != -1){
            os.write(buffer,0,len);
        }


        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("我接收完毕,可以断开了".getBytes());



        //5. 关闭资源
        outputStream.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.png"));

        byte[] buffer = new byte[1024];
        int len;

        while ((len = is.read(buffer)) != -1 ){
            fos.write(buffer,0,len);
        }

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



        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[1024];
        int len2;

        while ((len2 = inputStream.read(buffer2))!=-1){
            byteArrayOutputStream.write(buffer2,0,len2);
        }
        System.out.println(byteArrayOutputStream.toString());

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

UDP

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

    //2.建个包
    String msg = "Hello";
    //发送的人
    InetAddress localhost = InetAddress.getByName("localhost");
    int port = 9090;
    DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
    //3发个包
    datagramSocket.send(packet);

    datagramSocket.close();
}
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接收数据(包)
byte[] buffer = new byte[1024];
int len;
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();

循环发送消息

public static void main(String[] args) throws IOException {
    DatagramSocket socket = new DatagramSocket();

    //准备数据:控制台读取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 static void main(String[] args) throws IOException {
    DatagramSocket socket = new DatagramSocket(6666);

    while (true){
        //准备接收的包裹
        byte[] container = new byte[1024];
        DatagramPacket packet = new DatagramPacket(container,0,container.length);
        socket.receive(packet); //阻塞式收包裹
        //断开连接,bye
        byte[] data = packet.getData();
        String datas = new String(data,0,data.length);
        System.out.println(datas);
        if (datas.equals("bye")){
            break;
        }

    }

    socket.close();
}

两边都是发送方,互相接收消息 (多线程)

URL

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

1.协议://ip地址:端口/项目名/资源

下载网络资源

URL url = new URL("网络资源");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();

InputStream is = urlConnection.getInputStream();

FileOutputStream fos = new FileOutputStream("要保存的本地资源名");

byte[] buffer = new byte[1024];
int len;
while(true){
    fos.write(buffer,0,len);//写出这个数据
}
fos.close();





### 两边都是发送方,互相接收消息 (多线程)



## URL

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

```java
1.协议://ip地址:端口/项目名/资源

下载网络资源

URL url = new URL("网络资源");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();

InputStream is = urlConnection.getInputStream();

FileOutputStream fos = new FileOutputStream("要保存的本地资源名");

byte[] buffer = new byte[1024];
int len;
while(true){
    fos.write(buffer,0,len);//写出这个数据
}
fos.close();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值