网络(网络的基本概念、网络发送数据,网络接收数据、关于Tcp应用的总结)_网络(网络的基本概念 网络发送数据)_Wei_Hss的博客-程序员宝宝

技术标签: java  网络  java基础1  tcp/ip  

一、网络的基本概念

1.网络

TCP通信, javaWeb 基于Http通信的

概念比较重要

 

2.TCP/IP 协议

网络: 两台或者多台电脑之间能够通信: 广域网(外网), 局域网(内网)

TCP/IP协议(定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准):

IP: ip地址, 电脑的一个唯一地址, 方便电脑之间通信, ip地址唯一

四个字节, 每个字节使用 "."分割: 每一位的范围: 0~255

方便记忆: 使用域名(英文符号) 替换ip, 映射: www.baidu.com域名: 绑定一个ip 14.215.177.39, 访问百度: 根据ip访问,

IP: 确定与那台电脑通信

底层: 把域名转换为ip地址

端口: 端口号, 0~65535个 , 与这个台电脑的那个程序通信

0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的

1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。8888 8090 9999 7777

http: 默认端口: 80

https: 默认端口: 443

mysql的默认端口: 3306

端口: TCP: 0~65535 UDP:0~65535

TCP: 面向连接的可靠的连接,基于字节流

TCP通信的时候:

发送据之前, 与对方建立一个连接, 三次握手机制

 

 

3、TCP通信

Socket编程: Socket (客户端的套接字) ServerSocket(服务端的套接字(Socket))

 

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取(字节流)来进行通信。

流式套接字: TCP, 面向连接

 Socket socket = new Socket("127.0.0.1",8888);

4、UDP通信

数据报套接字: 面向无连接

二、网络发送数据,网络接收数据

1、客户端请求连接

Socket socket = new Socket("127.0.0.1",8888);

2、服务端接受连接

ServerSocket serverSocket = new ServerSocket(8888);
        Socket client = serverSocket.accept();//阻塞
        System.out.println("有客户端连接");

3、发送数据

OutputStream out = socket.getOutputStream();
BufferedWriter bw = null;
bw = new BufferedWriter(new OutputStreamWriter(out));
//发送数据
        Scanner input = new Scanner(System.in);
​
        bw.write(input.next()); //input.next() 阻塞
        bw.newLine(); //写了换行符
        bw.flush(); //刷新缓存区

4、接收数据

 InputStream in = socket.getInputStream();
 BufferedReader br = null;
 br = new BufferedReader(new InputStreamReader(in));
 String line = br.readLine(); //阻塞方法, 读到行结尾  换行符
        System.out.println("服务端说:"+line);

5、关闭资源

//关闭资源
        bw.close();
        br.close();
        client.close();
        serverSocket.close();

 三、关于Tcp应用的总结

1、关闭资源

关闭资源过多且重复时

/**
 * 关闭资源的方法
 */
