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
}
}