socket联接
socket连接
最近找了找方向,随便翻了翻书,先写一些和主线无关的吧,socket连接的使用。
首先,如何连接远端的网络服务器。
先从最基本的说起:
此代码有一个问题,如果使用new socket(String host, int port)这个构造器的话,会一直无限期阻塞下去,直到建立连接成功。所以推荐做法为:
其实,java封装了所有连接服务器的细节,所以,我们使用起来会非常的方便。
网络地址一般的获得方式为
讲完客户端,服务端也要讲了,首先还是最基本的:
一般情况,服务器不可能一对一的应对访问,所以需要线程加以支撑:
替换相应的s.accept()
这样服务器端就可以处理多个客户端的请求了。
下来,还有一个问题,如果客户端想在建立连接的时候中断请求,应该怎么办呢?有一法:
可以使用java.nio包提供的一个特性:SocketChannel类。
这样,如果使用线程的中断interrupt(),那么线程将不会陷入阻塞,而是以异常的方式结束。具体客户端的访问线程是否可以从访问处直接到异常处,各位自己写写程序实验吧。睡觉!呵呵。
最近找了找方向,随便翻了翻书,先写一些和主线无关的吧,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(),那么线程将不会陷入阻塞,而是以异常的方式结束。具体客户端的访问线程是否可以从访问处直接到异常处,各位自己写写程序实验吧。睡觉!呵呵。