• Java网络编程初探


    IP地址案例

    package ch17;
    
    import javax.swing.text.Style;
    import java.net.InetAddress;
    
    /**
     * Created by Jiqing on 2017/1/5.
     */
    public class InetAddressTest {
        public static void main(String[] args) throws Exception{
            InetAddress ip = InetAddress.getByName("www.baidu.com");
            // 判断是否可达
            System.out.println("百度是否可达:"+ip.isReachable(2000));
            // 获取该实例的IP
            System.out.println(ip.getHostAddress());
            // 根据原始IP地址获取对应的InetAddress实例
            InetAddress local = InetAddress.getByAddress(new byte[]{127,0,0,1});
            System.out.println("本机是否可达:"+local.isReachable(5000));
            System.out.println(local.getCanonicalHostName());
        }
    }
    
    

    结果
    百度是否可达:true
    111.13.100.92
    本机是否可达:true
    127.0.0.1

    下载图片案例

    package ch17;
    import java.io.InputStream;
    import java.io.RandomAccessFile;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class DownUtil
    {
        // 定义下载资源的路径
        private String path;
        // 指定所下载的文件的保存位置
        private String targetFile;
        // 定义需要使用多少线程下载资源
        private int threadNum;
        // 定义下载的线程对象
        private DownThread[] threads;
        // 定义下载的文件的总大小
        private int fileSize;
    
        public DownUtil(String path, String targetFile, int threadNum)
        {
            this.path = path;
            this.threadNum = threadNum;
            // 初始化threads数组
            threads = new DownThread[threadNum];
            this.targetFile = targetFile;
        }
    
        public void download() throws Exception
        {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5 * 1000);
            conn.setRequestMethod("GET");
            conn.setRequestProperty(
                    "Accept",
                    "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
                            + "application/x-shockwave-flash, application/xaml+xml, "
                            + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
                            + "application/x-ms-application, application/vnd.ms-excel, "
                            + "application/vnd.ms-powerpoint, application/msword, */*");
            conn.setRequestProperty("Accept-Language", "zh-CN");
            conn.setRequestProperty("Charset", "UTF-8");
            conn.setRequestProperty("Connection", "Keep-Alive");
            // 得到文件大小
            fileSize = conn.getContentLength();
            conn.disconnect();
            int currentPartSize = fileSize / threadNum + 1;//这里不必一定要加1,不加1也可以
            RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
            // 设置本地文件的大小
            file.setLength(fileSize);
            file.close();
            for (int i = 0; i < threadNum; i++)
            {
                // 计算每条线程的下载的开始位置
                int startPos = i * currentPartSize;
                // 每个线程使用一个RandomAccessFile进行下载
                RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
                // 定位该线程的下载位置
                currentPart.seek(startPos);
                // 创建下载线程
                threads[i] = new DownThread(startPos, currentPartSize, currentPart);
                // 启动下载线程
                threads[i].start();
            }
        }
    
        // 获取下载的完成百分比
        public double getCompleteRate()
        {
            // 统计多条线程已经下载的总大小
            int sumSize = 0;
            for (int i = 0; i < threadNum; i++)
            {
                sumSize += threads[i].length;
            }
            // 返回已经完成的百分比
            return sumSize * 1.0 / fileSize;
        }
    
        private class DownThread extends Thread
        {
            // 当前线程的下载位置
            private int startPos;
            // 定义当前线程负责下载的文件大小
            private int currentPartSize;
            // 当前线程需要下载的文件块
            private RandomAccessFile currentPart;
            // 定义已经该线程已下载的字节数
            public int length;
    
            public DownThread(int startPos, int currentPartSize,RandomAccessFile currentPart)
            {
                this.startPos = startPos;
                this.currentPartSize = currentPartSize;
                this.currentPart = currentPart;
            }
    
            @Override
            public void run()
            {
                try
                {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                    conn.setConnectTimeout(5 * 1000);
                    conn.setRequestMethod("GET");
                    conn.setRequestProperty(
                            "Accept",
                            "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
                                    + "application/x-shockwave-flash, application/xaml+xml, "
                                    + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
                                    + "application/x-ms-application, application/vnd.ms-excel, "
                                    + "application/vnd.ms-powerpoint, application/msword, */*");
                    conn.setRequestProperty("Accept-Language", "zh-CN");
                    conn.setRequestProperty("Charset", "UTF-8");
                    InputStream inStream = conn.getInputStream();
                    // 跳过startPos个字节,表明该线程只下载自己负责哪部分文件。
                    inStream.skip(this.startPos);
                    byte[] buffer = new byte[1024];
                    int hasRead = 0;
                    // 读取网络数据,并写入本地文件
                    while (length < currentPartSize
                            && (hasRead = inStream.read(buffer)) != -1)
                    {
                        currentPart.write(buffer, 0, hasRead);
                        // 累计该线程下载的总大小
                        length += hasRead;
                    }
                    currentPart.close();
                    inStream.close();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    package ch17;
    import java.net.*;
    
    /**
     * Created by Jiqing on 2017/1/5.
     */
    public class MultiThreadDown {
        public static void main(String[] args) throws Exception{
            // 初始化DownUtil对象
            final DownUtil downUtil = new DownUtil("http://imgs.aixifan.com/live/1482830873793/1482830873793.jpg","demo.jpg",4);
            // 开始下载
            downUtil.download();
            new Thread(() -> {
               while(downUtil.getCompleteRate() < 1) {
                   // 每隔0.01秒查询一次任务完成进度
                   System.out.println("已完成:"+ downUtil.getCompleteRate());
                   try {
                       Thread.sleep(10);
                   }catch (Exception ex) {}
               }
            }).start();
        }
    }
    
    

    结果:

    已完成:0.0
    已完成:0.04389803969303463
    已完成:0.09210067667384099
    已完成:0.16440463214505055
    已完成:0.39150257003269945
    已完成:0.7543834411326956
    已完成:0.9892219080763762

    socket案例

    服务端

    package ch17;
    
    import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
    
    import java.io.IOException;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * Created by Jiqing on 2017/1/6.
     */
    public class Server {
        public static void main(String[] args) throws IOException{
            // 创建一个ServerSocket
            ServerSocket ss = new ServerSocket(10000);
            // 采用循环不断地接收来自客户端的请求
            while(true) {
                // 每当客户端Socket请求时,服务器端也产生一个socket
                Socket s = ss.accept();
                PrintStream ps = new PrintStream(s.getOutputStream());
                ps.println("服务器的新年祝福!");
                ps.close();
                s.close();
            }
        }
    }
    
    

    客户端

    package ch17;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    /**
     * Created by Jiqing on 2017/1/6.
     */
    public class Client {
        public static void main(String[] args) throws IOException{
            Socket socket = new Socket("127.0.0.1",10000);
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = br.readLine();
            System.out.println("来自服务器的数据:"+line);
            br.close();
            socket.close();
        }
    }
    
    

    通过ip+端口号进行数据传输。先运行服务器端,再运行客户端。

    结果:
    来自服务器的数据:服务器的新年祝福!

  • 相关阅读:
    Android学习—Shape
    Android学习—Application的作用
    用户管理
    DPKG命令与软件安装、APT
    Linux学习笔记
    C如何使用内存
    九九乘法表.py
    超市买苹果.py
    第一个程序python.py
    JavaScript一些备忘知识
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/6254559.html
Copyright © 2020-2023  润新知