JavaSE_网络编程

1.IP地址封装类InetAddress类

这个类封装了网络IP的相关信息。

  • 获取本机的网络信息
//  获取本机的网络地址(主机名称 + IP地址)
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("主机名称:" + localHost.getHostName());
System.out.println("IP地址:" + localHost.getHostAddress());
  • 按照主机名获取网络地址
//  获取京东的网络地址(按照主机名称)
InetAddress jdHost = InetAddress.getByName("www.jd.com");
System.out.println("京东主机名称:" + jdHost.getHostName());
System.out.println("京东主机IP: " + jdHost.getHostAddress());
  • 按照主机名获取多个网络地址
System.out.println("淘宝的所有网络地址:");
InetAddress[] taobaoHostArray = InetAddress.getAllByName("www.taobao.com");
for (InetAddress taobaoHost : taobaoHostArray) {
    System.out.println(taobaoHost.getHostName());
    System.out.println(taobaoHost.getHostAddress());
    System.out.println("--------------");
}
  • 后期如果出现端口冲突怎么办?
    打开命令提示符。
    1.查看所有端口:netstat -ano
    2.查看指定端口:netstat -aon|findstr"8080"
    3.查看指定进程:tasklist|findstr"8080"
    4.查看具体进程:使用任务管理器超看PID

2.TCP协议

TCP协议客户端和服务端是不平等的,通过IO流的方式进行网络数据的传输。
1.相关类:

  • ServerSocket类
    网络服务端。
  • Socket类
    网络客户端。

2.服务端代码实现:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

//  服务器端代码
public class Demo01 {
    public static void main(String[] args) {
        System.out.println("我是服务器!");
        //  创建服务器对象并监听端口号8888
        //  通过accept方法获取获取访问的客户端
        //通过访问的客户端获取客户端输出的信息
        //  通过客户端向客户端发送反馈信息
        try (Scanner sc = new Scanner(System.in);
                ServerSocket sever = new ServerSocket(8888);
                Socket socket = sever.accept();
                InputStream in = socket.getInputStream();
                OutputStream out = socket.getOutputStream()){           
            while(true) {
                //接收的信息
                byte[] data = new byte[1024];
                int len = in.read(data);
                System.out.println("客户端回应了:" + new String(data,0,len));
                
                //回馈的信息
                System.out.println("服务端说:");
                String str = sc.next();
                out.write(str.getBytes());
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.客户端代码实现:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

//  客户端代码
public class Demo02 {
    public static void main(String[] args) {
        System.out.println("我是客户端!");
        //  创建客户端对象向192.168.104.155主机下的8888端口发送信息
        //  向服务端发送消息
        //  获取服务端消息
        try (Scanner sc = new Scanner(System.in);
                Socket socket = new Socket("192.168.104.155",8888);
                OutputStream out = socket.getOutputStream();
                InputStream in = socket.getInputStream()){
            
            while(true) {
                //  发送消息处理
                System.out.println("客户端说:");
                String str = sc.next();
                out.write(str.getBytes());
                out.flush();
                //  获取消息处理
                byte[] data = new byte[1024];
                int len = in.read(data);
                System.out.println("服务端回应了:" + new String(data,0,len));
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.UDP协议

UDP协议客户端和服务端是平等的DatagramSocket对象既可以接收数据又可以发送数据,通过DatagramPacket对象的方式进行网络数据的传输。
1.相关类:

  • DatagramSocket类
    用于接收和发送网络数据。
  • DatagramPacket类
    用于封装数据的数据包。

2.发送端代码实现:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 *  UDP发送端
 *
 */
public class Demo03 {
    public static void main(String[] args) {
        //  创建UDP下的数据发送
        try (DatagramSocket socket = new DatagramSocket()){
            //发送的数据
            byte[] data = "天王盖地虎".getBytes();
            //  创建DatagramPacket数据包,向本机的8888端口发送数据。
            DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(),8888);
            //  使用socket发送数据。
            socket.send(packet);
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.接收端代码实现:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 *  UDP接收端
 *
 */
public class Demo04 {
    public static void main(String[] args) {
        //  创建接收端用于接收数据
        try (DatagramSocket socket = new DatagramSocket(8888)){
            while(true) {
                //  1.创建空的DatagramPacket数据包
                byte[] data = new byte[1024];
                DatagramPacket packet = new DatagramPacket(data, data.length);
                
                //  2.接收信息
                //  DatagramSocket将接收到的信息,存入DatagramPack数据包中
                socket.receive(packet);
                
                //  3.获取数据包中的数据
                //  3.1 获取数据包中的数据部分
                data = new byte[1024];
                data = packet.getData();
                //  3.2获取数据包中的数据字节长度
                int len = packet.getLength();
                //  3.3获取数据包中的发送端信息。
                InetAddress inetAddress = packet.getAddress();
                
                System.out.println(new String(data,0,len));
                System.out.println(inetAddress.getHostName());
                System.out.println(inetAddress.getHostAddress());
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.使用Java进行网络爬虫。

  • 关于URL类
import java.net.MalformedURLException;
import java.net.URL;

/**
 * URL统一资源管理器。(不会验证网站的准确其实内部仅仅只是使用正则表达式)
 * 1、协议
 * 2、域名、计算机
 * 3、端口、默认80
 * 4、请求资源。
 */
public class URLTest {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://www.bilibili.com:80/video/av30023103/?p=237#3");
        System.out.println("协议-->\t"+url.getProtocol());
        System.out.println("端口-->\t"+url.getPort());
        System.out.println("域名|IP-->\t"+url.getHost());
        System.out.println("请求资源1-->\t"+url.getPath());
        System.out.println("请求资源2-->\t"+url.getFile());
        System.out.println("参数-->\t"+url.getQuery());
        System.out.println("锚点-->\t"+url.getRef());
    }
}
  • 将豆瓣网中的一个图片下载到当前电脑的一个文件中。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Demo05 {
    public static void main(String[] args) {
        //  声明输入输出流
        BufferedOutputStream out = null;
        BufferedInputStream in = null;
        try {
            //  图片地址
            String str = "https://img3.doubanio.com/view/subject/s/public/s33659613.jpg";
            //  创建URL对象
            URL url = new URL(str);
            //  通过url对象获取获取HttpURLConnection对象
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            //  创建输出流向文件中写入数据
            out = new BufferedOutputStream(new FileOutputStream("C:\\Users\\10417\\Desktop\\douban.jpg"));
            //  创建输入流从网页读取数据
            in = new BufferedInputStream(conn.getInputStream());
            //  读取操作
            byte[] data = new byte[1024];
            int len = -1;
            while((len = in.read(data)) != -1) {
                out.write(data, 0, len);
            }
            
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //  关闭
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            try {
                //  关闭
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342