java中的网络编程-创新互联

网络编程
网络编程 : 实现了PC和PC之间的数据传输;
网络编程的三要素
IP地址 : IP地址能定位到PC(电脑) [收件人的地址]
端口号 : 找到PC中的通讯软件[收件人姓名和联系方式]
网络协议 : 决定不同的运输数据的方式 [快递公司]   //UDP和TCP

//寄快递 
收件人的地址 : 寻找收件人所在的地方
收件人姓名和联系方式 : 定位收件人
快递公司 : 负责快递运输 [不同的快递公司送快递的方式也不一样]
IP地址
如何查看自己计算机的IP地址 : 
	win + r + cmd ->ipconfig
//192.168.31.210        
IPV4 : 简化版的IP地址 , 32位表示IP地址; //4个字节表示一个IPV4地址 [点分十进制法]
IPV6 : 精准版的IP地址 , 64位表示IP地址; //[冒分16进制表示]  

Java中的InetAddress这个类表示IP地址对象;
	获取IP地址对象 : 
		static InetAddress getByName(String host)  
        //String host : 主机名 / 主机IP地址
        static InetAddress[] getAllByName(String host)      
        //String host : 主机名 / 主机IP地址  
        static InetAddress getLocalHost() : 快速获取当前主机的IP地址对象
     
    IP地址对象的功能 :
		String getHostName()  : 获取IP地址对象封装的主机名
        String getHostAddress()  : 获取IP地址对象封装的IP地址  
//示例
    public static void main(String[] args) throws UnknownHostException {//本机
        InetAddress localHost = InetAddress.getLocalHost();
        String hostName = localHost.getHostName();//本机主机名
        String hostAddress = localHost.getHostAddress();//本机ip地址
        System.out.println("hostName = " + hostName);
        System.out.println("hostAddress = " + hostAddress);
        //其他
        InetAddress byName1 = InetAddress.getByName("192.168.0.101");//目标ip地址
        System.out.println("byName1 = " + byName1);
    }
端口号
端口号 : 找到PC中的通讯软件[收件人姓名和联系方式]
    
端口号注意 :
	1. 范围 : [0,65535]
	2. 端口号不能重复 
    3. [0-1000]范围内的端口号不要用(大概率被占用) //MySQL : 3306  TOMCAT : 8080/80   
网络协议
网络协议 : 决定不同的运输数据的方式 [快递公司]
    UDP : 面向无连接的网络协议
    TCP : 面向连接的网络协议
UDP网络协议
UDP网络协议 : 面向无连接的网络协议 
    两台通讯的设备[通讯软件]不需要建立管道,数据以 "丢包" 形式传递数据; 
		丢过去的数据包的大小 大64K
    特点 : 村口的大喇叭 [只管发不管接]       

[外链图片转存中…(img-1eqFTaQG-1672118794309)]

创新互联-专业网站定制、快速模板网站建设、高性价比嘉荫网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式嘉荫网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖嘉荫地区。费用合理售后完善,十年实体公司更值得信赖。UDP协议的发送端
UDP协议的发送端 : DatagramSocket  [套接字 : Socket] ->网络编程也叫套接字编程
    
发送端UDP对象如何创建 :
	DatagramSocket() 
        
打包数据 : 要发送的数据打包到数据报包中 [DatagramPacket]    
    
如何创建发送端数据报包对象 :
	DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 
        //byte[] buf, int offset, int length 你要发送的数据
        //InetAddress address : 收件人的IP地址对象
        //int port : 端口号
        
发送数据的方法 : DatagramSocket类中        
     void send(DatagramPacket p)  
    
UDP协议的发送端的编写步骤 :
	1. 创建UDP发送端的对象
    2. 打包数据
    3. 发送数据
    4. 关闭资源 //选做   
