网络编程

网络编程

概念

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

java.net 包中提供了两种常见的网络协议的支持:

  • TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
  • UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

网络编程三要素

在这里插入图片描述

ip

IP地址是指分配给用户上网使用的网际协议的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类,但是也有其他不常用的小分类。

协议

在这里插入图片描述

每次进过不同层时,都会添加该层的标示以及遵守不同层的协议。

端口

端口: 2个字节 65536个 0-65536之间

* 虚拟的概念

* 0-1024之间的端口是系统保留端口

* 22 21

* 3306 8521 8080 80

Socket编程

套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

  • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。

  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。

  • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。

  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

InetAddress类

这个类表示互联网协议(IP)地址。

常用方法

  • static InetAddress getByAddress(byte[] addr):在给定原始 IP 地址的情况下,返回 InetAddress 对象。

  • static InetAddress getByAddress(String host, byte[] addr):根据提供的主机名和 IP 地址创建 InetAddress。

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

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

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

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

  • String toString():将此 IP 地址转换为 String。

代码案列

public static void main(String[] args)throws UnknownHostException {  
        //获取一个主机对象  
        InetAddress in=InetAddress.getLocalHost();  
  
        //使用对象的方法  
        System.out.println("获取ip地址:"+in.getHostAddress());  
        System.out.println("主机名称:"+in.getHostName());  
        byte[] buf=in.getAddress();  
        System.out.println(Arrays.toString(buf));  
  
        //获取对象的方法  
        InetAddress[] ips=InetAddress.getAllByName("www.baidu.com");  
        for(InetAddress ip:ips){  
            System.out.println(ip.getHostAddress()+"=="+ip.getHostName());  
        }  
    }  

TCP

在这里插入图片描述

tcp:
1: 客户端和服务器开启是有先后顺序的 
先启动服务器 然后启动客户端 
安全的 
2:socket对象: 
1: 客户端称之为socket对象 
2:服务器称之为serversocket对象 
3:客户端在创建时需要指定ip以及端口 
4:服务器创建时需要指定监听端口 
5:数据的收发都是通过流完成的 所有数据信息都可以通过socket获取输入/输出流 
getInputStream/getOutputStream 
6: 对于服务器而言,获取客户端的socket对象 accept方法 (阻塞方法) 
3:套路: 
client: 
//创建socket对象(ip,端口) 
//获取流对象(你要干嘛?) 
//发送/接受数据信息 
//关闭 
server: 
//创建serversocket对象(端口) 
//通过accept方法获取客户端socket对象 
//获取流对象(你要干嘛?) 
//发送/接受数据信息 
//关闭 

ServerSocket类

构造方法
  • public ServerSocket(int port) throws IOException
    创建绑定到特定端口的服务器套接字。

  • public ServerSocket(int port, int backlog) throws IOException
    利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。

  • public ServerSocket(int port, int backlog, InetAddress address) throws IOException
    使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

  • public ServerSocket() throws IOException
    创建非绑定服务器套接字。

常用方法
  • public int getLocalPort()
    返回此套接字在其上侦听的端口。

  • public Socket accept() throws IOException

    ​ 侦听并接受到此套接字的连接。

  • public void setSoTimeout(int timeout)
    通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。

  • public void bind(SocketAddress host, int backlog)
    将 ServerSocket 绑定到特定地址(IP 地址和端口号)

Socket类

  • public InetAddress getInetAddress()
    返回套接字连接的地址。

  • public int getPort()
    返回此套接字连接到的远程端口。

  • public int getLocalPort()
    返回此套接字绑定到的本地端口。

  • public SocketAddress getRemoteSocketAddress()
    返回此套接字连接的端点的地址,如果未连接则返回 null。

  • public InputStream getInputStream() throws IOException
    返回此套接字的输入流。

  • public OutputStream getOutputStream() throws IOException
    返回此套接字的输出流。

代码实例

客户端

public class ClinetA {  
    public static void main(String[] args)throws IOException {  
        //1.创建客户端Socket对象  
        Socket client=new Socket(InetAddress.getLocalHost(),10001);  
        //2.创建流对象 发送数据信息  
        OutputStream os=client.getOutputStream();  
        //3.写出数据到服务端  
        os.write("嘿嘿".getBytes());  
        //4.关闭资源  
        os.close();  
        client.close();  
    }  
}  

服务端

public class ServerA {  
    public static void main(String[] args)throws IOException {  
        //1.创建ServerSocket对象  
        ServerSocket server=new ServerSocket(10001);//监听该接口  
        //2.通过accept方法获取连接的socket对象  
        Socket client=server.accept();//阻塞方法  
        //3.获取客户端发送的数据信息  
        InputStream is=client.getInputStream();  
        //4.读取数据信息  
        byte[] buf=new byte[1024];  
        int len=is.read(buf);  
        //5.分析数据  
        System.out.println(new String(buf,0,len));  
        //6.关闭资源  
        is.close();  
        client.close();  
    }  
}  

