网络
连接到服务器
//创建一个链接到本地8080端口的套接字。
Socket socket = new Socket("localhost",8080);
//获取输入流
InputStream inputStream = socket.getInputStream();
Scanner in = new Scanner(inputStream);
whiel(in.hasNext()){
...;
}
在建立链接之后,我们可以设置超时,如果任务没有在超时时间内完成,就会抛出SocketTimeoutException
异常:
socket.setSoTimeout(10000);//10秒内没有完成任务,将超时
另外,在建立连接时,如果服务器没有及时响应,将会无限期的阻塞下去,此时应该为等待连接设置超时:
Socket socket = new Socket();//建立一个无连接套接字
socket.connect(new InetSocketAddress(host,port),timeout);
实现服务器
ServerSocket server = new ServerSocket(8190);//创建一个监听8190端口的服务
Socket socket = server.accept();//监听请求并创建套接字
//获取输入输出流进行通信
InputStream inStream = socket.getInputStream();
OutputStream outStream = socket.getOutputStream();
为多个客户端服务
ServerSocket server = new ServerSocket(8190);//创建一个监听8190端口的服务
//循环等待客户端接入
while(true){
Socket income = server.accept();
//为每个客户端都建立独立的线程进行服务
Runnable runnable = new ThreadEchoHandler(income);
Thread thread = new Thread(runnable);
thread.start();
}
服务线程:
class ThreadEchoHandler() implements Runnable{
private Socket income;
public ThreadEchoHandler(Socket income){
this.income = income;
}
@Override
public void run(){
InputStream inStream = income.getInputStream();
OutputStream outStream = income.getOutputStream();
...
}
}
半关闭
我们可以关闭套接字一端的输入或者输出流,此时套接字处于半关闭状态,客户端或服务端(取决于在哪一端关闭)将无法接收或输出数据。
//客户端关闭
Socket socket = new Socket(host,port);
InputStream inStream = socket.getInputStream();
OutputStream outStream = socket.getOutputStream();
//输出一些数据
...
//将输出流设为:流结束
socket.shutdownOutput();
//此时套接字处于半关闭状态
...
可关闭套接字
当连接到一个套接字时,当前线程会被阻塞直到建立连接或者连接超时。在等待服务端响应时客户端线程也会阻塞。此时无法使用interupt
终止客户端线程,我们需要使用可中断套接字。
try {
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost",8189));
InputStream inputStream = Channels.newInputStream(socketChannel);
while(!Thread.currentThread().isInterrupted()){
inputStream.read();
}
}catch (Exception e){
e.printStackTrace();
}
使用SocketChannel
,那么即使线程处于阻塞状态,该线程也可以被中断。当中断阻塞的线程时,会以抛出java.nio.channels.ClosedByInterruptException
异常结束。
获取Web数
URL类和URI类(URL与URI)
- URI类主要用于解析标识符并将它们分解成各种不同的组成部分。
- URL类用于访问资源并获取一个到达资源的流
URLConnection类
URL类只能解析URL字符串或者获得资源流,无法获取更多关于请求资源的信息。URLConnection
主要封装了设置请求头和获取响应头的方法,其使用步骤如下:
URL url = new URL(urlName);
URLConnection connection = url.openConnection();
//设置请求头参数
...
//向目标地址发出请求
connection.connect();
//获取响应头
Map<String,List<String>> headers = connection.getHeaderFileds();
具体封装方法参考API