A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dyynrahbsqt 中级黑马   /  2018-12-2 16:54  /  705 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

day11--网络编程
网络编程基础软件结构介绍
C/S结构:
        全称为Client/Server结构, 是指 客户端 和 服务器 结构
        常见程序有QQ, 迅雷等软件
B/S结构:
        全称为Browser/Server结构, 是指 浏览器 和 服务器 结构
        常见浏览器有IE, 谷歌, 火狐等
网络编程: 在一定的"协议"下, 实现两台计算机的通信的程序网络通信协议分类
UDP: User Datagram Protocol, 用户数据报协议
        特点:
                1. 无连接的不可靠协议
                2. 数据按包发送, 64K一个包
                3. 速度快效率高, 容易丢包
                 用于视频直播, 网络电话

TCP: Transmission Control Protocol, 传输控制协议
        特点:
                1. 需要建立连接的可靠协议
                2. 数据传输无大小限制
                3. 速度慢效率低
              用于文件下载, 浏览网页
        
TCP通信的三次握手: TCP协议中, 在发送数据的准备阶段, 客户端与服务器之间的三次交互, 以保证连接的可靠
        1. 客户端向服务端发送验证信息, 等待服务器确认
        2. 服务端收到验证信息后, 回复客户端验证信息, 同时发送自己的一条验证信息
        3. 客户端收到服务端回复的信息, 确认自己之前发的信息无误, 并再次向服务器发回服务端的验证信息
网络编程三要素:
        1. 通信协议
        2. IP地址
        3. 端口号
IP地址: 互联网协议地址(Internet Protocol Address). 是网络中计算机的唯一标识
        版本:
                IPv4: 192.168.1.2
                IPv6: ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
        特殊的IP地址: "127.0.0.1", "localhost", 都代表自己的电脑网络三要素: 端口号
端口号: 计算机中进程的唯一标识
        端口号的取值范围: 0~65535的整数, 其中0~1024不建议使用
注意:
        通信的两端是2个计算机中的2个程序在相互通信, 所以2个程序都要有端口号. 端口号可以相同, 也可以不同, 相互之间能识别就行TCP严格区分为 客户端(Client) 与 服务端(Server)

两端通信时步骤:
        1. 服务端程序需要先启动, 等待客户端的连接
        2. 客户端主动连接服务器端, 连接成功才能通信. 服务端不可以主动连接客户端

两端之间以 IO字节流 进行通信
一个服务端可以和多个客户端同时通信需求:
1.修改客户端代码, 在发送完文件数据后, 增加一行代码发送结束标记: socket.shutdownOutput();
重新测试程序:
public class FileUploadClient {
    public static void main(String[] args) throws IOException {
        // 创建客户端Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);
        /* 读取文件并发送给服务端 */
        // 创建文件字节输入流对象
        FileInputStream fis = new FileInputStream("d:\\小岳岳.jpg");
        // 获取网络字节输出流对象
        OutputStream os = socket.getOutputStream();
        // 一次一个字节数组, 循环读写
        byte[] bytes = new byte[1024];
        int len;
        while ((len = fis.read(bytes)) != -1) {
            // 读到的byte都通过网络输出流写出去
            os.write(bytes, 0, len);
        }
        // 关闭上传流
        socket.shutdownOutput();
        /* 上传完毕后, 接收服务端返回的结果 */
        // 获取网络字节输入流对象
        InputStream is = socket.getInputStream();
        // 循环读取
        byte[] bytes2 = new byte[1024];
        int len2;
        while ((len2 = is.read(bytes2)) != -1) {
            // 将读取到的内容转换为字符串打印
            System.out.println(new String(bytes2, 0, len2));
        }
        // 释放资源
        fis.close();  // 自己创建的本地文件流要手动关闭
        socket.close();
    }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马