首页 > 编程语言 >day15 Socket网络编程 & 反射

day15 Socket网络编程 & 反射

时间:2022-10-22 09:11:49浏览次数:47  
标签:Socket 编程 class day15 close new Man Class socket

day15

socket网络编程

IP地址+端口号组成socket套接字,是tcp和udp的基础

websocket,前端

socket原理机制

1)通信两端都有socket

2)网络通信其实就是socket之间的通信

3)数据在两个socket之间通过IO流传输

socket编程实现即时通信

//客户端
public class clientNode{
    public static void main(String[] args){
        int server Port = 8081;//服务端端口号(5050到9090之间一般)
        String serverIp = "127.0.0.1";//服务端IP地址
        //首先直接创建socket,端口号1~1023为系统保存,一般设在1023之外
        try{
        Socket socket = new Socket(serverIp,port);
        
        InputStreamReader reader =  new InputStreamReader(System,in);//后面,操作系统级别的输入流 
       //创建 获取键盘输入内容 的字符输入流
        BufferedReader systemIn = new BufferedReader(reader);
        //创建字符输出流,向服务端输出内容
        PrintWriter socketOut = new PrintWriter(socket.getOutStream());
             
            //创建字符输入流,接受客户输入的内容
       BufferedReder socketIn = newBufferedReader(new InputStreamReader(socket.getInputStream())) 
            
            
            
            
            
            
      
            
            while(true){
                 //输入流获取键盘输入内容
       			Stringreadline = systemIn.readLine();
            
                   //输出流向服务端发送数据
       			socketOut.println(readline);
       	 		socketOut.flush();
                
                //读取服务端返回的数据
                String serverStr = socketIn.readLine();
                System.out.println("服务端:" + serverStr);
                if(serverStr.equals("bye")){
                    break;
                }
          
            }
            systemIn.close();
            socketIn.close();
            socketOut.close();
            socket.close();
            serverSocket.close();
       
        }//try
    }
}

服务端

public class ServerNode{
    public static void main(String[] args){
        int port = 8081;
        try{
        //创建ServerSocket,监听端口8081
        ServerSocket serveSocket = new ServerSocket(port);
        //调用服务器的accept方法,接收来自客户端的连接请求,在接收到客户端连接请求之前,此方法会进行阻塞(程序会在这等待),当有申请连接时会建立连接并返回一个socket
        Socket socket = serverSocket.accept();
        //创建服务端输入流:获取系统输入的数据
        BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in)); 
        //创建客户端输入流,获取客户端传输的数据
            InputStreamReader reader = new InputStreamReader(socket.getInputStream())
            BufferedReader socketIn = new BufferedReader(reader);
        //创建输出流,用于向客户端返回数据
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream);
            
            //
            BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
            
            
        //创建输出流,用于向客户端返回数据     
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream);
            
      
        while(true){    
            
            String clientStr = socketIn.readLine();
            
            System.out.println("接收到客户端的内容:" + clientStr);
            
            if(readline.equals("bye")){
                 //服务端向客户端输出内容
           	    socketOut.println(systemIn.readLine());
            	socket.flush();
            
                break;
            }
            
           
            clientStr = socketIn.readLine();   
        }
            
            
            systemIn.close();
            socketIn.close();
            socketOut.close();
            socket.close();
            
            
            
        }
        
    }
}

反射refect

反射机制的定义

程序运行中创造任意一个类对象,了解任意一个对象所属的类,了解任意一个类的成员变量和方法,并且可以调用

反射被视为动态语言的关键

1.Class(类)

解释什么叫反射

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性, 并且能改变它的属性。

创建Class类的方式

1)类名.class

Class c1 = Man.class;

2)类的对象名.getClass()

Man m = new Man();
Class c2 = m.getClass();

3)Class.forName("完整包名");

Class c3 = Class.forName("xxx.day20.Man");

创建类对象有几种方式

1.new 2.clone 3.反序列化 4.反射的Class类的newInstance()方法

Java在将.class字节码文件载入时,JVM将产生一个java.lang.Class 对象代表该.class字节码文件,从该Class对象中可以获得类的许多基本信息,这就是反射机制

注意:

1)通过Class类的对象,可以知道他所描述的类的信息;

2)Class不是所有类的父类,Object才是(.class文件)

Class类表示的是一个类的.class文件

Class c = Man.class;//获取Man类的class文件

Man m = (Man)c.newInstance();//创建该类的对象

