网络基础简介

Java 中网络相关 API 的应用    

  • Java 中的 InetAddress 的应用  

Test01.java

package com.imooc;

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;

public class Test01 {

    /**
     * InetAddress
     **/
    public static void main(String[] args) throws Exception {
        // 获取本机的InetAddress实例
        InetAddress address=InetAddress.getLocalHost();
        System.out.print("计算机名:"+address.getHostName());
        System.out.println("/IP地址:"+address.getHostAddress());
        System.out.println("********************************************");
        //获取字节数组形式的IP地址
        byte[] bytes=address.getAddress();
        System.out.println("字节数组形式的IP:"+Arrays.toString(bytes));
        //直接输出InetAddress对象
        System.out.println(address);
        System.out.println("********************************************");
        //根据机器名获取InetAddress实例
        InetAddress address2=InetAddress.getByName("PC-mashuangying");
        System.out.print("计算机名:"+address2.getHostName());
        System.out.println("/IP地址:"+address2.getHostAddress());
        System.out.println("********************************************");
        InetAddress address3=InetAddress.getByName("192.168.1.103");
        System.out.print("计算机名:"+address2.getHostName());
        System.out.println("/IP地址:"+address2.getHostAddress());
        System.out.println("********************************************");
    }

}

运行结果为:

  • Java中的URL的应用  

Test02.java

package com.imooc;

import java.net.URL;

public class Test02 {

    /**
     * @URL
     */
    public static void main(String[] args) throws Exception{
        // 创建一个URL的实例
        URL imooc=new URL("http://www.imooc.com");
        URL url=new URL(imooc,"index.html?username=tom#test");//?后面表示参数#后面表示
        System.out.println("协议:"+url.getProtocol());
        System.out.println("主机:"+url.getHost());
        //如果未指定端口号,则使用默认的端口号,此时getPort()方法返回值为-1
        System.out.println("端口:"+url.getPort());
        System.out.println("文件路径:"+url.getPath());
        System.out.println("文件名:"+url.getFile());
        System.out.println("相对路径:"+url.getRef());
        System.out.println("查询字符串:"+url.getQuery());
    }

}

运行结果为:

Test03.java

package com.imooc;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class Test03 {

    /**
     * @使用URL读取页面内容
     */
    public static void main(String[] args) throws Exception{
        // 创建一个URL实例
        URL url=new URL("https://www.baidu.com");
        //通过URL的openStream方法获取URL对象所表示的资源的字节输入流
        InputStream is=url.openStream();
        //将字节输入流转换为字符输入流
        InputStreamReader isr=new InputStreamReader(is,"UTF-8");
        BufferedReader br=new BufferedReader(isr);
        //为字符输入流添加缓冲
        String data=br.readLine();//读取数据
        while (data!=null) {//循环读取数据
            System.out.println(data);//输出数据
            data=br.readLine();
        }
        br.close();
        isr.close();
        is.close();
    }

}

运行结果为:

<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class="head_wrapper"> <div class="s_form"> <div class="s_form_wrapper"> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class="fm"> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class="s_ipt" value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class="mnav">新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class="mnav">hao123</a> <a href=http://map.baidu.com name=tj_trmap class="mnav">地图</a> <a href=http://v.baidu.com name=tj_trvideo class="mnav">视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class="mnav">贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class="lb">登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class="bri" style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class="cp-feedback">意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

  通过 Socket 实现 TCP 编程

Server.java(服务端)

package com.imooc;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/* *基于TCP协议的Socket通信,实现用户登录
 *服务器端
 * */
public class Server {
    public static void main(String []args) throws Exception{
        //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
        ServerSocket serverSocket=new ServerSocket(8888);
        System.out.println("***服务器即将启动,等待客户端的连接***");
        //2.调用accept()方法开始监听,等待客户端的连接
        Socket socket=    serverSocket.accept();
        //3.获取输入流,并读取客户端信息
        InputStream is=socket.getInputStream();//字节输入流
        InputStreamReader isr=new InputStreamReader(is);//将字节流转换为字符流
        BufferedReader br=new BufferedReader(isr);//为输入流添加缓冲
        String info=null;
        while ((info=br.readLine())!=null) {//循环读取客户端的信息
            System.out.println("我是服务器,客户端说:"+info);
        }
        socket.shutdownInput();//关闭输入流
        //4.获取输出流,响应客户端的请求
        OutputStream os=socket.getOutputStream();
        PrintWriter pw=new PrintWriter(os);//包装为打印流
        pw.write("欢迎您!");
        pw.flush();//调用flush()方法将缓冲输出
        //5.关闭资源
        pw.close();
        os.close();
        br.close();
        is.close();
        isr.close();
        socket.close();
        serverSocket.close();

    }
}

Client.java(客户端)

