socket联接

socket连接
最近找了找方向,随便翻了翻书,先写一些和主线无关的吧,socket连接的使用。
首先,如何连接远端的网络服务器。
先从最基本的说起:
Socket s = new Socket(...);
as.setSoTimaOut(1000);
try{
    InputStream in = s.getInputStream();
} catch(InterruptedIOException exception) {
    react to timeout
}

此代码有一个问题,如果使用new socket(String host, int port)这个构造器的话,会一直无限期阻塞下去,直到建立连接成功。所以推荐做法为:
Socket s = new Socket();
s.connect(new InetSocketAddress(host, port), timeout);

其实,java封装了所有连接服务器的细节,所以,我们使用起来会非常的方便。
网络地址一般的获得方式为
InetAddress address = InetAddress.getByName("www.baidu.com");
byte[] addressBytes = address.getAddress();
//如果很多ip来实现负载均衡,则会有很多主机地址
byte[] address = InetAddress.getAllByNames(hst);

讲完客户端,服务端也要讲了,首先还是最基本的:
ServerSocket s = new ServerSocket(8199);
//下面的命令一下,你的程序就被hold住了哦
Socket incoming = s.accept();
//直到程序有了输入
try{
    InputStream inStream = incoming.getInputStream();
    OutputStream outStream = incoming.getOutputStream();
    Scanner in = new Scanner(inStream);
    PrintWriter out = new PrintWriter(outStream, true);
    
    out.print;n("Hello! Enter BYE to exit.");

    boolean done = false;
    while(!done && in.hasNextLine()){
        String line = in.nextLine();
        out.println("Echo" + line);
        if (line.trim().equals("BYTE")) done = true;
    }
} finally {
    incoming.close();
}
catch(IOException e) {
    xxxx
}
}

一般情况,服务器不可能一对一的应对访问,所以需要线程加以支撑:
替换相应的s.accept()
while(true){
    Socket incoming = s.accept();
    Runnable r = new ThreadedEchoHandler(incoming);
    Thread t = new Thread(r);
    t.start();
    i++;
}

这样服务器端就可以处理多个客户端的请求了。

下来,还有一个问题,如果客户端想在建立连接的时候中断请求,应该怎么办呢?有一法:
可以使用java.nio包提供的一个特性:SocketChannel类。
SocketChannel channel = SocketChannel.open(new InetSocketAddress(host, port));
Scanner in = new Scanner(channel);
//Channels的静态方法
OutputStream outputStream = Channels.newOutputStream(channel);

这样,如果使用线程的中断interrupt(),那么线程将不会陷入阻塞,而是以异常的方式结束。具体客户端的访问线程是否可以从访问处直接到异常处,各位自己写写程序实验吧。睡觉!呵呵。