CS应用程序:在双端开发过程中 实现信息在客户端和服务器端之间传输
网络编程三要素:
1.协议:
UDP协议:无连接通信协议 不会去判断对方是否在线 不建立真正的逻辑连接
缺点:安全性低 数据完整性低
优点:消耗资源少 传输效率高 用于 音频 视频 电话电视会议
TCP/IP协议:安全性高 传输数据更完整
三次握手机制:保证对方在线 建立真正连接
第一次握手:客户端向服务器端发送请求
第二次握手:服务器端回写信息给客户端
第三次握手:客户端向服务器端发送请求
以上流程正常完成 创建真正的连接(Socket对象)
2.IP地址:
确定服务器所在互联网中的网络地址
IPv4:一个32位的二进制数 分为四个字节 其中每个字节都是0-255之间的十进制整数 组合后有42亿个标识
IPv6:采用128位地址长度 每16个字节一组 分为8组十六进制 多到类似于全世界的沙子的数量
3.端口号:
各个服务在电脑中的标识 范围0-65535 自定义一般大于1024 例如 9999 8765
案例:用户输入用户名 服务器验证 是“Lily” 则返回客户端 “欢迎你 Lily”
//开启main方法 //设置服务的端口号 ServerSocket ss = new ServerSocket(9890); System.out.println("开启服务"); //服务器端如何知道客户端发送了请求 一直监听9890这个端口号 while(true) { //监听端口号 获取客户端使用的Socket对象 Socket socket = ss.accept(); //所有发送过来的信息 都在socket对象中 获取网络读入流 InputStream is = socket.getInputStream(); byte[] b = new byte[1024]; int l = 0; String name = ""; while((l=is.read(b))!=-1) { name +=new String(b,0,l); } System.out.println(name); //准备回写信息 String message = ""; if(name.equals("Lily")) { message = "欢迎你Lily"; }else { message = "不 你不是Lily"; } //使用网络写出流对象 写出信息 OutputStream os = socket.getOutputStream(); os.write(message.getBytes()); //关闭写出流 socket.shutdownOutput();//不推荐 }
//创建Socket对象 定义要访问的电脑上的服务 Socket socket = new Socket("localhost",9890); System.out.println("请输入姓名"); String name = input.next(); //获取网络写出流对象 OutputStream os = socket.getOutputStream(); os.write(name.getBytes()); //关闭写出流 socket.shutdownOutput();//不推荐 //获取网络读入流对象 InputStream is = socket.getInputStream(); byte[] b = new byte[1024]; int l =0; String message=""; while((l=is.read(b))!=-1) { message += new String(b,0,l); } System.out.println(message);
案例:用户输入用户名 密码 服务器验证是不是张三 123
练习:上传图片
客户端 本地读入流
客户端 网络写出流
服务器端 网络读入流
服务器端 本地写出流
服务器端 网络写出流
客户端 网络读入流
注册练习:
客户端 网络对象写出流 写出User
服务器端 本地对象读入流 读入本机ArrayList au 判断用户名是否存在
不存在
服务器端 网络对象写出流 写出ResponseMessage String message=“注册失败 用户名已存在”;
客户端 网络对象读入流
存在
服务器端 本地对象写出流 将更新后的新集合 写出
服务器端 网络对象写出流 写出ResponseMessage String message=“注册成功”;
客户端 网络对象读入流
登录练习:
客户端网络对象写出流 User
服务器端网络对象读入流+本地对象读入流
存在
服务器端 网络对象写出流 写出ResponseMessage String message=“登录成功”;
客户端 网络对象读入流
不存在
服务器端 网络对象写出流 写出ResponseMessage String message=“登陆失败”;
客户端 网络对象读入流