|  | 
  
    
      
	            Groovy/FAQ/Сокеты
	Материал из Wiki.crossplatform.ru[править]  Introduction //----------------------------------------------------------------------------------
myClient = new Socket("Machine name", portNumber)
 
myAddress = myClient.inetAddress
myAddress.hostAddress  // string representation of host address
myAddress.hostName     // host name
myAddress.address      // IP address as array of bytes
//----------------------------------------------------------------------------------[править]  Writing a TCP Client //----------------------------------------------------------------------------------
s = new Socket("localhost", 5000);
 
s << "Why don't you call me anymore?\n"
s.close()
//----------------------------------------------------------------------------------[править]  Writing a TCP Server //----------------------------------------------------------------------------------
// commandline socket server echoing input back to originator
groovy -l 5000 -e "println line"
 
// commandline socket server eching input to stderr
groovy -l 5000 -e "System.err.println line"
 
// a web server as a script (extension to cookbook)
 server = new ServerSocket(5000)
 
 while(true) {
     server.accept() { socket ->
         socket.withStreams { input, output ->
 
             // ignore input and just serve dummy content
             output.withWriter { writer ->
                 writer << "HTTP/1.1 200 OK\n"
                 writer << "Content-Type: text/html\n\n"
 
                 writer << "<html><body>Hello World! It's ${new Date()}</body></html>\n"
             }
         }
 
     }
 }
//----------------------------------------------------------------------------------[править]  Communicating over TCP //----------------------------------------------------------------------------------
server = new ServerSocket(5000)
 
while(true) {
    server.accept() { socket ->
        socket.withStreams { input, output ->
 
            w = new PrintWriter(output)
            w << "What is your name? "
            w.flush()
 
            r = input.readLine()
            System.err.println "User responded with $r"
            w.close()
        }
    }
 
}
//----------------------------------------------------------------------------------[править]  Setting Up a UDP Client //----------------------------------------------------------------------------------
// UDP client
data = "Message".getBytes("ASCII")
addr = InetAddress.getByName("localhost")
 
port = 5000
packet = new DatagramPacket(data, data.length, addr, port)
socket = new DatagramSocket()
 
socket.send(packet)
//----------------------------------------------------------------------------------[править]  Setting Up a UDP Server //----------------------------------------------------------------------------------
// UDP server
socket = new DatagramSocket(5000)
buffer = (' ' * 4096) as byte[]
 
while(true) {
    incoming = new DatagramPacket(buffer, buffer.length)
    socket.receive(incoming)
 
    s = new String(incoming.data, 0, incoming.length)
    String reply = "Client said: '$s'"
    outgoing = new DatagramPacket(reply.bytes, reply.size(),
            incoming.address, incoming.port);
 
    socket.send(outgoing)
}
 
// UDP client
data = "Original Message".getBytes("ASCII")
 
addr = InetAddress.getByName("localhost")
port = 5000
packet = new DatagramPacket(data, data.length, addr, port)
socket = new DatagramSocket()
 
socket.send(packet)
socket.setSoTimeout(30000) // block for no more than 30 seconds
buffer = (' ' * 4096) as byte[]
 
response = new DatagramPacket(buffer, buffer.length)
socket.receive(response)
s = new String(response.data, 0, response.length)
 
println "Server said: '$s'"
// => Server said: 'Client said: 'Original Message''
//----------------------------------------------------------------------------------[править]  Using UNIX Domain Sockets //----------------------------------------------------------------------------------
// DOMAIN sockets not available in cross platform form.
// On Linux, use jbuds:
// http://www.graphixprose.com/jbuds/
//----------------------------------------------------------------------------------[править]  Identifying the Other End of a Socket //----------------------------------------------------------------------------------
// TCP socket
socketAddress = tcpSocket.remoteSocketAddress
println "$socketAddress.address, $socketAddress.hostName, $socketAddress.port"
// UDP packet
println "$udpPacket.address, $udpPacket.port"
 
//----------------------------------------------------------------------------------[править]  Finding Your Own Name and Address //----------------------------------------------------------------------------------
// Print the fully qualified domain name for this IP address
println InetAddress.localHost.canonicalHostName
//----------------------------------------------------------------------------------[править]  Closing a Socket After Forking //----------------------------------------------------------------------------------
socket.shutdownInput()
socket.shutdownOutput()
//----------------------------------------------------------------------------------[править]  Writing Bidirectional Clients //----------------------------------------------------------------------------------
// Spawn off a thread to handle each direction
//----------------------------------------------------------------------------------[править]  Forking Servers //----------------------------------------------------------------------------------
// Spawn off a thread to handle each request.
// This is done automatically by the Groovy accept() method on ServerSocket.
// See 17.3 for an example.
//----------------------------------------------------------------------------------[править]  Pre-Forking Servers //----------------------------------------------------------------------------------
// Use a thread pool
//----------------------------------------------------------------------------------[править]  Non-Forking Servers //----------------------------------------------------------------------------------
// Consider using Selector and/or SocketChannel, ServerSocketChannel and DatagramChannel
//----------------------------------------------------------------------------------[править]  Writing a Multi-Homed Server //----------------------------------------------------------------------------------
// When creating a socket on a multihomed machine, use the socket constructor with
// 4 params to select a specific address from those available:
socket = new Socket(remoteAddr, remotePort, localAddr, localPort)
 
// When creating a server on a multihomed machine supply the optional bindAddr param:
new ServerSocket(port, queueLength, bindAddr)
 
//----------------------------------------------------------------------------------[править]  Making a Daemon Server //----------------------------------------------------------------------------------
// Fork off a thread for your server and call setDaemon(true) on the thread.
//----------------------------------------------------------------------------------[править]  Restarting a Server on Demand //----------------------------------------------------------------------------------
// Consider using special packages designed to provide robust startup/shutdown
// capability, e.g.: http://jakarta.apache.org/commons/daemon/
//----------------------------------------------------------------------------------[править]  Program: backsniff //----------------------------------------------------------------------------------
// Alternative to cookbook as proposed inetd solution is not cross platform.
host = 'localhost'
for (port in 1..1024) {
 
    try {
        s = new Socket(host, port)
        println("There is a server on port $port of $host")
 
    }
    catch (Exception ex) {}
}
// You could open a ServerSocket() on each unused port and monitor those.
//----------------------------------------------------------------------------------[править]  Program: fwdport //----------------------------------------------------------------------------------
// It's not too hard to write a TCP Proxy in Groovy but numerous Java packages
// already exist, so we might as well use one of those:
// http://ws.apache.org/axis/java/user-guide.html#AppendixUsingTheAxisTCPMonitorTcpmon
//---------------------------------------------------------------------------------- |