网络编程
**核心:**socket.getInputStream();
socket.getOutputStream();
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”
服务器端 Server
//开启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();//不推荐
}
客户端 Client
//创建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=“登陆失败”;
客户端 网络对象读入流