继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Jave Socket应用 网络编程的总结

蛛丝与马迹
关注TA
已关注
手记 8
粉丝 9
获赞 105

Java提供的网络功能有四大类:
1.InetAddress 用于标识网络上的硬件资源,定位ip地址
2.URL 统一资源定位符,通过URL可以直接读取或写入网络上的数据,可以读取或者网络上的数据

  1. Socket 使用TCP协议实现网络通信的Socket相关的类
  2. Datagram 基于UDP, 将数据保存在数据报中,通过网络进行通信

一,InetAddress 应用程序

// 获取本机的InetAddress实例
        InetAddress address = InetAddress.getLocalHost();
        System.out.println("计算名:" + address.getHostName());
        System.out.println("IP地址:" + address.getHostAddress());
        byte[] bytes = address.getAddress();// 获取字节数组形式的IP地址
        System.out.println("字节数组形式的IP:" + Arrays.toString(bytes));
        System.out.println(address);// 直接输出InetAddress对象

二,URL
如:www.cctv.com 就是一个URL。

    //创建一个URL实例
            URL imooc=new URL("http://www.baidu.com");  
            //?后面表示参数,#后面表示锚点
            URL url=new URL(imooc, "/index.html?username=tom#test"); 
            System.out.println("协议:"+url.getProtocol());// http
            System.out.println("主机:"+url.getHost());//  www.baidu.com
            //如果未指定端口号,则使用默认的端口号,此时getPort()方法返回值为-1              

也可以使用URL来获取网站的信息:

//创建一个URL实例
            URL url = new URL("http://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();

三,使用Socket的TCP协议实现通信
步骤
1,创建服务器端ServerSocket和客户端Socket
2,打开连接到Socket的输出和输入流
3,按照协议对Socket进行读写操作
4,关闭输入输出流,关闭Socket
下面是TCP的Socket通信模型
图片描述
1,Server端必须先建立倾听,等待并接收Client端的连接请求
2,接收到Cilent端的请求之后,创建并连接Socket
3,Server端和Client端创建读取流和写入流,进行数据通信。
4,双方结束通信。

下面使用一个例子来实现,多线程的Socket通信:
服务器端:

/*
 * 基于TCP协议的Socket通信,实现用户登陆
 * 服务器端
 */
public class Server {
    public static void main(String[] args) {
        try {
            //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket=new ServerSocket(8888);
            Socket socket=null;
            //记录客户端的数量
            int count=0;
            System.out.println("***服务器即将启动,等待客户端的连接***");
            //循环监听等待客户端的连接
            while(true){
                //调用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());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器端的线程处理类:

/*
 * 服务器线程处理类
 */
public class ServerThread extends Thread {
    // 和本线程相关的Socket
    Socket socket = null;
    public ServerThread(Socket socket) {
        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 {
                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) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码:

/*
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        try {
            //1.创建客户端Socket,指定服务器地址和端口
            Socket socket=new Socket("localhost", 8888);
            //2.获取输出流,向服务器端发送信息
            OutputStream os=socket.getOutputStream();//字节输出流
            PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
            pw.write("用户名:alice;密码:789");
            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();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在运行程序时,需要Server端先运行,然后Cilent端再运行。
socket.getInputStream()是用来读取(Read)对方发来的信息
socket.getOutputStream()是用来写(Write)数据,并传递给对方

四,UDP协议编程
UDP(用户数据报协议)是无连接,不可靠,无序的,这与TCP协议相反
但是在一定程度上传递速度比TCP的要快。
UDP是以数据报的形式来传递数据。
UDP编程步骤:
以数据报作为数据传输的载体。进行数据传输时,
首先需要将要传输的数据定义为数据报Datagram,在数据报中指明数据所要达到的Socket(主机地址和端口号),然后再将数据报发送出去。
DatagramPacket:表示数据报类,表示UDP通讯中的数据单元。
DatagramSocket:进行端到端通信的类。

下面使用UDP的技术方法来实现客户端与服务器端的Socket编程:

服务器端的实现步骤:
1,创建DatagramSocket,并指定端口;2,创建DatagramPacket,包含要发送的信息;3,接收客户端发送来的信息;4,读取数据

/*
 * 服务器端,实现基于UDP的用户登陆
 */
public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客户端发送的数据
         */
        //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();
    }
}

客户端实现步骤:
1,定义发送信息;2,创建DatagramPacket,包含要发送的信息;
3,创建DatagramSocket;4,发送数据;

/*
 * 客户端
 */
public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向服务器端发送数据
         */
        //1.定义服务器的地址、端口号、数据
        InetAddress address=InetAddress.getByName("localhost");
        int port=8800;
        byte[] data="用户名:admin;密码:123".getBytes();
        //2.创建数据报,包含发送的数据信息
        DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
        //3.创建DatagramSocket对象
        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();
    }
}
打开App,阅读手记
10人推荐
发表评论
随时随地看视频慕课网APP