//示例1
    public static void main(String[] args) throws IOException {int PortNumber=10086;//设置端口号
        String MessageToSend="开炮";//数据内容
        String DestinationIp="192.168.13.58";//目标ip地址
        InetAddress DestinationIpAddress = InetAddress.getByName(DestinationIp);//目标ip地址
        InetAddress LocalIPAddress = InetAddress.getLocalHost();//本机ip地址
        //发送数据
        new DatagramSocket().send(new DatagramPacket(MessageToSend.getBytes(),0,
                MessageToSend.getBytes().length, DestinationIpAddress, PortNumber));
    }
//示例2 : UDP向飞秋发消息
    public static void main(String[] args) throws IOException {String MessageToSend="java";//要发送的消息
            int PortNumber=2425;//端口号(飞秋固定端口)
            String DestinationIpAddress="192.168.13.25";//目标IP地址
            String MyName="java";//用户名
            String LocalIPAddress="66.66.66.66";//自定义本机IP地址
            byte[] bys=getMessage(MyName,LocalIPAddress,MessageToSend).getBytes("GBK");
            new DatagramSocket().send(new DatagramPacket(bys,0, bys.length, InetAddress.getByName(DestinationIpAddress), PortNumber));
        }
        public static String getMessage(String myname,String ip,String line){return new StringBuilder().append("1:").append(System.currentTimeMillis()).append(":").append(myname).append(":")
                    .append(ip+":").append("32:").append(line).toString();
        }
UDP协议的接收端
UDP协议的接收端 : DatagramSocket
    
接收端UDP对象如何创建 :
	DatagramSocket(int port) 
        
接收数据的方法 : DatagramSocket类中       
	void receive(DatagramPacket p)
    
接收端数据报包对象的创建构造 :
	DatagramPacket(byte[] buf, int offset, int length) 
        
拆数据包 :
	InetAddress getAddress()  : 获取发件人的IP地址信息
    int getLength() : 获取真实数据的长度   
        
    
UDP协议的接收端的编写步骤 :  
	1. 创建接收端的对象
    2. 接收数据
    3. 拆数据
    4. 关闭资源 //选做   
//示例
    public static void main(String[] args) throws IOException {int PortNumber=10086;//设置端口号
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, 0, bys.length);
        //接收数据
        new DatagramSocket(PortNumber).receive(dp);
        //拆数据
        InetAddress iAddress = dp.getAddress();//发件人的IP地址对象
        System.out.println("发件人的主机名 = " + iAddress.getHostName());
        System.out.println("发件人的IP地址 = " + iAddress.getHostAddress());
        System.out.println("发件人发送的消息 = " +  new String(bys, 0, dp.getLength()));
    }
TCP网络协议
TCP网络协议 : 面向连接的网络协议 
    PC与PC进行通讯时,要建立管道,数据在管道内使用通讯的流对象进行数据传输!
    
	建立连接时经历 三次握手 
    断开连接时经历 四次挥手

[外链图片转存中…(img-NBJk62G4-1672118794311)]

TCP协议的客户端
TCP协议的客户端 : Socket
    客户端构造方法 :
		Socket(InetAddress address, int port) : 确认服务器的IP地址和端口号 进行客户端对象创建
            
    获取通讯的流对象 : //输出流
		OutputStream getOutputStream()  
            
通讯步骤 :
	1. 创建客户端TCP对象
    2. 获取客户端获取通讯输出流对象
    3. 通过流对象进行数据传递   
    4. 关闭客户端 //选做   
//示例
    public static void main(String[] args) throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(), 10086);
        OutputStream os = socket.getOutputStream();
        os.write("你好,我是小钱!".getBytes());
        os.close();
    }
TCP协议的服务器
TCP协议的服务器 : ServerSocket
    服务器构造方法 :
		ServerSocket(int port) 
            
    监听向服务器发来的信息
        Socket accept() : 侦听并接受到此套接字的连接。 
            
   //在TCP协议中获取通讯流对象的类都是Socket    
    获取通讯的流对象 : //输入流   
		Socket 类中 : InputStream getInputStream()
            
通讯步骤 :
	1. 创建服务器TCP对象
    2. 监听
    3. 通过监听获取到的Socket对象获取通讯的输入流对象
    4. 接收数据
    5. 关闭服务器 //不要做   
