Java Socket应用---通信是这样练成的

时间:2024-01-09 21:14:38

网络基础简介

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

Java 中网络相关 API 的应用    

  • Java 中的 InetAddress 的应用  

Java Socket应用---通信是这样练成的

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 Socket应用---通信是这样练成的

  • Java中的URL的应用  

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

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());
    }

}

运行结果为:

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

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 编程

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

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(服务端) )

Java Socket应用---通信是这样练成的

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

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

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)

Java Socket应用---通信是这样练成的

第二步:运行(Client.java)

Java Socket应用---通信是这样练成的

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

Java Socket应用---通信是这样练成的

通过 Socket 实现 UDP 编程

  • UDP编程

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

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

  

相关操作类

  DatagramPacket:表示数据

  DatagramSocket:进行端到端通信的类

Java Socket应用---通信是这样练成的

Java Socket应用---通信是这样练成的

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)

Java Socket应用---通信是这样练成的

第二步:执行(UDPServer.java)

Java Socket应用---通信是这样练成的

第三步:

Java Socket应用---通信是这样练成的