ちなみに
昨日のやつ、URLConnectionとかAuthenticatorとか便利なものを使わず、Socketで頑張る、Basic認証も自力で
ユーザ名とパスワードをコロン(:)でつなぎ
Base64エンコードし
Authorizationヘッダにくっつける
とこうなる。
このサイズのプログラムだとこっちのほうがむしろ楽。
なにげにこういう基本に忠実な感じのほうがわかりやすいかも。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; import java.net.URLEncoder; import java.net.UnknownHostException; import org.apache.commons.codec.binary.Base64; public class SocketClient { public static void main(String[] args) { String user = "user"; String password = "password"; String baseString = user + ":" + password; String basic = Base64.encodeBase64String(baseString.getBytes()); BufferedWriter bw = null; try { String host = "twitter.com"; int port = 80; InetAddress inetAddress = InetAddress.getByName(host); Socket socket = new Socket(inetAddress, port); OutputStream out = socket.getOutputStream(); bw = new BufferedWriter(new OutputStreamWriter(out)); String status = URLEncoder.encode("てすとです。", "UTF-8"); bw.write("POST /statuses/update.xml?status=" + status + " HTTP/1.1\r\n"); bw.write("Host: twitter.com:80\r\n"); bw.write("Authorization: Basic " + basic + "\r\n"); bw.write("\r\n"); bw.flush(); InputStream in = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
なお、OutPutStreamのみ閉じていますが、Socketの接続を閉じるときは
- Socket
- Socket.getInputStream()で得たやつをクローズ
- Socket.getOuputStream()で得たやつをクローズ
のうちどれかひとつをcloseしてあげればSocket接続に使用していたリソースは開放されるそうです。
一応flushの必要があるOutputStreamを閉じるのが一番良さそう。