package com.imooc;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/*
 * 客户端
 */
public class Client {
    public static void main(String []args) throws Exception{
        //1.创建客户端Socket,指定服务器地址和端口
        Socket socket=new Socket("localhost",8888);
        //获取输出流,向服务器端发送信息
        OutputStream os=socket.getOutputStream();//字节输出流
        PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
        pw.write("用户名:admin;密码:123");
        pw.flush();
        socket.shutdownOutput();//关闭输出流
        //3.获取输入流,并读取服务端的响应信息
        InputStream is=socket.getInputStream();
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        String info=null;
        while ((info=br.readLine())!=null) {
            System.out.println("我是客户端,服务器说:"+info);
        }
        //4.关闭资源
        br.close();
        is.close();
        os.close();
        pw.close();
        socket.close();
    }
}

运行结果为:

第一步:先执行(Server.java(服务端) )

第二步:执行(Client.java(客户端))

Server.java

package com.imooc;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/* *基于TCP协议的Socket通信,实现用户登录
 *服务器端
 * */
public class Server {
    public static void main(String []args) throws Exception{
        //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
        ServerSocket serverSocket=new ServerSocket(8888);
        Socket socket=null;
        int count=0;
        System.out.println("***服务器即将启动,等待客户端的连接***");
        //循环监听等待客户端的连接
        while (true) {
        //2.调用accept()方法开始监听,等待客户端的连接
         socket=serverSocket.accept();
         //创建一个新的线程
         ServerThread serverThread=new ServerThread(socket);
         //启动线程
         serverThread.start();
         count++;
         System.out.println("客户端的数量:"+count);//统计客户端的数量
         InetAddress address=socket.getInetAddress();
         System.out.println("当前客户端的IP:"+address.getHostAddress());
        }
    }
}

Client.java

package com.imooc;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/*
 * 客户端
 */
public class Client {
    public static void main(String []args) throws Exception{
        //1.创建客户端Socket,指定服务器地址和端口
        Socket socket=new Socket("localhost",8888);
        //获取输出流,向服务器端发送信息
        OutputStream os=socket.getOutputStream();//字节输出流
        PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
        //pw.write("用户名:admin;密码:123");
        pw.write("用户名:tom;密码:133");
        pw.flush();
        socket.shutdownOutput();//关闭输出流
        //3.获取输入流,并读取服务端的响应信息
        InputStream is=socket.getInputStream();
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        String info=null;
        while ((info=br.readLine())!=null) {
            System.out.println("我是客户端,服务器说:"+info);
        }
        //4.关闭资源
        br.close();
        is.close();
        os.close();
        pw.close();
        socket.close();
    }
}

ServerThread.java

package com.imooc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * 服务器线程处理类
 */
public class ServerThread extends Thread {
    Socket socket=null;

