【Java高级特性】java学习之旅36-网络编程

网络通信协议:

  1. 应用层:
  • HTTP:超文本传输协议
  • FTP:文本传输协议
  • SMTP: 邮件发送协议
  • POP: 邮件接收协议
  1. 传输层:

TCP:传输控制协议(三次握手)
UDP: 用户数据包协议

  1. 网络层
  • IP: 网络协议
  1. 数据链路层
  2. 物理层

IP:

  1. 网络地址:唯一标识网络上的每一台计算机
  2. 地址组成:32位,由4个8位二进制数组成。
  3. 本地ip的表现形式:
  1. 127.0.0.1
  2. localhost
  3. 局域网ip(可以使用ipconfig指令查询)
  4. 广域网ip(百度直接搜索ip)
  1. 常用的指令:
  1. ipconfig: 查看本机所有网络的配置
  2. ping: 可以测试网络是否通畅,可以查看域名映射的ip

DNS:

  1. Domain Name System, 域名解析系统
  2. DNS是一个分布式服务器系统,实现了域名和ip地址的隐射
  3. 我们请求域名(www.baidu.com),会先进行DNS的解析,得到ip地址后,继续请求ip地址对应的主机。

java.net包下的类

1. URL类:

url:统一资源定位符,例如:http://www.longge.vip//study/javacore.avi;

分析:协议://域名(ip)/资源路径/资源名

  1. 构造方法
URL url = new URL("http://www.longge.vip/study.java");
System.out.println(url);
  1. encode(),将网站中的中文字符加密
String encodeStr = URLEncoder.encode("http://www.longge.vip/study","utf-8");
  1. 将网址中的乱码解码 decode();
String decoderStr = URLDecoder.decode(emcoderStr,"utd-8")
  1. 查看本机的ip
InetAddress localHost = InetAddress.getLocalHost();
  1. 查看域名映射的ip
InetAddress ip1 = InetAddress.getByName("www.baidu.com");
  1. 查看域名映射的所有ip
InetAddress[] ips = InetAddress.getAllByName("www.taovao.com");
  1. 通过ip地址创建对象
InetAddress ip2 = InetAddress.getByAddress(new byte[] {(byte)192, (byte)168, 1, (byte)172});

实现网络编程:

  • TCP + Socket实现网络编程
  • UDP + Socket实现网络编程
TCPUDP
面向连接的面向非连接
是安全的是不安全的
比较慢比较快
适合传输大文件适合传输小文件

注意:
输出流关闭造成的Socket关闭

  1. 再客户端或者服务端通过socket.shutdownOutput()都是单项关闭的,即关闭客户端的输出流并不会关闭服务端的输出流,所以是一种单方向的关闭流
  2. 通过socket.shutdownOutput()关闭输出流,但socket任然是连接状态,连接并未关闭
  3. 如果直接关闭输入流或者输出流,即:in.close()或者out.close().会直接关闭socket

TCP + Socket 网络编程:

//TCP client
private static Scanner sc = new Scanner(System.in);

public stataic void main(Stringp[[ args) throes Exception{
    
    //1. 创建Socket对象,指定主机地址和端口号
    Socket client = new Socket("localhost" , 1904);
    System.out.println("客户端启动完毕!");
    
    //2.创建一个输出流用于发送数据给主机
    DataOuputStream dos = new DataOutputStream(client.getOutputStream());
    
    //3.发送数据
    dos.writeUTF(sc.next());
    
    //4. 创建一个输入流用于接收服务器发送的数据
    DataInputStream  dis = new DataInputStream(client.getInputStream());
    
    //5.接收服务器发送的请求
    String message = dis.readUTF();
    System.out.println(message);
}
//TCP server

//1.创建ServerSocket对象,指定端口号
ServerSocket server = new ServerSocket(1904);
System.out.println("服务器启动完毕");

//2. 监听客户端请求
Socket client = server.accept();
System.out.println("服务器监听到客户端连接!")

//3. 创建输入流用于接收客户端发送的数据
DataInputStream dis = new DataInputStream(client.getInputStream());

//4. 获取客户端发送的数据
String message = dis,readUTF();
System.out.println(message);

//5.创建输出流用于发送消息到客户端
DataOutputStream dos = new DataOutputStream(client.getOutputStream());

//6. 发送数据
dos.writeUTF("你好,我是服务器");

//7.关闭资源
dos.close();
dis.close();
client.close();
server.close();

UDP + Socket 实现网络编程:

//client1
public static void main(String[] args) throws IOException{
    
    //1. 创建DatagramSocket对象,指定端口号
    DatagramSocket client1 = new DatagramSocket(6666);
    
    //2. 创建DatagramPaclet对象,用于包装数据
    String message = "hello, 我是客户端1";
    DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName("localhost"), 8888);
    
    //3. 发送打包好的数据
    client1.send(packet);
    
    //4. 关闭资源
    client1.close();
}
//client2
public static void main(String[] args) throws Exception{
    //1. 创建DatagramSocket对象
    DatagramSocket client2 = new DatagramSocket(8888);
    
    //2. 接收客户端1发来的请求
    byte[] buf = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buf, buf.length);
    client2.receive(packet);
    
    //3. 查看接收到的数据
    byte[] data =  packet.getData();
    System.out.println(new String(data);
    
    //关闭资源
    client2.close();
}

作业:
实现控制台群聊功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值