网络编程

InetAddress类

  • InetAddress类主要表示IP地址,两个子类:Inet4Address、Inet6Address。
  • InetAddress 类没有提供公共的构造器,而是提供了如下几个静态方法来获取
    InetAddress实例:public static InetAddress getLocalHost()和public static InetAddress getByName(String host)。
  • InetAddress 提供了如下几个常用的方法:
    ①public String getHostAddress() :返回 IP 地址字符串。
    ②public String getHostName() :获取此 IP 地址的主机名。
    ③public boolean isReachable(int timeout):测试是否可以达到该地址。
InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress);//www.baidu.com/36.152.44.96
System.out.println(inetAddress.getHostAddress());//36.152.44.96
System.out.println(inetAddress.getHostName());//www.baidu.com
System.out.println(inetAddress.isReachable(100));//true

套接字Socket

  • 分类:
    ①流套接字(stream socket):使用TCP提供可依赖的字节流服务。
    ②数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务。
    在这里插入图片描述

TCP网络编程

  • 通信模型如下图:
    在这里插入图片描述
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
        ServerSocket serverSocket = new ServerSocket(8888);
        //让服务器一直处于监听状态。
        while (true){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Socket socket = null;
                    try {
                        //调用accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
                        socket = serverSocket.accept();
                        System.out.println("客户端连接成功");
                        //调用该Socket类对象的getOutputStream()和getInputStream():获取输出流和输入流,开始网络数据的发送和接收。
                        OutputStream outputStream = socket.getOutputStream();
                        InputStream inputStream = socket.getInputStream();
                        byte[] bytes = new byte[1024];
                        int len;
                        while ((len = inputStream.read(bytes)) != -1){
                            System.out.println(new String(bytes,0,len));
                        }
                        outputStream.write("成功接收".getBytes());
                        outputStream.flush();
                    }catch (IOException e){
                        e.printStackTrace();
                    }finally {
                        //关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
                        if(null != socket){
                            try {
                                socket.close();
                            }catch (IOException e){
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }).start();
        }
    }
}
public class TCPClient {
    public static void main(String[] args) throws IOException {
        //创建Socket:根据指定服务端的IP地址和端口号构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
        Socket socket = new Socket("192.168.56.10",8888);
        //打开连接到Socket的输入/出流:使用getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输。
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        //按照一定的协议对Socket进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线路。
        outputStream.write("你好,服务器!!!".getBytes());
        outputStream.flush();
        socket.shutdownOutput();
        byte[] bytes = new byte[1024];
        int len;
        while ((len = inputStream.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }
        //关闭Socket:断开客户端到服务器的连接,释放线路。
        socket.close();
    }
}

UDP网络编程

  • 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
  • UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  • DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
  • UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。

DatagramSocket 类

  • 常用方法:
    在这里插入图片描述

DatagramPacket 类

  • 常用方法:
    在这里插入图片描述
/**
 * (1)DatagramSocket与DatagramPacket
 * (2)建立发送端,接收端
 * (3)建立数据包
 * (4)调用Socket的发送、接收方法
 * (5)关闭Socket
 */
public class UDPSender {
    public static void main(String[] args) {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket();
            byte[] bytes = "你好,receiver".getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length, InetAddress.getByName("localhost"),8888);
            datagramSocket.send(datagramPacket);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != datagramSocket){
                datagramSocket.close();
            }
        }
    }
}
public class UDPReceiver {
    public static void main(String[] args) {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(8888);
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
            datagramSocket.receive(datagramPacket);
            System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()) + "\t" + datagramPacket.getAddress());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != datagramSocket){
                datagramSocket.close();
            }
        }
    }
}

URL编程

URL类

URL的基本结构由如下几个部分组成:< 传输协议>://< 主机名>:< 端口号>/< 文件路径>?请求参数# 片段名

  • 构造器:
    ①public URL (String spec) 通过给定的URL字符串创建URL。
    ②public URL(URL context, String spec) 使用基地址和相对URL创建。
    ③public URL(String protocol, String host, String file) 使用指定的协议、主机名、文件名创建URL,端口使用协议的默认端口。
    ④public URL(String protocol, String host, int port, String file) 通过给定的参数(协议、主机名、端口号、文件名)创建URL。

  • 常用方法:
    ①public String getProtocol( ) 获取该URL的协议名。
    ②public String getHost( ) 获取该URL的主机名。
    ③public String getPort( ) 获取该URL的端口号。
    ④public String getPath( ) 获取该URL的文件路径。
    ⑤public String getFile( ) 获取该URL的文件名。
    ⑥public String getQuery( ) 获取该URL的查询名。

URL url = new URL("http://localhost:8080/examples/myTest.txt?username=张三");
System.out.println("getProtocol() :"+url.getProtocol());//http
System.out.println("getHost() :"+url.getHost());//localhost
System.out.println("getPort() :"+url.getPort());//8080
System.out.println("getPath() :"+url.getPath());// /examples/myTest.txt
System.out.println("getFile() :"+url.getFile());// /examples/myTest.txt?username=张三
System.out.println("getQuery() :"+url.getQuery());// username=张三

URLConnection 类

表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的URLConnection对象。如果连接过程失败,将产生IOException。通过URLConnection对象获取的输入流和输出流,即可以与现有的公共网关接口程序进行交互。

try{
            URL url = new URL("http://www.baidu.com");
            URLConnection urlConnection = url.openConnection();
            HttpURLConnection connection = null;
            if(urlConnection instanceof HttpURLConnection) {
                connection = (HttpURLConnection) urlConnection;
            } else {
                System.out.println("请输入URL地址");
                return;
            }
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String urlString = "";
            String current;
            while((current = in.readLine()) != null){
                urlString += current;
            }
            System.out.println(urlString);
        }catch(IOException e){
            e.printStackTrace();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值