    public ServerThread(Socket socket) {
        super();
        this.socket = socket;
    }

//线程执行的操作,响应客户端的请求
    public void run() {
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        try {
            //获取输入流,并读取客户端信息
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            String info = null;
            while ((info = br.readLine()) != null) {// 循环读取客户端的信息
                System.out.println("我是服务器,客户端说:" + info);
            }
            socket.shutdownInput();// 关闭输入流
            //获取输出流,响应客户端的请求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎您!");
            pw.flush();// 调用flush()方法将缓冲输出
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                // 5.关闭资源
                if (pw!=null) {
                    pw.close();
                }
                if (os!=null) {
                    os.close();
                }
                if (br!=null) {
                    br.close();

                }
                if (isr!=null) {
                    isr.close();
                }
                if (is!=null) {
                    is.close();
                }
                if (socket!=null) {
                    socket.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

运行结果为:

第一步:运行(Server.java)

第二步:运行(Client.java)

第三步:服务器接收客户端的请求

通过 Socket 实现 UDP 编程

  • UDP编程

  1.UDP协议(用户数据报协议)是无链接、不可靠的、无序的

  2.UDP协议以数据报作为数据传输的载体

  

相关操作类

  DatagramPacket:表示数据

  DatagramSocket:进行端到端通信的类

UDPServer.java

package com.imooc;
/*
 * UDP服务端
 */
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServer {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        /*
         * 接收客户端发送的数据
         */
        // 1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket=new DatagramSocket(8800);
        //2.创建数据报,用于接收客户端发送的数据
        byte[] data=new byte[1024];//创建字节数组,指定接收的数据包的大小
        DatagramPacket packet=new DatagramPacket(data, data.length);
        //3.接收客户端发送的数据
        System.out.println("***服务器端已经启动,等待客户端发送数据***");
        socket.receive(packet);//此方法在接收到数据报之前会一阻塞
        //4.读取数据
        String info=new String (data,0,packet.getLength());
        System.out.println("我是服务器,客户端说:"+info);

        /*
         * 客户端响应数据
         */
        //1.定义客户端的地址,端口号、数据
        InetAddress address=packet.getAddress();
        int port=packet.getPort();
        byte[] data2="欢迎您!".getBytes();
        //2.创建数据报,包含响应的数据信息
        DatagramPacket packet2=new DatagramPacket(data2, data2.length,address,port);
        //3.响应客户端
        socket.send(packet2);
        //4.关闭资源信息
        socket.close();

    }

}

UDPClient.java

package com.imooc;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;

public class UDPClient {

    /**
     * 向服务器端发送数据
     **/
    public static void main(String[] args) throws Exception{
        // 1.定义服务器的地址,端口号,数据
        InetAddress address=InetAddress.getByName("localhost");
        int port=8800;
        byte[] data="用户名:admin;密码:123".getBytes();
        //2.创建数据报,包含发送的数据信息
        DatagramPacket packet=new DatagramPacket(data, data.length,address,port);
        //创建DatagramPacket对象
        DatagramSocket socket=new DatagramSocket();
        //4.向服务器端发送数据报
        socket.send(packet);

        /*
         * 接收服务器端响应的数据
         * */
        //1.创建数据报,用户接收服务器端响应的数据
        byte[] data2=new byte[1024];
        DatagramPacket packet2=new DatagramPacket(data2, data2.length);
        //2.接收服务器响应的数据
        socket.receive(packet2);
        //3.读取数据
        String reply=new String(data2,0,packet2.getLength());
        System.out.println("我是客户端,服务器说:"+reply);
        //4.关闭资源
        socket.close();

    }

}

运行结果为:

第一步:执行(UDPServer.java)

第二步:执行(UDPServer.java)

第三步:

Java Socket应用---通信是这样练成的的更多相关文章

  1. Java Socket编程----通信是这样炼成的

    Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...

  2. 慕课网_Java Socket应用---通信是这样练成的

    第1章 网络基础知识 1-1 网络基础简介 (10:21) 第2章 Java 中网络相关 API 的应用 2-1 Java 中的 InetAddress 的应用 (08:10) import java ...

  3. java socket报文通信(一)socket的建立

    java socket报文通信(一) socket的建立  今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Contro ...

  4. java socket线程通信

    关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server ...

  5. java socket报文通信(三)java对象和xml格式文件的相互转换

    前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...

  6. java socket报文通信(一) socket的建立

    TCP是Transfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间 ...

  7. java socket报文通信(二)报文的封装

    昨天我们谈了怎么建立socket通信的服务端和客户端,今天我们就来谈一谈怎么封装报文. 什么是报文这里我就不在阐述了,不清楚的朋友可以自己去查资料.我们今天要谈的报文主要友以下几个部分组成: 3位同步 ...

  8. Java Socket编程基础篇

    原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...

  9. JAVA通信系列一:Java Socket技术总结

    本文是学习java Socket整理的资料,供参考. 1       Socket通信原理 1.1     ISO七层模型 1.2     TCP/IP五层模型 应用层相当于OSI中的会话层,表示层, ...

随机推荐

  1. SQL AlawaysOn 之一:安装域控制器

    一.准备阶段 1.  计算机名称命名 2.IP地址修改.DNS修改 IP地址和DNS不一定要和图上的一致,只要固定就行了 二.安装阶段 1.服务器管理器,仪表盘,点击“添加角色和功能” 2.添加角色和 ...

  2. 面向对象编程思想(前传)--你必须知道的javascript

    在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...

  3. Tomcat 优化和性能监测

    1. JVM 优化(Tomcat 启动行参数) Linux 修改 catalin.sh Windows 修改 catalin.bat   Linux系统中tomcat的启动参数 export JAVA ...

  4. trigger和triggerhandler的区别

    1. trigger会触发默认行为2. trigger会触发所有元素的模拟事件,而triggerHandler只触发一次3. trigger可以链式操作,triggerHandler不能4. trig ...

  5. java设计模式之桥接模式

    桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的 ...

  6. 浅谈C10K问题

    在大型的APP中进行高并发的访问,淘宝,支付宝,微信,QQ,等 C10K问题:高并发的进行访问 C10K问题的最大特点是:设计不够良好的程序,其性能和连接数及机器性能的关系往往 是非线性的.举个例子: ...

  7. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  8. poptest老李谈数据结构中深度优先和广度优先

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  9. poj 3070 Fibonacci (矩阵快速幂乘/模板)

    题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring& ...

  10. SpringBoot-SpringMvc的Interceptor拦截器配置

    Interceptor拦截器实现对每一个用户请求处理前后的业务处理,比如我们需要对用户请求进行响应时间的记录,需要记录请求从开始到结束所耗的时间,这时我们就需要用到拦截器了 下面我们以记录请求处理时间 ...