Java基础_18 | Java中网络通信程序的设计(url爬虫,TCP/UDP socket程序,socket文件传输程序)

1. Java中的网络通信程序包

Java提供网络通信功能的包是java.net包,提供的网络功能有三大类:

  • URL是三大功能中最高级的一种,通过URL Java程序可以直接送出或读入网络上的数据;
  • Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道;
  • Datagram是更低级的网络传输方式,它把数据的目的记录在数据包中,然后直接放在网络上;

本文主要讲述前两种包的使用。

2. URL爬虫

创建URL类对象要使用java.net包中提供的java.net.URL类的构造方法:

然后调用该对象的openConnection()方法就会返回一个对应URL地址的URLConnection对象,

在建立URLConnection类对象的同时就已经在本级和URL节点之上建立了一条HTTP通道,之后:

  • 可以使用 getInputStream()方法获得URL节点的信息;
  • 可以使用getOutputStream()方法向URL节点处传送信息;

示例代码:

import java.io.IOException;
import java.net.*;
import java.io.*;

public class URLtest {
    public static void main(String[] args) {
        String picture_url = "http://mculover666.cn/image/20190814/NQqt1eRxrl1K.png";

        try {
            // 创建URL对象
            URL pUrl = new URL(picture_url);
            //创建URL
            URLConnection pcUrl = pUrl.openConnection();

            //创建数据流
            InputStream in = pcUrl.getInputStream();
            FileOutputStream fout = new FileOutputStream("E://logo.png");

            //拉取/写入数据
            int temp;

            while((temp = in.read()) != -1) {
                fout.write(temp);
            }

            //关闭流
            in.close();
            fout.close();
        }
        catch (Exception e) {
            System.out.println("发生异常啦!");
        }
        finally {
            System.out.println("Finish!");
        }
    }
}

爬取到图片:

3. Socket程序(TCP)

以下Socket程序都是指基于TCP通信的Socket。

Socket通信分为服务器端和客户端,在Java中,基于TCP协议实现网络通信的类有两个:在
客户端的Socket类和在服务器端的ServerSocket类。

两者通信建立过程如下:

  • ① 服务器端生成一个ServerSocket类的实例对象,随时监听客户端的连接请求;
  • ② 客户端生成一个Socket类的实例对象,并发出连接请求;
  • ③ 服务器端通过accept()方法接收到客户端的请求后,开辟一个接口与之进行连接,并生成所需的I/O数据流;
  • ④ 通信都是通过一对InputStream()OutputStream()进行的;
  • ⑤ 通信结束后,两端分别close()对应的Socket接口;

服务端示例代码如下:

import java.net.*;
import java.io.*;

public class ServerSocketDemo {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            System.out.println("listening on port: 8000...");
            serverSocket = new ServerSocket(8000);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 8000.");
            System.exit(1);
        }

        Socket clientSocket = null;

        try {
            clientSocket = serverSocket.accept();
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        String fromUser;
        int strlen;

        while (true) {
            fromUser= in.readLine();
            strlen=fromUser.length();
            out.println("received string's length is: "+ strlen);
            System.out.println("Server: received string's length is: "+ strlen);
            if(fromUser.equalsIgnoreCase("Bye"))
                break;
        }

        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

客户端示例代码如下:

import java.io.*;
import java.net.*;

public class ClientSocketDemo {
    public static void main(String[] args) throws IOException {

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            echoSocket = new Socket("127.0.0.1", 8000);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                    echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for "
                    + "the connection to: taranis.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(
                new InputStreamReader(System.in));
        String userInput;

        while (true){
            userInput = stdIn.readLine();
            out.println(userInput);
            System.out.println("echo: " + in.readLine());

            if(userInput.equalsIgnoreCase("Bye"))
                break;
        }

        out.close();
        in.close();
        stdIn.close();
        echoSocket.close();
    }
}

首先运行服务端:

然后运行客户端并发送数据:

可以看到收到了服务器回应,再来看看服务端的输出:

4. Socket文件传输示例程序

server端代码:

import java.net.*;
import java.io.*;

public class FileServerSocketDemo {
    public static void main(String[] args) {
        try {
            ServerSocket SS = new ServerSocket(8000);
            System.out.println("listening on port 8000...");

            //阻塞等待客户端连接
            Socket socket = SS.accept();
            System.out.println("client connected!");

            //创建数据流
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            FileOutputStream fo = new FileOutputStream("E://test.txt");
            int temp;
            while ((temp = dis.readInt()) != -1) {
                fo.write(temp);
            }

            //关闭流
            dis.close();
            fo.close();
            socket.close();
            SS.close();
            
        } catch (IOException e) {
            System.out.println("发生异常啦!");
        } finally {
            System.out.println("Finish!");
        }
    }
}

客户端代码:

import java.io.*;
import java.net.*;

public class FileClientSocketDemo {
    public static void main(String[] args) {
        try{
            //创建socket并连接服务器
            Socket socket=new Socket("127.0.0.1",8000);

            //创建数据流
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            FileInputStream fi = new FileInputStream("E://sendtest.txt");

            //传输文件
            int temp;
            while((temp=fi.read()) !=-1)
                dos.writeInt(temp);

            //关闭流和socket
            dos.close();
            fi.close();
            socket.close();
        }
        catch(IOException e){
            System.out.println("发生异常啦!");
        }
        finally{
            System.out.println ("Finish!");
        }
    }
}

运行结果如下:


接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

发布了216 篇原创文章 · 获赞 575 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/104378150