Subscribed unsubscribe Subscribe Subscribe

ちなみに

Java Twitter

昨日のやつ、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を閉じるのが一番良さそう。