编程练习生的第13天(网络编程详解)

网络编程
/*

  • IP:定义网络上的节点(电脑,手机,pad,路由器…)…区分节点

  • 分类:

  • IPV4 : 32位

  • IPV6 : 128位

  • 特点的IP:

  • 局域网内部IP:192.168.0.0~192.168.255.255

  • 127.0.0.1 : 默认本地IP

  • localhost : 本地域名

  • DNS服务器:解析IP和域名之间的关系

  • InetAddress 此类表示互联网协议 (IP) 地址。

  • static InetAddress getLocalHost() 返回本地主机。

  • static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。

  • String getHostName() 获取此 IP 地址的主机名。

  • String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。

  • 端口: InetSocketAddress
    /
    /

  • 端口port:区分软件…

  • 2个字节: 0~65535

  • 注意:

  • 1.同一的协议下端口号不能冲突

  • 2.自定义设置端口号建议设置越大越好,一般8000网上

  • 预留端口号:

  • 80: http

  • 8080:tomcat

  • 1521:Oracle

  • 3306:Mysql

  • InetSocketAddress 此类实现 IP 套接字地址(IP 地址 + 端口号)。

  • InetSocketAddress(String hostname, int port) 根据IP|域名+端口号构建
    InetAddress getAddress() 获取 InetAddress。
    String getHostName() 获取 hostname。
    int getPort() 获取端口号。
    /*

  • URL:统一资源定位符

  • 互联网三大基石: http html url

  • url的构成:

  • 协议

  • 域名

  • 端口

  • 资源

  • 数据

  • URL(String spec) 构建url
    JAVA爬虫

public class SpiderDemo04 {
 public static void main(String[] args) throws IOException {
  //定义URL-->要爬的页面地址
  URL url=new URL("https://www.dianping.com");
  //输入流   InputStream openStream()  
  BufferedReader read=new BufferedReader(new InputStreamReader(url.openStream()));
  //接收读取的数据
  String msg=null;
  while((msg=read.readLine())!=null){
   System.out.println(msg);
  }
  //关闭
  read.close();
 }
}

/*
 * 模拟浏览器爬虫
 * 
 * 写出到文件中IO-->输出流
 */
public class SpiderDemo05 {
 public static void main(String[] args) throws IOException {
  //定义URL-->要爬的页面地址
  URL url=new URL("https://www.dianping.com");
  HttpURLConnection conn=(HttpURLConnection)url.openConnection();
  //设置请求方式
  conn.setRequestMethod("GET");  //默认get
  //浏览器信息
  conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");
  //输入流 InputStream getInputStream()  
  BufferedReader read=new BufferedReader(new InputStreamReader(conn.getInputStream()));
  //接收读取的数据
  String msg=null;
  while((msg=read.readLine())!=null){
   System.out.println(msg);
  }
  //关闭
  read.close();
 }
}

面向Socket编程

  • Socket套接字: 传输层为应用层开辟的小口子,通过 Socket进行发送和接收数据
  • 不同协议下的socket实现不同
  • 面向Socket编程
  • tcp: 面向连接 打电话 安全 开销大 基于3次握手 大小没有限制 . 基于流传输
  • udp: 非面向连接 写信|发短信 只管写只管发 开销小,效率高 不安全 大小有限制 一般不超过60k , 基于字节数组传输
  • 基于udp的socket编程:
  • 发送端
  • 接收端
  • DatagramSocket 此类表示用来发送和接收
    数据报包的套接字。(定义发送端|接收端)
  • DatagramPacket数据报包(数据打包)
    • udp实现发送端的基本流程: 发送端和服务端是平等的
  • 1.定义发送端 DatagramSocket(端口号) 指定发送端的端口号
  • 2.准备数据
  • 3.对数据打包 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
    构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
    4.发送void send(DatagramPacket p)
    5.关闭 void close() 关闭此数据报套接字。
public class UDPSend01 {
 public static void main(String[] args) throws IOException {
  System.out.println("-------------发送端------------");
  //1.定义发送端     DatagramSocket(端口号) 指定发送端的端口号
  DatagramSocket send=new DatagramSocket(8888);  //发送端的端口号
  //2.准备数据
  byte[] str="呵呵呵呵呵".getBytes();
  //3.打包
  DatagramPacket packet=new DatagramPacket(str,0,str.length,new InetSocketAddress("127.0.0.1",9999));  //目的地的IP +端口
  //4.发送
  send.send(packet);
  //5.关闭
  send.close();
  
 }
}

