网络编程
网络编程
实际上
底层数据的传输
基础知识分类
IP : 定位互联网中的节点
端口 : 区分不同软件
URL : 同一资源定位符
传输层协议
什么是协议
合同,标准,要求,规范
UDP
相当于写信,邮包裹,协议简单,开销小,效率高 只管写只管邮 不安全 大小有限制 一般不超过60k
TCP
相当于打电话 , 基于连接 ,三次握手,四次挥手 效率低,安全 没有大小限制
基础知识
IP
1.定位一个节点(电脑,服务器,手机,路由器....)
2.分为:ipv4 ipv6
3.特殊的IP:
192.168.0.0~192.168.255.255 : 非注册IP ,供组织内部使用的
127.0.0.1 本地IP
localhost : 本地域名
4.DNS解析器 : 域名与IP解析
5.java.net网络包
InetAddress : 此类表示Internet协议(IP)地址。
端口
1.区分不同软件
2.端口2个字节大小 0~65535
3.统一协议下端口号不能冲突
4.8000以内预留端口号
5.常见端口号
80 : http
8080 : tomcat
3306 : mysql
1521 : oracle
InetSocketAddress : 此类实现IP套接字地址(IP地址+端口号)
URL
1.统一资源定位符,指向万维网上的“资源”的指针。
2.互联网的三大基石 : URL,HTTP,HTML
3.组成
协议 : http
域名 : www.baidu.com
端口号 : 80
资源 : index.html?username=zhangsan&password=1234#a
UDP
概念
1.UDP : 相当于写信,邮包裹,协议简单,开销小,效率高 只管写只管邮 不安全 大小有限制 一般不超过60k
2.Socket 套接字
传输层为引用层开辟的一个小口子
面向Socket编程
3.UDP协议下数据传输
以字节数组为单位
两端是平等的
4.net包下提供了2个类型 :
DatagramSocket : 此类表示用于发送和接收数据报包的套接字。
DatagramPacket : 该类表示数据报包。
5.udp协议实现基本流程 : 见下
发送端
1.定义我是发送端
2.准备数据
3.打包
4.发送包裹
5.关闭
接收端
1.定义我是接收端
2.准备包裹,用来接收数据
3.接收数据
4.处理数据
5.关闭
TCP
tcp相关知识
相当于写信,面向连接,效率低,安全,没有大小限制
基于IO流进行数据传输
客户端与服务器
tcp相关类
Socket : 该类实现客户端套接字。也称“套接字”
ServerSocket : 该类实现服务器套接字。
tcp协议实现基本流程
客户端
1.定义我是客户端
Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
2.准备数据
3.IO流 : 获取输出流,向服务器发送数据
4.刷出
5.关闭
服务器
1.定义我是服务器
2.阻塞式监听
Socket accept() 侦听对此套接字的连接并接受它
3.IO流 : 获取输入流,读取客户端发送的数据
4.处理数据
tcp协议实现单向登录
客户端
服务器
tcp协议实现双向登录
客户端多加的操作
服务器多加和改动的操作
tcp协议实现多客户端登录
循环实现 : 但是多个客户端之间需要排队登录
多线程实现 : 多客户端同时登录,服务器可以同时对多个客户端做响应提供服务。
public static void main(String[] args) throws IOException {
System.out.println("------------我是服务端-------------");
//1.定义我是服务器
ServerSocket server = new ServerSocket(8989);
//重复监听多个客户端并提供服务
boolean flag = true;
while(flag){
//2.阻塞式监听
Socket client = server.accept();
System.out.println("-----------一个客户端连接成功---------------");
new Thread(new Channel(client)).start();
}
server.close();
}
static class Channel implements Runnable{
private Socket client = null;
private DataInputStream is = null;
private DataOutputStream os = null;
public Channel(Socket client) {
this.client = client;
try {
is = new DataInputStream(client.getInputStream());
os = new DataOutputStream(client.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
//读入
public String read(){
String msg = null;
try {
msg = is.readUTF();
} catch (IOException e) {
e.printStackTrace();
}
return msg;
}
//写出
public void write(String msg){
try {
os.writeUTF(msg);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭
public void close(){
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(client!=null){
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
//3.IO流 : 获取输入流,读取客户端发送的数据
String msg = read();
//4.处理数据
String uname = "";
String upwd = "";
String[] arr = msg.split("&");
for(String str:arr){
String[] arr2 = str.split("=");
if("username".equals(arr2[0])){
uname = arr2[1];
}else if("password".equals(arr2[0])){
upwd = arr2[1];
}
}
//5.IO操作,获取输出流,结果响应 给服务器
if("admin".equals(uname) && "1234".equals(upwd)){
write("登录成功");
}else{
write("登录失败");
}
//关闭
close();
}
}