• JAVA学习---网络编程


    1.网络基础知识

    1.1 Internet与OSI

    ISP(因特网服务提供商)

    按照作用范围:广域网、城域网、局域网和个人区域网

    OSI:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

    1.2 IP地址与端口号

    IPv4与IPv6

    1.3 UDP与TCP

    2. Socket编程

    2.1认识socket

    套接字,用于描述IP地址和端口,在Java环境中通常是基于TCP/IP的,使用socket将TCP/IP包发送到指定IP地址。

    客户端发送数据,服务端接受数据。

    交互的5个步骤:

    1. 服务器指定监听的端口号;
    2. 客户端指定服务端的IP地址和端口号;
    3. 客户端向服务器发送请求;
    4. 服务器经过端口匹配后,接收客户端发送的请求,并给予客户端反馈;
    5. 客户端接收到服务器的反馈后,完成客户端的其他操作。

    2.2 InetAddress类

    主要用于IP的使用和相关的操作:

    序号 方法名 说明
    1 String getHostName() 返回主机名
    2 static InetAddress getLocalHost() 静态方法,返回本地主机名和IP地址
    3 String getHostAddress() 返回字符串格式的原始IP地址
    4 static InetAddress getByName(String host) 返回给主机名的IP地址
    5 static InetAddress[] getAllByName(String host) 返回给主机名的所有IP地址组成的数组
    6 boolean is Reachable(int timeout) 返回指定地址是否可达
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.Scanner;
    
    //获得服务器对应IP地址
    public class Demo12_2 {
        public static void main(String[] args) {
            Scanner sc1 = new Scanner(System.in);
            System.out.println("请输入服务器网址:");
            String adress = sc1.next();
            
            try {
                InetAddress iadressAddress = InetAddress.getByName(adress);
                System.out.println(iadressAddress);
            } catch (UnknownHostException e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
        }
    }

    请输入服务器网址:
    www.baidu.com
    www.baidu.com/183.232.231.172

    2.3基于UDP的socket程序

    不可靠的传输协议,适用于少量的数据并且要求传输速度快的情况,使用的类主要有DatagramSocket和DatagramPacket。

    序号 DatagramSocket DatagramPacket
    方法名 说明 方法名 说明
    1 DatagramSocket() 构造方法,端口自动分配 DatagramPacket(byte[] buf,intlength) 构造方法,指定存储包存储空间与长度
    2 DatagramSocket(int port) 构造方法,设置端口号 DatagramPacket(byte[] buf,int length,InetAddress addr,int port ) 构造方法,指定空间、尺度、IP地址和端口号
    3 DatagramSocket(int port,InetAddress addr) 构造方法,指定端口号及IP DatagramPacket(InetAddress addr,int port ) 构造方法,指定端口号与IP地址
    4 public void send(DatagramPacket P) 发生数据 public byte[] getData() 获取数据
    5 public void receive(DatagramPacket P) 接收数据 public int getLength() 获取接收过来的数据长度
    6 public void close() 关闭 public void setData(byte[] buf) 设置传输的数据
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;
    
    //基于UDP的socket程序_客户端
    public class Demo12_3 {
        public static void main(String[] args) {
            DatagramSocket dgs01 = null;
            try {
                dgs01 = new DatagramSocket();
                Scanner sc01 = new Scanner(System.in);
                System.out.println("请输入要发送给服务器端的数据:");
                String str01 = sc01.next();
                
                DatagramPacket dgp01 = new DatagramPacket(str01.getBytes(), str01.length(),InetAddress.getLocalHost(),8888);
                dgs01.send(dgp01);
            
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            finally {
                dgs01.close();
            }
            
        }
    }
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    //基于UDP的socket程序——服务器端
    public class Demo12_4 {
        public static void main(String[] args) {
            DatagramSocket dgs02 = null;
            try {
                dgs02 = new DatagramSocket(8888);
                System.out.println("服务器启动中:");
                byte[] buf = new byte[1024];
                DatagramPacket dgp02 = new DatagramPacket(buf, 1024);
                dgs02.receive(dgp02);
                String str02 = new String(dgp02.getData(), 0, dgp02.getLength());
                System.out.print(str02);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            finally {
                dgs02.close();
            }
        }
    
    }

    2.4基于TCP的socket程序

    可靠的传输协议,需要使用ServerSocket类和Sockeet类.

    序号 ServerScoket类(服务器端) Socket类(客户端)
    方法 说明 方法 说明
    1 ServerSocket() 构造方法 Socket(String hostName,int port) 构造方法,指定计算机名和端口号
    2 ServerSocket(int port) 构造方法,设置端口号 public int getPort() 获得端口号
    3 public Socket accept() 接收客户端的请求 public InputStream getInputStream() 获得输入流
    4 public void close()  关闭ServerSocket对象 public OutputStream getOutputStream() 获得输出流
    5     public void close() 关闭socket对象

    2.5基于TCP的多线程socket程序

    服务器端:

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    //多线程类
    public class OddThread implements Runnable{
        Socket s;
        InputStream instream;
        OutputStream outstream;
        public OddThread(Socket s) {
            // TODO Auto-generated constructor stub
            this.s = s;
        }
        public void run() {
            try {
                instream = s.getInputStream();
                outstream = s.getOutputStream();
                byte[] buf = new byte[1024];
                int len = instream.read(buf);
                String str01 = new String(buf, 0, len);
                String str02 = "";
                if(Integer.valueOf(str01) % 2 == 0) {
                    str02 = "您输入的是偶数";
                }
                else {
                    str02 = "你输入的是奇数";
                }
                outstream.write(str02.getBytes());
                outstream.flush();
                outstream.close();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            finally {
                this.close();
            }
        }
        
        //关闭流close
        public void close() {
            try {
                instream.close();
                outstream.close();
                s.close();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
        }
    }
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    //服务器端-启动服务器
    public class Demo12_5 {
        public static void main(String[] args) {
            ServerSocket ss = null;
            try {
                ss = new ServerSocket(6666);
                System.out.println("启动服务器。。。");
                
                while (true) {
                    Socket socket = ss.accept();
                    Thread t1 = new Thread(new OddThread(socket));
                    t1.start();
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            finally {
                try {
                    ss.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                    e2.printStackTrace();
                }
            }
            
        }
    }

    客户端:

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.Scanner;
    
    //客户端
    public class Demo12_6 {
        public static void main(String[] args) {
            try {
                while (true) {
                    Socket s = new Socket("127.0.0.1", 6666);
                    OutputStream outstream = s.getOutputStream();
                    InputStream inStream = s.getInputStream();
                    
                    Scanner sc01 = new Scanner(System.in);
                    System.out.println("请输入一个数:");
                    String strinput = sc01.next();
                    
                    outstream.write(strinput.getBytes());
                    outstream.flush();
                    
                    byte[] buf = new byte[1024];
                    int len = inStream.read(buf);
                    
                    String rs = new String(buf, 0, len);
                    System.out.println("反馈结果:" + rs);
                    
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            
        }
    }
  • 相关阅读:
    【译】常用网络端口号列表
    使用Simian进行重复代码检测
    使用GCOV进行代码覆盖率统计
    AFL Fuzz安装及完成一次简单的模糊测试
    数据可视化概述
    完成下方的 which_date() 函数,并返回某一起始时间后特定一段时间的日期
    linux用户不在sudoers文件中
    linux /lib64/libc.so.6: version `GLIBC_2.17′ not found
    web api 2.0 上传文件超过4M时,出现404错误
    Centos7 编译安装 Nginx Mariadb Asp.net Core2 (实测 笔记 Centos 7.7 + Openssl 1.1.1d + Mariadb 10.3.7 + Nginx 1.16.1 + Asp.net. Core 2 )
  • 原文地址:https://www.cnblogs.com/zouhq/p/10543930.html
Copyright © 2020-2023  润新知