接收端

  • 接收端基本流程:
  • 1.定义接收端 DatagramSocket(int port)
  • 2.准备字节数组
  • 3.准备包裹用来接收数据 DatagramPacket(byte[] buf, int length)
  • 4.接收
    5.从包裹中获取数据
  • byte[] getData()
    返回数据缓冲区。
    int getLength()
    返回将要发送或接收到的数据的长度。
    6.关闭
    */
 public static void main(String[] args) throws IOException {
  System.out.println("-------------接收端------------");
  //1.定义接收端    DatagramSocket(int port)   指定接收端的端口号
  DatagramSocket rec=new DatagramSocket(9999);
  //2.准备字节数组
  byte[] arr=new byte[1024*60];
  //3.打包用来接收数据
  DatagramPacket packet=new DatagramPacket(arr,0,arr.length);
  //4.接收  阻塞式
  rec.receive(packet);
  //5.处理数据
  byte[] car=packet.getData();
  System.out.println(new String(car,0,packet.getLength()));
  System.out.println(packet.getLength());
  //6.关闭
  rec.close();
 }

客户端

  • Socket 此类实现客户端套接字
  • 客户端
  • 1.定义客户端 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
  • 2.IO操作
  • 输出流OutputStream getOutputStream() 返回此套接字的输出流。
  • 3.刷出
  • 4.关闭
    */
 public static void main(String[] args) throws UnknownHostException, IOException {
  System.out.println("--------client------------");
  //1.定义客户端   Socket(String host, int port) 
  Socket socket=new Socket("localhost",9999);
  //2.输出流
  DataOutputStream out=new DataOutputStream(socket.getOutputStream());
  out.writeUTF("你好啊");
  //刷出
  out.flush();
  //关闭
  out.close();
  socket.close();
 }
}

服务器端

  • ServerSocket 此类实现服务器套接字。
  • TCP服务端
  • 1.定义服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
  • 2.阻塞式监听 一个客户端连接成功,就是一个socket
  • 3.io操作
  • 4.关闭
 public static void main(String[] args) throws IOException {
  System.out.println("--------server------------");
  //1.定义服务端    ServerSocket(int port) 
  ServerSocket server=new ServerSocket(9999);
  //2.阻塞式监听 
  Socket socket=server.accept();
  //3.获取流
  DataInputStream read=new DataInputStream(socket.getInputStream());
  //4.读取数据
  String str=read.readUTF();
  System.out.println(str);
  //5.关闭
  read.close();
  socket.close();
  server.close();
 }

TCP实现上传文件

  • TCP实现文件上传客户端 :
  • 1.定义客户端 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
  • 2.IO操作 先从文件中读入数据–>写出数据
  • new FileInputStream("");
  • 输出流OutputStream getOutputStream() 返回此套接字的输出流。
  • 3.刷出
  • 4.关闭
 public static void main(String[] args) throws UnknownHostException, IOException {
  System.out.println("--------client------------");
  //1.定义客户端   Socket(String host, int port) 
  Socket socket=new Socket("localhost",9999);
  //2.输出流
  InputStream is=new BufferedInputStream(new FileInputStream("src/haha.txt"));
  OutputStream out=new BufferedOutputStream(socket.getOutputStream());
  //准备字节数组
  byte[] arr=new byte[1024];
  int len=-1;
  while((len=is.read(arr))!=-1){
   out.write(arr, 0, len);
  }
  //刷出
  out.flush();
  //关闭
  out.close();
  is.close();
  socket.close();
 }

TCP实现上传文件服务端

  • TCP实现文件上传服务端:
  • 1.定义服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
  • 2.阻塞式监听 一个客户端连接成功,就是一个socket
  • 3.io操作 :从客户端读入数据 —>文件输出流 写出文件中
  • 4.刷出
  • 5.关闭
 public static void main(String[] args) throws IOException {
  System.out.println("--------server------------");
  //1.定义服务端    ServerSocket(int port) 
  ServerSocket server=new ServerSocket(9999);
  //2.阻塞式监听 
  Socket socket=server.accept();
  //3.获取流
  InputStream read=new BufferedInputStream(socket.getInputStream());
  OutputStream out=new BufferedOutputStream(new FileOutputStream("src/hehe.txt"));
  //4.读取数据
  byte[] arr=new byte[1024];
  int len=-1;
  while((len=read.read(arr))!=-1){
   out.write(arr, 0, len);
  }
  //5.刷出
  out.flush();
  //5.关闭
  out.close();
  read.close();
  socket.close();
  server.close();
          ·													2019.07.19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值