//示例
    public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10086);
        Socket accept = ss.accept();
        InputStream is = accept.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String line = new String(bys, 0, len);
        System.out.println("客户端发过来的消息 = " + line);
        InetAddress inetAddress = accept.getInetAddress();
        System.out.println("客户端的IP地址 = " + inetAddress);
        //ss.close();
    }
综合案例
//文件上传
//客户端
     public static void main(String[] args) throws IOException {int PortNumber=10010;//设置端口号
        String FileReaderPath="E:\\img\\ot\\mkojnhygtfcde.webp";//文件路径
        InetAddress LocalHost = InetAddress.getLocalHost();//本机IP地址
        InetAddress DestinationIpAddress = InetAddress.getByName("192.168.13.58");//目标ip地址
        //创建客户端的类
        Socket socket = new Socket(DestinationIpAddress, PortNumber);
        //socket对象获取流对象 [通讯的流对象]
        OutputStream os = socket.getOutputStream();
        //从本地硬盘中读取文件内容发送给服务器 ->本地的输入流对象
        File file = new File(FileReaderPath);
        FileInputStream fis = new FileInputStream(file);
        //获取文件名
        String fileName = file.getName();
        //先发一次文件名
        os.write(fileName.getBytes());
        byte[] bytes = new byte[1024];
        int len;
        //循环读
        while ((len = fis.read(bytes)) != -1) {//把数据发送给服务器
            os.write(bytes, 0, len);
        }
        //当客户端发送完数据需要告知服务器数据发送完毕
        //把通讯的输出流对象给关闭
        socket.shutdownOutput();
        //获取服务器的回显信息
        InputStream is = socket.getInputStream();
        byte[] bys = new byte[1024];
        int count = is.read(bys);
        //把数据转换成字符串
        String back = new String(bys, 0, count);
        System.out.println("服务器回显 : " + back);
        //关闭客户端
        //socket.close();
        fis.close();
    }
}
//服务端
    public class TcpServePlus {public static void main(String[] args) throws IOException {String FileWriterPath = "E:\\img";//接收文件的文件夹
            //创建线程池对象
            ExecutorService threadPool = Executors.newFixedThreadPool(50);
            //创建服务器的通讯对象
            ServerSocket ss = new ServerSocket(10010);
            while (true) {//监听并且获取Socket对象
                Socket accept = ss.accept();
                //获取通讯的输入流
                InputStream is = accept.getInputStream();
                //服务器先接收一次文件名
                byte[] bytes = new byte[1024];
                int count = is.read(bytes);
                String fileName = new String(bytes, 0, count);
                threadPool.submit(new Runnable() {@Override
                    public void run() {try {InetAddress inetAddress = accept.getInetAddress();
                            System.out.println("发件人是 : " + inetAddress);
                            //在服务器中创建本地的输出流对象
                            //FileOutputStream fos = new FileOutputStream(FileWriterPath + "\\" + System.currentTimeMillis() +".java");
                            //FileOutputStream fos = new FileOutputStream(FileWriterPath + "\\" + UUID.randomUUID() +".java");
                            FileOutputStream fos = new FileOutputStream(FileWriterPath + "\\" + fileName);
                            byte[] bys = new byte[1024];
                            int len;
                            //客户端循环发送,服务器循环接收
                            while ((len = is.read(bys)) != -1) {//服务器读到了数据
                                //把数据存储到服务器硬盘
                                fos.write(bys, 0, len);
                            }
                            //服务器回显
                            OutputStream os = accept.getOutputStream();
                            os.write("服务器已经收到信息!".getBytes());
                            //关闭资源
                            //ss.close();
                            fos.close();
                            System.out.println("上传成功 !");
                            System.out.println("----------------------------");
                        } catch (Exception e) {InetAddress inetAddress = accept.getInetAddress();
                            System.out.println("发件人是 : " + inetAddress);
                            System.out.println("传输出现问题!");
                            System.out.println("----------------------------");
                        }
                    }
                });
            }
        }
    }

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:java中的网络编程-创新互联
文章路径:http://abwzjs.com/article/coesoh.html