//使用.newInstance()方法,Man类必须有无参构造方法
Field f = c.getDeclaredField("name");
//获取类中的指定变量(包括私有变量)
syso(f.getName);
Field f = c.getField("name");//获取类中的指定变量(不包括私有)
syso(f.getName());
//获取类中所有变量返回field类型的数组
Field[] fs = c.getDeclaredFields();
foreach(){
    syso(f.getType());//getType()获取变量的数据类型
}
//根据指定方法名和指定的参数列表数据类型,获取方法对象
Method m = c.getMethod(null,null);
//getMethod(String name,Class...parameters Type)
//name 方法名
//parameters Type参数列表的数据类型
getDeclaredMethod
//获取一个类的构造方法对象
Constructor cm = c.getConstructors(null);//声明参数列表
getConstructor()

2.Field(获取变量对象)

java.lang.reflect.Field类是记录对象属性的类

可以操作类中私有,以及公有等全部属性和属性的信息

常用方法

Field f = c.getDeclaredField("name");
Field f2 = c.getDeclaredField("age");

//获得属性名称
f.getName();

//获得属性类型
f.getType()

//取得obj对象中这个属性的值,例如获取Man中的name存在张三名字
String v = (String)f2.get(Object obj)

//给obj对象中这个属性赋值
f2.set(Object obj, x )
    
//开启私有变量的访问权限
f2.setAccessible(true);

f2.setAccessible(true);//私有的变量需要开启私有变量的访问权限
f2.set(m, 12);

class

1)获取一个类的所有信息(变量、方法、构造方法)

2)创建类对象newInstance()

Field

1)访问变量或给变量赋值

Method

1)执行具体类对象的指定方法

3.Method(获取方法对象)

Class c = Man.class;
Man man = new Man();
//Method m = c.detDeclareMethod("speak",null);
//m.invoke(man,null);

Method m = c.getDeclareMethod("speak",String.class,int.class);
m.invoke(man,"add",123);

标签:Socket,编程,class,day15,close,new,Man,Class,socket
From: https://www.cnblogs.com/xiaoto9426/p/16815300.html

相关文章

  • C++并发编程实战 第二版 电子书 pdf
    作者:安东尼·威廉姆斯(AnthonyWilliams)出版社:人民邮电出版社出品方:异步图书原作名:C++ConcurrencyinAction,SecondEdition 链接:C++并发编程实战第二版 ......
  • Day15 词汇3个
    curb/kɜːb/​v.控制,抑制;勒住(马)n.控制,抑制;<美>路缘,马路牙子;(马的跗关节后部因扭伤韧带引起的)硬瘤​tocontrolorlimitsomethinginordertopreventitfromhaving......
  • 熟悉编程语言
    1、Top50Oct2022Oct2021ChangeProgrammingLanguageRatingsChange11 Python17.08%+5.81%22 C15.21%+4.05%33 Java12.84%+2.38%44......
  • 熟悉编程语言
    1、Top50Oct2022Oct2021ChangeProgrammingLanguageRatingsChange11 Python17.08%+5.81%22 C15.21%+4.05%33 Java12.84%+2.38%4......
  • 详解编程语言之发展趋势
    近十年来,互联网发生了翻天覆地的变化。新的联网方式、新的通讯方式,乃至新的支付、交易方式深刻地影响了人们的生活,在浪潮的冲击之下,传统编程语言经受住了考验,并焕发了新的......
  • JavaWeb笔记(一)Java网络编程
    本笔记转自https://www.yuque.com/qingkongxiaguang/javaweb/lmkyt6青空の霞光java网络编程在JavaSE阶段,我们学习了I/O流,既然I/O流如此强大,那么能否跨越不同的主机进......
  • 编程
    编程因为我用的是Windows,所以我记录的都是Windows的操作。目录编程0命令行1CondaJupyterLab/JupyterNotebook修改默认文件夹路径为jupyternotebook添加环境kernel......
  • Java 多线程编程之八:多线程的调度
        本博客是“Java多线程编程”系列的后续篇。“Java多线程编程”系列其他博客请参阅本博客结尾部分。    有多个线程,如何控制......
  • Java 多线程编程之一 进程与线程,并发和并行的区别:吃馒头的比喻
    进程与线程,并发和并行的区别:吃馒头的比喻 没有线程编程的程序好比一个人一只手干活,而多线程的程序就比一个人多之手干活.进程是系统资源分配的独立单位,而线程是可调度......
  • JavaME 开发体会:线程编程解决手机地图按住方向键不放地图移动问题
    JavaME开发体会:线程编程解决手机地图按住方向键不放地图移动问题初从JavaEE开发转入JavaME开发,线程编程技术越发显得重要.作者以一个真实项目中的体会,演示了线程编......