socketsソケットの使い方


備考

この節では、ソケットの概要と、開発者がそれを使いたい理由について概説します。

また、ソケット内の大きなテーマについても言及し、関連するトピックにリンクする必要があります。ソケットのドキュメンテーションは新しいので、それらの関連トピックの初期バージョンを作成する必要があります。

接続されていないソケットを作成し、接続して接続が確立されているかどうかを確認します

 public class ConnectSocketExample {

    private int HTTP_PORT = 80;

    /**
     * example method to create unconnected socket
     * then connect to it
     * at end return connected socket
     *
     * @param httpHostName - endpoint host name fot socket connection
     * @throws IOException - if the socket is already connected or an error occurs while connecting.
     */
    protected Socket connectSocket(String httpHostName) throws IOException {
        // define local variable for socket and create unconnected socket
        Socket socket = new Socket();
        //  create iNet address for socket
        InetSocketAddress inetSocketAddress = new InetSocketAddress(httpHostName, HTTP_PORT);
        // connect socket to inet address (end point )
        socket.connect(inetSocketAddress);
        // return connected socket for later use 
        return socket;
    }
    
    /** 
     * public method for try to create connected to goole.com http port socket 
     * and with check and system out print if this try was successful
     **/
    public void createAndCheckIfConnected() {
        try {
            Socket connectedSocket = connectSocket("google.com");
            boolean connected = connectedSocket.isConnected();
            System.out.print("Socket is:" + (!connected ? " not" : "" +  " connected"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
 

ソケットクラスオブジェクトをインスタンス化する方法

ソケットのインスタンス化はさまざまな方法で行うことができます。

  1. 2行の宣言とインスタンス化によって:

    最初に、Socketクラスオブジェクトを保持する変数を定義する必要があります。

    Socket socket;
     

    Socketクラスオブジェクトを作成することができます:

    socket = new Socket();
     
  2. また、1行の定義とインスタンス化を行うこともできます。

    Socket  socket = new Socket();
     

どちらの方法でも未接続のソケットが作成されます。

他のパラメータ化されたコンストラクタを使用して、接続されたソケットクラスオブジェクトまたは未接続のソケットクラスオブジェクトをインスタンス化できます。

詳細については、class doc specsを参照してください。

https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html

シンプルなhttp取得要求をソケットに書き込んで応答をダンプする

/** 
 * we reuse a class written in example:
 * http://stackoverflow.com/documentation/sockets/2876/introduction-to-sockets#t=201607262114505531351
 * pleas to familiar with it first to continue with this one 
 **/
public class WriteToSocketExample extends ConnectSocketExample {

    private String CRLF = "\r\n"; // line termination (separator)

    /**
     * write a simple http get request to socket
     * @param host - host to establish a connection
     *               (http server - see ConnectSocketExample HTTP_PORT )
     * @param path - path to file ( in this case a url location - part used in browser after host)
     * @return a  connected socket with filled in raw get request
     * @throws IOException - see ConnectSocketExample.connectSocket(host);
     */
    protected Socket writeGetToSocket(String host, String path) throws IOException {
        // create simple http raw get request for host/path
        String rawHttpGetRequest = "GET "+ path +" HTTP/1.1 " + CRLF  // request line
                + "Host: "+ host + CRLF
                + CRLF;
        // get bytes of this request using proper encodings
        byte[] bytesOfRequest = rawHttpGetRequest.getBytes(Charset.forName("UTF-8)"));
        // create & connect to socket
        Socket socket = connectSocket(host);
        // get socket output stream
        OutputStream outputStream = socket.getOutputStream();
        // write to the stream a get request we created
        outputStream.write(bytesOfRequest);
        // return socket with written get request
        return  socket;
    }

    /**
     * create, connect and write to socket simple http get request
     * then dump response of this request
     * @throws IOException
     */
    public void writeToSocketAndDumpResponse() throws IOException {
        // send request to http server for / page content
        Socket socket = writeGetToSocket("google.com", "/");
        // now we will read response from server
        InputStream inputStream = socket.getInputStream();
        // create a byte array buffer to read respons in chunks
        byte[] buffer = new byte[1024];
        // define a var to hold count of read bytes from stream
        int weRead;
        // read bytes from sockets till exhausted or read time out will occurred ( as we didn't add in raw get header Connection: close (default keep-alive)
        while ((weRead = inputStream.read(buffer)) != -1) {
            // print what we have read
            System.out.print(new String(buffer));
        }
    }
}