UDP

UDP发送信息: 
基于发送方和接受方 都是通过DatagrameSocket对象去指定 
1: 启动发送方不会报错 
不安全 

接受方

public class Rec {  
    public static void main(String[] args)throws IOException {  
        //1.创建接收方对象  
        DatagramSocket rec=new DatagramSocket(10001);  
  
        //2.创建接受数据包对象  
        byte[] buf=new byte[1024];  
        DatagramPacket dp=new DatagramPacket(buf,buf.length);  
  
        //3.接受发送方发送的数据信息  
        rec.receive(dp);//会将数据信息填充在DatagramPacket对象中 阻塞方法  
  
        //4.分析数据  
        InetAddress in=dp.getAddress();  
        byte[] recBuf=dp.getData();  
        int length=dp.getLength();  
        int port=dp.getPort();  
        String data=new String(recBuf,0,length);  
        System.out.println(in.getHostName()+"=="+data+"=="+port);  
    }  
  
}  

发送方

public class Send {  
    public static void main(String[] args)throws IOException {  
        //1.创建发送方对象  
        DatagramSocket send=new DatagramSocket(9999);  
  
        //2.构建发送方的数据包对象,buf发送数据的字节数组 length发送数据的长度 发送到那个ip去 port发送到那个端口  
        String str="laoyue已上线";  
        byte[] buf=str.getBytes();  
        int len=buf.length;  
        InetAddress ip=InetAddress.getLocalHost();  
        int port=10001;//接受方的端口  
        DatagramPacket dp=new DatagramPacket(buf,len,ip,port);  
  
        //3.发送信息  
        send.send(dp);  
  
        //4.关闭  
        send.close();  
    }  
}  

URL与URLConnection

URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址。表示为互联网上的资源,如网页或者FTP地址。URL可以分为如下几个部分:

protocol://host:port/path?query#fragment

protocol(协议)可以是 HTTP、HTTPS、FTP 和 File,port 为端口号,path为文件路径及文件名。

URL 解析:

  • 协议为(protocol):http

  • 主机为(host:port):www.runoob.com

  • 端口号为(port): 80 ,以上URL实例并未指定端口,因为 HTTP 协议默认的端口号为 80。

  • 文件路径为(path):/index.html

  • 请求参数(query):language=cn

  • 定位位置(fragment):j2se,定位到网页中 id 属性为 j2se 的 HTML 元素位置 。

public static void main(String[] args)throws MalformedURLException {  
       URL url = new URL("https://www.sina.com.cn/");  
         
       //获取协议的默认端口号  
       System.out.println(url.getDefaultPort());  
  
       //获取URL的主机  
       System.out.println(url.getHost());  
         
       //获取URL的协议  
       System.out.println(url.getProtocol());  
         
       //很重要    https://192.168.1.1/login?uname=zhangsan&pwd=123  
       String path=url.getPath();  
       System.out.println("获取资源路径:"+path);//域名后  ?前的内容称之为资源路径  
       String param=url.getQuery();  
       System.out.println("获取请求参数:"+param);//资源路径?后面的所有内容都是当前请求发送的参数  
   }  
 public class Test06 {  
    public static void main(String[] args)throws IOException {  
        //创建URL对象  
        URL url=new URL("https://www.sina.com.cn/");  
          
        //通过资源对象获取到连接该资源的链接对象  
        URLConnection conn=url.openConnection();  
          
        //打开链接  
        conn.connect();//建立连接  
          
        //获取用来建立连接的时间  
        System.out.println(conn.getConnectTimeout());  
          
        //获取头部 content-type 字段值  
        System.out.println(conn.getContentType());  
          
        //获取头部 content-length字段值  
        System.out.println(conn.getContentLength());  
          
        //获取日期  
        System.out.println(conn.getDate());  
  
        //读取  
        BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));  
  
        StringBuilder sb=new StringBuilder();  
        String str="";  
        while ((str=reader.readLine())!=null) {  
            sb.append(str);  
            sb.append("\r\n");  
        }  
        System.out.println(sb.toString());  
          
    }  
}  

der reader=new BufferedReader(new InputStreamReader(conn.getInputStream(),“UTF-8”));

    StringBuilder sb=new StringBuilder();  
    String str="";  
    while ((str=reader.readLine())!=null) {  
        sb.append(str);  
        sb.append("\r\n");  
    }  
    System.out.println(sb.toString());  
      
}  

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值