Groovy06_Groovy方法扩展与脚本调用

1. Groovy方法扩展

1. 用Socket 来引出今天的内容

server.groovy



//线程 流
def server = new ServerSocket(9999)

def isRunning = true

def sockets = []

def close(socket) {
    if (null != socket) {
        if (!socket.isClosed()) {
            socket.close()
        }
    }
}

//InputStream is
//is.text
//
//
//sockets.each {}

Thread.start {
    println("开启服务器")
    while (isRunning) {
        try {
            def socket = server.accept()
            sockets << socket
            println("新的连接:${socket.remoteSocketAddress}")
            Thread.start {
                //读取内容
                while (!socket.isClosed()) {
                    try {
                        def buffer = new byte[2048]
                        def len = socket.inputStream.read(buffer)
                        if (len > 0)
                            println "[${socket.remoteSocketAddress}]:${new String(buffer, 0, len)}"
                    } catch (ex) {
                        println "异常:${ex.getLocalizedMessage()}"
                    }
                }
                sockets.remove(socket)
                println("断开连接:${socket.remoteSocketAddress}")
            }
        } catch (ex) {
            println "异常:${ex.getLocalizedMessage()}"
        }
    }
    println("关闭服务器")
    close(server)
    sockets.each {
        close(it)
    }
}
def scanner = new Scanner(System.in)

Thread.start {
    while (isRunning) {
        def msg = scanner.nextLine()
        if (msg == 'exit') {
            isRunning = false
            close(server)
            sockets.each {
                close(it)
            }
            break
        }
        sockets*.outputStream*.write(msg.getBytes())
    }
}

client.grovvy




def client = new Socket('localhost', 9999)

Thread.start {
    while (!client.isClosed()) {
        try {
            def buffer = new byte[2048]
            def len = client.inputStream.read(buffer)
            if (len > 0)
                println "[${client.remoteSocketAddress}]:${new String(buffer, 0, len)}"
        } catch (ex) {
            println "异常:${ex.getLocalizedMessage()}"
        }
    }
}

def scanner = new Scanner(System.in)

Thread.start {
    while (!client.isClosed()) {
        def msg = scanner.nextLine()
        if (msg == 'exit') {
            isRunning = false
            client.close()
            break
        }
        client.outputStream.write(msg.getBytes())
    }
}

为什么 Thread.start?

2. Groovy方法扩展

FileExtension.grovvy

class FileExtension {
    //org.codehaus.groovy.runtime.ExtensionModule
    static File start(File self, Closure closure) {
        closure()
        return self
    }
}

包名必须为manifest.META-INF.services
文件名必须为org.codehaus.groovy.runtime.ExtensionModule

moduleName=myFile
moduleVersion=1.0
staticExtensionClasses=FileExtension

lsn6.groovy

File file = new File('D:\\Nodes\\Gradle\\Lsn_06\\1.txt')

file.start{
    println 'start'
}

然后使用命令

groovyc -d classes FileExtension.groovy

jar -cf file.jar -C classes . -C manifest/ .

再使用groovy -classpath file.jar lsn6.groovy

会输出start

3. 另外一些扩展方法的办法:MOP语言编程

2. 脚本调用

1. 用发送邮件来引出今天的内容

配置文件emial.groovy

mail{
    smtp{
        auth = true
        host = 'smtp.163.com'
        prot = 25
    }

    env{
        name = 'mybody26@163.com'
        pwd = 'lzq123456'
        toList = '396298154@qq.com'
    }
}

script.groovy

#!/usr/bin/env groovy -classpath javax.mail.jar        //linux 这样写  然后直接 在命令行./ emial.groovy
import javax.mail.Authenticator
import javax.mail.Message
import javax.mail.PasswordAuthentication
import javax.mail.Session
import javax.mail.Transport
import javax.mail.internet.MimeMessage

// 运行在服务器上 给所有相关人员发送邮件

// 可以看成一个map
//args = []
//args[0] = 'emial.groovy'
def config = new ConfigSlurper().parse(new File(args[0]).toURI().toURL())

//println  config.mail.smtp.host  // smtp.163.com

// 邮箱会话
def session = Session.getDefaultInstance(config.toProperties(),new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
//        return super.getPasswordAuthentication()
        return new PasswordAuthentication(config.mail.env.name,config.mail.env.pwd)
    }
})
session.setDebug(true)
// 邮件
def msg = new MimeMessage(session)
// 设置发件人
msg.setFrom(config.mail.env.name)
// 设置收件人
msg.setRecipients(Message.RecipientType.TO,config.mail.env.toList)

// 设置主题
msg.setSubject('ip notify')
// 设置正文
def address = InetAddress.localHost
msg.setText(address.hostName +" ip change: " + address.hostAddress)
// 发送
//Transport.send(msg)

// Linux 运行一个脚本       ./shell.sh aa a
// groovy 也能这样做,但是 linux和window 有区别
// linux 看最上面
// window :groovy -classpath javax.mail.jar script.groovy emial.groovy

上面就是 发送邮件的例子

2. 脚本调用脚本 和 groovy类调用脚本

lsn6_1_0.groovy

// 本地作用域  (相当于私有)
def name = '123'
// 绑定作用域 (相当于公有)
pwd = '456'

println binding.variables   // [args:[], pwd:456]

// 这样是都可以打印的
println name    //123
println pwd     // 456

void func(){
    println pwd         //456
    println name        // groovy.lang.MissingPropertyException: No such property: name for class: lsn6_1_0
}

//func()

// 如何进行脚本调用脚本?
// 因为我们的脚本是继承Script类,Script类里面有一个evaluate 方法
//args = []
//args[0] = 'emial.groovy'
//evaluate(new File('script.groovy'))
// 为什么? 因为evaluate 的实现源码GroovyShell shell = new GroovyShell(getClass().getClassLoader(), binding);
// 他吧 binding 传递进去了 ,binding就是保存所有绑定作用域的变量的

// 如何在groovy类调用脚本?
class Test{
    static void main(args){
        def binding = new Binding()
        binding.setVariable('args',['src/main/groovy/emial.groovy'])
        GroovyShell shell = new GroovyShell(getClass().getClassLoader(), binding)
        shell.evaluate(new File('src/main/groovy/script.groovy'))
    }
}

3. java类调用脚本

import groovy.lang.Binding;
import groovy.lang.GroovyShell;

import java.io.File;
import java.io.IOException;

public class lsn6_java {

    public static void main(String[] args) throws IOException {
        Binding binding = new Binding();
        binding.setVariable("args",new String[]{"src/main/groovy/emial.groovy"});
        GroovyShell shell = new GroovyShell(binding);
        shell.evaluate(new File("src/main/groovy/script.groovy"));

        Person person = new Zeking();
        person.dream("111");  // person object:111
    }
}

3. 注意 java 和 groovy使用的一点

lsn6_1_1.groovy

class Person{
    def dream(Object object){
        println "person object:" + object
    }
}

class Zeking extends Person{
    def dream(String str){
        println "Zeking str:" + str
    }
}

Person person = new Zeking()
person.dream('111')     // Zeking str:111
public class lsn6_java {

    public static void main(String[] args) throws IOException {
        Person person = new Zeking();
        person.dream("111");  // person object:111
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值