2020年9月17日——Java
1.网络编程中,服务器端的accept方法,负责接收客户端发送过来的连接,若没有客户端连接,则一直处于阻塞状态,不会往下运行
2.多线程的搭建步骤:
(1)搭建服务器
while ( true ) {
(2)接收客户端的连接,使用accept方法
(3)分离子线程,为当前客户端提供服务
(4)关闭与客户端之间的连接
}
3.使用网络编程,搭建服务器时,一般要实现两个线程:
监听线程和数据处理的线程
监听线程:负责监听客户端发来的请求,是否将服务器关闭
new Thread(){ public void run() { try { //调用accept方法,等待被连接,若没有连接时,系统处于阻塞状态 Socket server = serverSocket.accept(); //若连接成功,则将flag设置为false,关闭数据处理的线程 flag = false; //关闭监听线程 server.close(); System.out.println("服务器已关闭"); } catch (Exception e) { e.printStackTrace(); } } }.start();
数据处理的线程:负责处理客户端发送过来的数据【使用多线程】
//1.搭建服务器 ServerSocket ss2 = new ServerSocket(8888); //flag默认为true,当监听线程将flag设置为false时,结束该线程 while(flag){ new Thread(){ public void run() { try { while (flag) { //2.接收客户端连接,接收连接accept(),返回socket对象 Socket server = serverSocket.accept(); //3.创建多个子线程,处理不同客户端发送的数据 new Thread() { @Override public void run() { Collection<Environment> list = null; ObjectInputStream ois = null; try { //4.获取客户端传输的流 ois = new ObjectInputStream( new BufferedInputStream( server.getInputStream())); //5.获取数据 list = (Collection<Environment>)ois.readObject(); System.out.println("成功接收客户端发送的数据!"); //6.将数据存储入库 DBStore db = new DBStoreImpl(); db.saveDb(list); } catch (Exception e) { e.printStackTrace(); } finally { //7.关闭资源 //关闭流 try { if (ois != null) { ois.close(); } } catch (Exception e) { e.printStackTrace(); } //关闭与客户端的连接 try { server.close(); } catch (Exception e) { e.printStackTrace(); } } } //启动子线程 }.start(); }//while循环结束 } catch (Exception e) { e.printStackTrace(); } } }.start(); }
4.判断一个集合set1中的元素,是否在另一个集合set2中全都出现时,可使用这种方法:
1 //使用retainAll方法,取两个集合中的交集 2 //若交集中的元素与自身的元素全部一样,则返回false,否则,返回true 3 if ( !set1.retainAll(set2) )