简单的SocketExample

客户端
//
---------------VerySimpleClient.java package SocketExample; // Tue Nov 2 18:34:53 EST 2004 // // Written by Sean R. Owens, sean at guild dot net, released to the // public domain. Share and enjoy. Since some people argue that it is // impossible to release software to the public domain, you are also free // to use this code under any version of the GPL, LPGL, or BSD licenses, // or contact me for use of another license. // http://darksleep.com/player import java.net.Socket; import java.net.ServerSocket; import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; public class VerySimpleClient { private String serverHostname = null; private int serverPort = 0; private byte[] data = null; private Socket sock = null; private InputStream sockInput = null; private OutputStream sockOutput = null; public VerySimpleClient(String serverHostname, int serverPort, byte[] data){ this.serverHostname = serverHostname; this.serverPort = serverPort; this.data = data; } public void sendSomeMessages(int iterations) { System.err.println("Opening connection to "+serverHostname+" port "+serverPort); try { sock = new Socket(serverHostname, serverPort); sockInput = sock.getInputStream(); sockOutput = sock.getOutputStream(); } catch (IOException e){ e.printStackTrace(System.err); return; } System.err.println("About to start reading/writing to/from socket."); byte[] buf = new byte[data.length]; int bytes_read = 0; for(int loopi = 1; loopi <= iterations; loopi++) { try { sockOutput.write(data, 0, data.length); bytes_read = sockInput.read(buf, 0, buf.length); } catch (IOException e){ e.printStackTrace(System.err); } if(bytes_read < data.length) { System.err.println("run: Sent "+data.length+" bytes, server should have sent them back, read "+bytes_read+" bytes, not the same number of bytes."); } else { System.err.println("Sent "+bytes_read+" bytes to server and received them back again, msg = "+(new String(data))); } // Sleep for a bit so the action doesn't happen to fast - this is purely for reasons of demonstration, and not required technically. try { Thread.sleep(50);} catch (Exception e) {}; } System.err.println("Done reading/writing to/from socket, closing socket."); try { sock.close(); } catch (IOException e){ System.err.println("Exception closing socket."); e.printStackTrace(System.err); } System.err.println("Exiting."); } public static void main(String argv[]) { String hostname = "localhost"; int port = 54321; byte[] data = "Hello World".getBytes(); VerySimpleClient client = new VerySimpleClient(hostname, port, data); client.sendSomeMessages(100); } }
服务端:
//-------------VerySimpleServer.java     
package SocketExample;

// Tue Nov  2 18:33:43 EST 2004
//
// Written by Sean R. Owens, sean at guild dot net, released to the
// public domain.  Share and enjoy.  Since some people argue that it is
// impossible to release software to the public domain, you are also free
// to use this code under any version of the GPL, LPGL, or BSD licenses,
// or contact me for use of another license.
// http://darksleep.com/player

import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

// An example of a very simple socket server.  Start by looking at the
// static main() method at the bottom of this file.
public class VerySimpleServer {
    private int serverPort = 0;
    private ServerSocket serverSock = null;

    public VerySimpleServer(int serverPort) {
        this.serverPort = serverPort;

        try {
            serverSock = new ServerSocket(serverPort);
        }
        catch (IOException e){
            e.printStackTrace(System.err);
        }
    }
    
    // All this method does is wait for some bytes from the
    // connection, read them, then write them back again, until the
    // socket is closed from the other side.
    public void handleConnection(InputStream sockInput, OutputStream sockOutput) {
        while(true) {
            byte[] buf=new byte[1024];
            int bytes_read = 0;
            try {
                // This call to read() will wait forever, until the
                // program on the other side either sends some data,
                // or closes the socket.
                bytes_read = sockInput.read(buf, 0, buf.length);

                // If the socket is closed, sockInput.read() will return -1.
                if(bytes_read < 0) {
                    System.err.println("Tried to read from socket, read() returned < 0,  Closing socket.");
                    return;
                }
                System.err.println("Received "+bytes_read
                                   +" bytes, sending them back to client, data="
                                   +(new String(buf, 0, bytes_read)));
                sockOutput.write(buf, 0, bytes_read);
                // This call to flush() is optional - we're saying go
                // ahead and send the data now instead of buffering
                // it.
                sockOutput.flush();
            }
            catch (Exception e){
                System.err.println("Exception reading from/writing to socket, e="+e);
                e.printStackTrace(System.err);
                return;
            }
        }

    }

    public void waitForConnections() {
        Socket sock = null;
        InputStream sockInput = null;
        OutputStream sockOutput = null;
        while (true) {
            try {
                // This method call, accept(), blocks and waits
                // (forever if necessary) until some other program
                // opens a socket connection to our server.  When some
                // other program opens a connection to our server,
                // accept() creates a new socket to represent that
                // connection and returns.
                sock = serverSock.accept();
                System.err.println("Have accepted new socket.");

                // From this point on, no new socket connections can
                // be made to our server until we call accept() again.

                sockInput = sock.getInputStream();
                sockOutput = sock.getOutputStream();
            }
            catch (IOException e){
                e.printStackTrace(System.err);
            }

            // Do something with the socket - read bytes from the
            // socket and write them back to the socket until the
            // other side closes the connection.
            handleConnection(sockInput, sockOutput);

            // Now we close the socket.
            try {
                System.err.println("Closing socket.");
                sock.close();
            }
            catch (Exception e){
                System.err.println("Exception while closing socket.");
                e.printStackTrace(System.err);
            }

            System.err.println("Finished with socket, waiting for next connection.");
        }
    }

    public static void main(String argv[]) {
        int port = 54321;
        VerySimpleServer server = new VerySimpleServer(port);
        server.waitForConnections();
    }
}

 

posted @ 2013-09-13 14:57  daveztong  阅读(382)  评论(0编辑  收藏  举报