网络编程(韩顺平)

网络相关概念

1.网络通信:两台设备之间通过网络实现数据传输,java.net包下提供了一系列的类和接口用来实现网络通信。

2.网络:两台或者多台设备通过一定的物理设备连接起来构成了网络。

3.网络分类:局域网、城域网、广域网。万维网是广域网的代表。

4.ip地址:

ip地址分为ipv4和ipv6

  1. 用于唯一标识网络中的每台计算机,用ipconfig查看本机ip
  2. ip地址表示形式:(IPv4)点分十进制 xx.xx.xx.xx 也就是用点分隔的四个十进制的数,因为这个十进制是一个字节的大小,所以范围是0-255.(IPv6)长度为128位,是v4的四倍,采用16进制表示
  3. ip地址的组成:网络地址+主机地址
  4. 对于IPv6,是由于ipv4的能表示的太少,因为物联网等的发展,越来越多的网络设备会接入网络,所以引入了IPv6,号称可以表示世界上每一个沙粒。但现在还没有完全替代v4

5.ip地址的分类(IPv4学习为主):

在这里插入图片描述
DE不常用
127.0.0.1表示本机地址

6.域名:比ip好记,可以把ip地址映射成域名(每个域名对应唯一的ip,每个ip了可以对应多个域名)(https协议)

7.端口号:用于标识网络上特定的某个网络服务,找对应的网络服务,其实是找对应的端口(标识符)。也就是需要的是 IP+端口

  1. 一个端口只能被一个服务监听
  2. 两个字节表示一个端口,也就是范围是0~2^16-1,即65535
  3. 0~1024已经被占用,尽量不要去使用这些端口。
  4. 常见的网络端口:ssh-22,ftp-21,smtp-25,http-80,tomcat-8080,mysql-3306,oracle-1521,sqlserver-1433

8.网络协议:数据的组织形式就是协议,他是 一种规定。我们按照这种规定实现数据的处理和恢复。

TCP/IP协议,就是一个打包和拆包的过程
在这里插入图片描述
请添加图片描述
9.TCP协议:传输控制协议

  • 使用TCP协议前,要先建立TCP连接,形成传输数据通道

  • 传输前,采用”三次握手“方式。是可靠

  • TCP协议进行通信的两个应用进程:客户端、服务端

  • 在连接中可进行大数据量的传输

  • 传输完毕,需要释放已建立的连接

  • 如何理解三次握手?:你好,你听得见吗?——听得见,你听得见吗——ok我也能听见

10.UDP协议,也属于传输层,不可靠,因为不需要建立连接,也不需要三次握手,所以传得快。例如发短信,甚至不知道这个号码是否存在。

11.InetAdress类
在这里插入图片描述
InetAdress类重写了toString方法,打印的话会打印 xx/xx,前两个返回的是InetAdress对象,后两个返回的是String

12.Socket(翻译为插口)(也翻译为套接字)

  • 在开发网络应用程序中被广泛采用,成为事实上的标准
  • 通讯的两端都要有socket,是两台机器间通信的端点
  • 网络通信其实是socket间的通信
  • socket允许程序把网络连接当成一个流,数据在两个socket间通过io流传输
  • 一般主动发起通信的是客户端,等待通信请求的为服务端
    在这里插入图片描述
    两端都可以对数据通道这个流,进行输入输出,也就是:
socket,getOutputStream()
socket.getInputStream()

13.TCP字节流编程
要求:在本机建立一个服务端和一个客户端,通过端口9999进行传输,代码如下:
服务端:

public static void main(String[] args) throws IOException {
        //首先对9999这个端口new一个服务的socket,而不是直接socket,因为可能有多个客户端连接这个端口
        //这里需要的参数是端口,因为服务端是在监听这个端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //每次需要,就用accept接收一个socket就可以(服务端socket)
        Socket socket = serverSocket.accept();
        //接下来通过这个socket接受输入流
        InputStream inputStream = socket.getInputStream();
        //以下为输入流写法,意思是每次都把字节输入到bytes这个数组里
        //有多少放多少,最多一次放1024个,然后返回这次放的个数
        //然后每放一次就打印出来,打印的时候把数组转成字符串,用的是String自带的方法
        //即把bytes数组从0到len这个范围的放到字符串
        byte[] bytes = new byte[1024];
        int len;
        while ((len = inputStream.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }
        socket.shutdownInput();
        serverSocket.close();
        socket.close();
        inputStream.close();
    }

客户端:

public static void main(String[] args) throws IOException {
        //客户端新建socket,需要的参数是指定的ip(或者InetAddress对象)和端口号
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        //客户端,通过socket建立输出流,输出到已建立的网络连接上
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello".getBytes());
        socket.shutdownOutput();
        System.out.println("传输完毕");
        outputStream.close();
        socket.close();
    }

注意:

  • 要先启动服务端,再启动客户端
  • 每次输入完了,要有一个标记,表示自己的话说完了,这样就不会存在卡住的情形。(卡住的意思是,连续的输入输出,不加标记,只会执行第一个)
socket.shutdownOutput();
socket.shutdownInput();

14.字符流使用
要用字符流,就要先用转换流,转成字符流。
然后结束的标志也要改一下,只要一个newline就可以,对面不要readline
字符流需要每次刷新,flush,才有效。

	BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
	bufferedWriter.write("你好");
	bufferedWriter.newLine();
	bufferedWriter.flush();

15.传输文件
这部分完成的是传输文件
服务端

public static void main(String[] args) throws IOException {
        //首先对9999这个端口new一个服务的socket,而不是直接socket,因为可能有多个客户端连接这个端口
        //这里需要的参数是端口,因为服务端是在监听这个端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //每次需要,就用accept接收一个socket就可以(服务端socket)
        Socket socket = serverSocket.accept();
        BufferedInputStream buf = new BufferedInputStream(socket.getInputStream());
        BufferedOutputStream bufout =  new BufferedOutputStream(new FileOutputStream("C:\\Users\\liu\\Desktop\\10.jpg"));
        int len;
        byte[] bytes = new byte[1024];
        while((len = buf.read(bytes)) != -1){
            bufout.write(bytes,0,len);
           // socket.shutdownInput();
        }
        buf.close();
        bufout.close();
        socket.close();
    }

客户端

public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("C:\\Users\\liu\\Desktop\\1.jpg");
        BufferedInputStream buf = new BufferedInputStream(inputStream);
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        BufferedOutputStream bufout = new BufferedOutputStream(socket.getOutputStream());
        int line;
        byte[] bytes = new byte[1024];
        while((line = buf.read(bytes)) != -1){
            bufout.write(bytes,0,line);
           // socket.shutdownOutput();
        }

        bufout.close();
        buf.close();
        socket.close();
    }

16.netstat指令(查看本机)

  1. netstat -an 可以查看本机网络情况,包括端口监听情况和网络连接情况(LISTENING是监听,ESTABLISHED是已经建立了连接)
  2. netstat -anb可以看出是哪个程序再监听端口
  3. netstat -an | more 可以分页显示
  4. 要求在dos下执行请添加图片描述

17.客户端的端口
当建立连接以后,客户端也会有一个端口跟服务端进行通信,但是这个是TCP/IP指定的,也就是随机的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值