核心技术(卷二)04、第3章-网络

网络

连接到服务器

//创建一个链接到本地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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值