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