public class CloseUtil {
​
    public static  void  close(Closeable... closeables){
        //判断closeables创建出来
        if(closeables != null && closeables.length > 0){
            for (Closeable closeable : closeables) {
                if(closeable != null){
                    try {
                        closeable.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

2、发送工具类

/**
 * 发送工具类
 */
public class SendUtil {
    public static void send(BufferedWriter bw, String content) throws IOException {
        bw.write(content);
        bw.newLine();
        bw.flush();
    }
}

3、小说网应用

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
​
/**
 * 服务器
 */
public class Server {
    private static List<String> nameList = new ArrayList<>();
    public static void main(String[] args)  {
        try {
            //1.开启服务器
            ServerSocket serverSocket = new ServerSocket(8888);
            //2.等待客户端的连接
            while(true){
                Socket client = serverSocket.accept();
                //读取指令
                BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
                String flag = br.readLine();
                switch (flag){
                    case "1":
                        //处理上传
                        doUpload(client);
                        break;
                    case "2":
                        //处理在想阅读
                        doReadOnLine(client);
                        break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    //处理在线阅读
    private static void doReadOnLine(Socket client) {
    }
​
    //处理上传
    private static void doUpload(Socket client) {
        //网络IO
        BufferedReader br = null;
        BufferedWriter bw = null;
        //本地输出流
        BufferedWriter bw2 = null;
        try {
            //ctrl+alt+T 包裹指定代码块
            br = new BufferedReader(new InputStreamReader(client.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
            //1.发送"请输入上传的小说名"
            SendUtil.send(bw,"请输入上传的小说名");
            //2.接收小说名 并保存
            String name = br.readLine();
            nameList.add(name);
            //3.创建本地输出流,追加模式
            //完善, 先判断服务器的保存小说目录是否存在, 如果不存在,创建目录
            bw2 = new BufferedWriter(new FileWriter("d:/test/"+name+".txt",true));
            //4.循环接收客户端上传的内容,写入到文件
            String line = null;
            while(!(line = br.readLine()).equals("exit")){ //不等于exit
                //写入到文件
                SendUtil.send(bw2,line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //5.关闭资源
            CloseUtil.close(bw2,bw,br,client);
        }
    }
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
​
/**
 * 客户端
 */
public class Client {
    Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        new Client().showEmun();
    }
​
    /**
     * 显示菜单
     */
    public void showEmun(){
        System.out.println("欢迎访问Xxxx小说网站");
        System.out.println("\t1.上传小说");
        System.out.println("\t2.在线阅读");
        System.out.println("请选择:");
        int choose = input.nextInt();
        switch(choose){
            case 1:
                //上传小说
                upload(1);
                break;
            case 2:
                //在线阅读
                break;
        }
    }
​
    /**
     * 上传小说
     * @param i
     */
    private void upload(int i) {
        Socket socket = null;
        //网络IO
        BufferedReader br = null;
        BufferedWriter bw = null;
        //本地输入流
        BufferedReader br2 = null;
        try {
            //1.连接服务器
            socket = new Socket("127.0.0.1",8888);
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //发送上传的指令
            SendUtil.send(bw,i+"");
            //2.接收服务器的信息
            String info = br.readLine();
            System.out.println(info);
            //3.输入小说名
            String name = input.next();
            SendUtil.send(bw,name);
            //4.使用本地输入流,读取客户端的硬盘上小说
            br2 = new BufferedReader(new FileReader("d:/upload/"+name+".txt"));
            //5.循环读取
            String line = null;
            while((line = br2.readLine()) != null){ //读到文件末尾
                //6.把读到的一行数据发送给服务器
                SendUtil.send(bw,line);
            }
            //7.小说上传完成, 发送一个exit.告诉服务器已结束
            SendUtil.send(bw,"exit");
​
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //8.关闭资源
            CloseUtil.close(br2,bw,br,socket);
        }
        //回到菜单
        showEmun();
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/H215919719/article/details/126615151

智能推荐

vue alert内含有html,javascript – Vue.js Sweet Alert 2中的动态HTML和Vue指令_大东北精粮尚品的博客-程序员宝宝

new Vue({el: '#app',data(){results: []}});我正在尝试使用Sweet Alert显示警报,并在顶部输入搜索过滤器,然后我想根据警报中输入的内容过滤结果.问题是,Vue指令似乎没有在Sweet Alert中生效 – 可能是因为它不在#app的范围内.令我惊讶的是,我没有看到太多的问题,所以我认为我只是做错了什么.有没有办法在Sweet Alert的标记中使用V...

英文文章词频统计java_xld01的博客-程序员宝宝

使用词表,遍历替换文章单词,再进行词频统计要求去除介词等无用单词单词单复数,动词不同时态等合并代码import java.awt.print.Printable;import java.io.RandomAccessFile;import java.util.ArrayList;import java.util.Collections;import java.util.Com...

关于 ES6 复制,解构等 深入解析_yakunyang(2016)的博客-程序员宝宝

&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html lang=&quot;en&quot;&amp;gt;&amp;lt;head&amp;gt;    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;    &amp;

带你领略斐波那契数列之美_qq_40707451的博客-程序员宝宝

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……这个数列从第3项开始,每一项都等于前两项之和。如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-...

python中常见类库及使用总结_python类库_qq_40729302的博客-程序员宝宝

1.from matplotlib import pyplot Matplotlib是python的一个绘图库,是Python中最常用的可视化工具之一。 matplotlib是受MATLAB的启发构建的,matplotlib有一套完全仿照MATLAB的函数形式的绘图接口。 matplotlib.pyplot模块中,这套函数接口方便MATLAB用户过度到matplotlib包。简述一下绘图过程:fig = pyplot.figure() #在任何绘图之前,需要一个Figure对象。Figure可

随便推点

opencv3.4.10+opencv-contrib编译_加加昕的博客-程序员宝宝

OpenCV3.4.10+opencv_contrib编译最近做图像匹配需要用到feature2d功能,原本在opencv2.x里是封装好的,在opencv3里由于知识产区问题单独封装到opencv_contrib中了,WTF用这么长时间opencv3了居然没发现这个问题,用习惯了opencv官网提供的opencv2的win版本,突然需要编译源码还真有点不习惯,踩了个大坑好几天编不出来,给大家分享一下防止掉入深坑。1. 源码2.CMake3.运行VS4.常见错误/****************

sweetalert2中插入一段html无法获取内容_swal 加入html_欲饮琵琶码上催的博客-程序员宝宝

原因是自己把一段html加入到它弹框中显示它是一个表单内容,但是我通过jquery取值的时候死活取不到选中后的值不管是原生还是jq都取不到 //获取发布类型 let type = $(" select[name='type']").val(); var myselect = document.querySelector('#type'); var index = myselect.selectedIndex;         //获

Myeclipse支持Velocity_myeclipse velocity支持_壹个难人的博客-程序员宝宝

要想让你的IDE支持velocity肯定是要装个支持velocity的插件,这里介绍的是:让Myeclipse支持velocity注:如下步骤都是按照本人自己的环境来操作,如安装计目录和版本不同,请按以下照葫芦画瓢,道理是一样的。IDE:Myeclipse for spring 9.1安装目录为:E:\Program Files\  第一步: 通

C语言深度剖解PDF_c语言深度解剖 pdf_林夕07的博客-程序员宝宝

《C语言深度剖解》链接:https://pan.baidu.com/s/1VC0ssjR1k2TLUOa7EXWIqg提取码:vs1p

PowerDesigner简单使用教程(含安装汉化)_powerdesigner汉化教程_Tatsulot的博客-程序员宝宝

PowerDesigner简单使用教程一、安装文件二、使用方法1.生成工作空间2.建立表3.设计表4.查看表SQL语句一、安装文件https://pan.baidu.com/s/1_BaCdk-bcDG5EnRq469JRg下载,解压,分为主体安装软件,破解软件和汉化包,内附readme。二、使用方法1.生成工作空间菜单栏选择:File→New,然后:2.建立表点击右上角表格样子...

推荐文章

热门文章

相关标签