首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

socket联接

2012-06-28 
socket连接最近找了找方向,随便翻了翻书,先写一些和主线无关的吧,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(),那么线程将不会陷入阻塞,而是以异常的方式结束。具体客户端的访问线程是否可以从访问处直接到异常处,各位自己写写程序实验吧。睡觉!呵呵。

热点排行