核心技术(卷二)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类()
-
URI类主要用于解析标识符并将它们分解成各种不同的组成部分。 URL类用于访问资源并获取一个到达资源的流
URLConnection类
URL类只能解析URL字符串或者获得资源流,无法获取更多关于请求资源的信息。URLConnection主要封装了设置请求头和获取响应头的方法,其使用步骤如下:
URL url = new URL(urlName); URLConnection connection = url.openConnection(); //设置请求头参数 ... //向目标地址发出请求 connection.connect(); //获取响应头 Map<String,List<String>> headers = connection.getHeaderFileds();
具体封装方法参考
下一篇:
Linux 之二:GDB调试命令