小程序数据传入详情页后无法读取?

app.js
app.js

4.js
4.js

4.js
4.js

detial.js
detial.js

problem
problem

小程序通过postId读取后无法识别,qiu'zhu'da'shen

2个回答

直接打印options看看里面是否包含了postId

你确定postId有传值过去,打印看看是否有值回来

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
xml处理相关 一般处理程序返回值无效
最近asp.net做了一个小模块,大概功能是 js抓取页面上的值生成xml,再用ajax将xml传入到一般处理程序,交友对底层处理。存储过程中对xml进行处理:读取xml中的数据,和元数据进行比对,存在则更新不存在则插入。 操作结果为成功或失败。若成功则一般处理程序返回设置成功否则返回设置失败。 但现在遇到的问题是,不管处理成功还是失败,大部分情况下页面都不提示消息,偶尔会提示。 一致找不到原因,求大神解答,不吝赐教。
有关计算机的几个基础关键的问题..困扰很久了..麻烦专业点的大神给个通俗准确的解释,感激不尽!
①内存的数据读取到该内存另一块地方上会不会经过cpu ②芯片的作用主要是计算吗?硬盘,内存,显卡,网卡,声卡这些部件里都有芯片?数据对它们进行传入传出时都要经过芯片这个数据处理器?也就是说,比如cpu处理好的数据结果送到硬盘时,数据要先经过硬盘上的一块处理数据的芯片?cpu处理好的数据结果送到网卡声卡这些时,也要先经过它们上面的一块处理数据的芯片?这块芯片决定了它们对传来的数据的处理能力? ③最后一个问题: 既然c语言速度比c#快那么多,那么对于一个耗时间的程序相同情况下岂不是c#要花很多的时间,比如说同一个算法c连续让cpu算了一分钟,那岂不是c#要算几十分钟才能算完? (请稍微专业点的大神回答啊谢谢!)
c#与matlab混合编程,用c#读表作为参数传入matlab运算的速度要远小于matlab自己读表
关于c#与MATLAB混合编程(dll打包引用),MATLAB算法的参数 是通过读取excel表得到的,参数是一组向量,但是通过MATLAB程序读表和通过c#读表再以参数的形式传入MATLAB,两者的速度差异非常大,差距是好几倍。这里必须用c#读表,要不matlab读表的程序打包在dll里面修改起来太麻烦。请问这是怎么个情况,为什么用c#读表会慢那么多呢。我调试过,在c#中创建那个算法的对象不需要多久,时间就长在计算上,请问应该怎么改进
java项目转为exe程序,在线等,急
运行cmd是出现没有主清单属性错误,修改了manifest.mf的文件也不能修正错误,求解 代码如下 package com.export; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import jxl.Cell; import jxl.CellType; import jxl.LabelCell; import jxl.Sheet; import jxl.Workbook; import jxl.write.Label; public class ExcelOperater { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("输入横坐标:"); int i = s.nextInt(); System.out.println("输入纵坐标:"); int j = s.nextInt(); System.out.println("取读的坐标为: (" + i + "," + j + ")"); System.out.println("---------------------------------------"); List<int[]> list = new ArrayList<int[]>(); int[] a = { i, j };//读取文件中0行0列单元格中的数据 list.add(a); Scanner str = new Scanner(System.in); System.out.println("输入文件夹路径:"); String str1 = str.nextLine(); System.out.println("输入将写入的文件名及其路径"); String str2 = str.nextLine(); excelRAndW(str1, str2, list); } /** * * @Title: excelRAndW * @Description: 从一个文件夹下的文件中读取指定单元格的数据,写入到指定文件中 * @param @param readFolderURL 读取文件的而文件夹地址 * @param @param writeFileURL 数据写入的文件地址 * @param @param cells 读取文件中的单元格行号和列号数组的集合(要读取文件文件中的那些单元格数据) * @return void 返回类型 * @author: Kristen * @date 2016年2月24日 下午10:55:00 * @throws */ public static void excelRAndW(String readFolderURL, String writeFileURL, List<int[]> cells) { /** * @Fields m:用来标记当前读取的是第几个文件 */ int m = 0; /** * @Fields wwb:读取要写入数据的文件 */ jxl.write.WritableWorkbook wwb = null; /** * @Fields ws:拿到要写入文件的sheet工作表 */ jxl.write.WritableSheet ws = null; try { m = 0; wwb = Workbook.createWorkbook(new File(writeFileURL)); System.out.println("操作开始"); System.out.println("当前写入的文件名为:" + new File(writeFileURL).getName()); System.out.println("--------------------------------------"); ws = wwb.createSheet("第一页", 0); // 读取文件夹 File file = new File(readFolderURL);// 文件目录 //循环读取文件夹下的文件 for (File demoFile : file.listFiles()) { //判断读取的文件是否为后缀名为xls的excel文件 String[] str = demoFile.getName().split("\\."); if (str[str.length - 1].equals("xls")) { System.out.println("当前读取文件名称为:" + demoFile.getName()); InputStream instream = new FileInputStream(demoFile); jxl.Workbook readwb = null; readwb = Workbook.getWorkbook(instream); //得到当前sheet工作表 Sheet readsheet = readwb.getSheet(0); String str1 = null; /** * @Fields n:用来记录当前读取了几列数据 */ int n = 0; //循环读取当前文件中指定单元格的数据 for (int[] cell : cells) { //得到传入参数中制定的单元格数据 Cell c00 = readsheet.getCell(cell[0], cell[1]); str1 = c00.getContents(); System.out.println("当前读取的单元格行号和列号为:(" + cell[0] + "," + cell[1] + ")"); System.out.println("当前读取单元格内容为:" + c00.getContents()); //获得cell具体类型值的方式 if (c00.getType() == CellType.LABEL) { LabelCell labelc00 = (LabelCell) c00; str1 = labelc00.getString(); } else { str1 = str1 + ""; } // 将数据写入到指定文件中 Label label = new Label(n, m, c00.getContents()); System.out.println("当前写入的单元格行号和列号为:(" + m + "," + n + ")"); System.out.println(); ws.addCell(label); n++; } m++; System.out.println("-----------------------------------"); } } wwb.write(); wwb.close(); System.out.println("操作完毕"); } catch (Exception e) { e.printStackTrace(); } } }
android程序运行后无法加载UI
程序运行后无法加载UI,出现白屏,并报错如下: 07-18 01:30:20.459: E/WindowManager(674): Starting window AppWindowToken{42322000 token=Token{4241ffd8 ActivityRecord{41eb6d98 u0 com.example.pls/.MainActivity t30}}} timed out 在我将主线程中的如下语句注释后,便可以正常加载UI。 ![图片说明](https://img-ask.csdn.net/upload/201607/18/1468811257_95355.jpg) MyThread类如下(主要是考虑单线程模型,想另开一个线程做任务)。 ``` class MyThread implements Runnable { private byte[] src = new byte[1024]; private byte[] dst = new byte[1024]; public void run() { while (!Thread.currentThread().isInterrupted()) { try { int fd = portOperation.getFd(); //循环前清空 String sResponse = "100003010300000712"; byte[] bResponse = HexString2Bytes(sResponse); portOperation.WriteSerialByte(fd, bResponse); String sCardInfo = "1000030101000512"; byte[] bCardInfo = HexString2Bytes(sCardInfo);//[16, 0, 1, 1, 1, 0, 3, 18] portOperation.WriteSerialByte(portOperation.getFd(),bCardInfo); try { Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } src = portOperation.ReadSerial(fd,1024 ); if ((src != null) && (src.length > 9)) { String debug = bytesToHexString(src); //调试 //转码恢复 dst = recovery(src); //从返回帧中提取卡数 String sTemp = bytesToHexString(dst); int a = Integer.parseInt(String.valueOf(sTemp.charAt(11))); int b = Integer.valueOf(String.valueOf(sTemp.charAt(12)),16); int cardNum = a*16+b; for(int i = 0;i<cardNum;i++){ int j = i*16; String cardID = sTemp.substring(13+j,21+j ); if (!dbFile.exists()) { DisplayToast("请先将数据库拷贝到SD卡根目录下!"); return; } String SQL = String.format("select * from employInfo where cardID = '%s'", cardID); Cursor c = db.rawQuery(SQL, null); //没有读到马丽但读到其他卡时,在此停止(因为数据库中只有马丽),不会执行超时删除 //而若读到马丽时,只会更新马丽时间 if(c.moveToFirst()){ //Cursor默认从下标为-1的地方开始,所以不能马上从Cursor获取信息 String name = c.getString(c.getColumnIndex("name")); //在此处将读取人员姓名保存至“employinfo.txt”文件中(确保不重复) Date date = new Date(localFile.lastModified());//文件最后修改时间 Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try{ //保证文件日期为今日 if(!localFile.exists()){ localFile.createNewFile(); }else if(localFile.exists() && date.getDay() != calendar.get(Calendar.DAY_OF_MONTH) ){ localFile.createNewFile(); } BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(localFile,true)); BufferedReader bufferedReader = new BufferedReader(new FileReader(localFile)); if(!hasName(name, bufferedReader)){ bufferedWriter.write(name+"\t"+dateFormat.format(calendar.getTime())+"\n"); bufferedWriter.flush(); } bufferedReader.close(); bufferedWriter.close(); }catch(IOException e){ e.printStackTrace(); Log.e("txt",e.toString()); } c.close(); String photoPath0 = Environment.getExternalStorageDirectory().toString() + "/picSrc/"; String photoPath = String.format("%s%s.bmp",photoPath0,name); //确保list里面放的是不同对象map的堆地址,指向的是不同对象 Map<String, Object> map = new HashMap<String, Object>(); map.put("itemName", name); //注意此处不可将Bitmap对象直接放入hashmap中,而应传入地址 map.put("itemPhoto", photoPath); map.put("addTime",System.currentTimeMillis()); Log.v("map", map.toString()); //根据姓名查看list当中是否存在所有项 boolean exist = false; for(Map<String, Object> tempMap : list){ if(name.equals(tempMap.get("itemName"))){ exist = true; //如果有则更新时间 tempMap.put("addTime", System.currentTimeMillis()); break; } } //如果不存在,则添加到list当中 if(!exist){ list.add(map); } Log.v("removeb2",list.toString()); //遍历list查看有无超时项,有则清空该项 Iterator<Map<String, Object>> it = list.iterator(); while(it.hasNext()){ if((System.currentTimeMillis()-Long.parseLong(it.next().get("addTime").toString()))>60000){ Log.v("removebefore",list.toString()); it.remove(); Log.v("removeafter",list.toString()); } } /*for(int k=0;k<list.size();k++){ if(System.currentTimeMillis()-Long.parseLong(list.get(k).get("addTime").toString())>30000){ long debug1 = System.currentTimeMillis(); long debug2 = Long.parseLong(list.get(k).get("addTime").toString()); Log.v("removebefore",list.toString()); list.remove(k); Log.v("remove",list.remove(k).toString()); Log.v("removeafter",list.toString()); } }*/ /*//删除list中没有但listview中 for(int m = 0;m<lv.getChildCount();m++){ View viewTemp = lv.getChildAt(m); String nameTemp = viewTemp.findViewById(R.id.itemName).toString(); boolean exist1 = false; for(Map<String, Object> tempMap : list){ if(nameTemp.equals(tempMap.get("itemName"))){ exist1 = true; break; } } if(!exist1){ lv.removeView(viewTemp); } }*/ } } //将定时任务中获取的List装入ListView中 Message msg = new Message(); msg.what = 1; handler.sendMessage(msg); }else{ Message msg = new Message(); msg.what = 2; handler.sendMessage(msg); } }catch(UnsupportedEncodingException e){ e.printStackTrace(); } try { Thread.sleep(500); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } ``` 不知道具体是什么原因,还请各位前辈赐教,谢谢!
请教IDEA while循环debug问题
# 想调试一个使用JDBC从数据库读取Blob类型数据的程序,但是试了很多次debug不了其中的while循环 ## 在Servlet实现类的doPost方法中试了一个简单的while循环,发现可以调试 ```java int a=11; int i=0; while (++i<a){ System.out.println(i); } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570014345_777656.png) ## 代码 ### Servlet doPost ``` String sql = "SELECT * FROM resource WHERE id = ?"; String[] path = new String[1]; path[0] = "F:\\program design\\JavaWeb\\web\\resource\\2.png"; //下面的方法传入数据库连接,接收数据的类,sql语句以及要将数据库中提取的文件放入的路径和sql语句中?的替代 //返回接收数据的类的实例的集合 ArrayList<Datas> arrayList = JDBC.searchBolb(connection, Datas.class, sql, path, 1); PrintWriter writer = response.getWriter(); for (Datas d : arrayList) { writer.println(d); } ``` ### JDBC ```java //重点请看while循环,其他错误只要能调试while循环我自己慢慢找 public static <T> ArrayList<T> searchBolb(Connection connection, Class<T> clazz, String sql, String[] resourcePath, Object... args) { //数据库表中最后一个字段为Blob类型 //输出类中封装Blob资源输出地址 PreparedStatement ps = null; ResultSet result = null; ResultSetMetaData rsmd = null; InputStream is = null; FileOutputStream fos = null; int resourcePathNumber = 0; ArrayList<T> collection = new ArrayList<T>(); try { ps = connection.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } result = ps.executeQuery(); rsmd = result.getMetaData(); while (result.next()) { int columnCount = rsmd.getColumnCount(); T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i < columnCount - 1; i++) { Object columnValue = result.getObject(i + 1); String columnLabel = rsmd.getColumnLabel(i + 1); Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t, columnValue); } Blob blob = result.getBlob(columnCount); String blobLabel = rsmd.getColumnLabel(columnCount); Field field = clazz.getDeclaredField(blobLabel); field.setAccessible(true); field.set(t, resourcePath); is = blob.getBinaryStream(); fos = new FileOutputStream(resourcePath[resourcePathNumber++]); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } collection.add(t); } } catch (SQLException | IOException | NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { e.printStackTrace(); } finally { try { ps.close(); is.close(); fos.close(); } catch (SQLException | IOException e) { e.printStackTrace(); } if (collection == null) { System.out.println("Failed to search"); } return collection; } } ```` ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570015047_843639.png) ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570015068_774806.png) <br> 把断点设在144行(while循环第一行),运行到for循环第一行出错(用的f8,不进入方法体)(没有while循环过,这是第一次for循环),这里的错误是结果集关闭,但是显然并没有任何操作使之关闭(我试了另外一个没有问题的方法,报的同样的错误),怀疑是刚开始debug时就已经进行完了while循环,导致结果集关闭 <br> 请问需要把断点设在哪里,或者是怎么样才能解决上述问题?3Q
怎么把service层的一个model类型的数组通过controller层传递给一个JSP并显示出来
如题,我的controller里的函数是: @RequestMapping("/storelogin.do")//查询到请求映射规则 public String Swelcome(@RequestParam(value="dsid")String did,@RequestParam(value="dsps")String dsps,ModelMap model, HttpServletRequest request, HttpServletResponse response) throws SQLException//获取视图层参数 { int flag; Sdata[] orders=new Sdata[100]; flag=software.work.service.Sservice.LoginDAO(did,dsps);//调用业务逻辑层函数 orders=software.work.service.Sservice.ShowOrders(dsid); if(flag==0)return "loginerror";//用户名密码输入错误 else { dsid=software.work.model.Sdata.getDsid();//从模型中读取数据 model.put("dsid", dsid);;//将模型数据传入渲染视图 request.getSession().setAttribute("orders",orders); return "OrderQuery";//返回逻辑视图名,加上。jsp后缀 } } 我的service层里的函数是: public static Sdata[] ShowOrders(String dsid)//从model中数据重新导回数据库 { String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; String dburl = "jdbc:sqlserver://localhost:1433;DatabaseName=B2C"; String user="ordertester"; String password2="12345"; Sdata[] orders=new Sdata[100]; int i; try{ Class.forName(driver); //加载数据库驱动程序 Connection conn = DriverManager.getConnection(dburl,user,password2);//创建数据库连接对象 String sql="select * from Orders,OrderDetail where Orders.O_id=OrderDetail.O_id and OrderDetail.DS_id="+dsid; Statement stmt=conn.createStatement(); rs=stmt.executeQuery(sql); i=0; if(rs.next()) { while(rs.next()){ orders[i].setOtype(rs.getString("O_type")); orders[i].setOall(rs.getString("O_all")); orders[i].setOdate(rs.getString("O_data")); orders[i].setCid(rs.getString("O_id")); orders[i].setCid(rs.getString("C_id")); orders[i].setOdcount(rs.getInt("Od_id")); orders[i].setOdprice(rs.getFloat("OD_price")); orders[i].setMedid(rs.getString("Med_id")); i++; } stmt.close(); conn.close(); return orders; } else { stmt.close(); conn.close(); return null; } }catch(ClassNotFoundException e1){}catch(SQLException e2){} return null; } 请问JSP该怎么写啊
C#调用SAP RFC 无法获取内表对象的一个字段
标题写的有可能不清楚。流程是这样的,RFC函数 中没有传入参数,只有一个返回参数,还有一个内表对象。该接口不用返回参数进行返回信息的记录。均使用内表对象。譬如:该内表对象有A,B,C,D4个字段,我为内表对象赋值,执行函数,执行之后,无论是成功与否,数据是否满足业务逻辑。都会将A字段进行修改。也就是A字段记录了相关的返回信息。我读取该字段作为返回信息。我执行前不会为A赋值,这样执行后我获得的A字段就是空,如果我为A赋值,执行后的A和执行前的一样。如下是代码: 获取数据库连接,数据类ErpInfo ErpInfoOne = new ErpInfo(); ErpInfoList.Add(ErpInfoOne); 然后给数据类赋值 之后就是 和SAP相关的了 RfcConfigParameters parms = new RfcConfigParameters(); parms.Add(RfcConfigParameters.Name, "CON"); parms.Add(RfcConfigParameters.AppServerHost, "10.185.0.166"); //SAP主机IP parms.Add(RfcConfigParameters.SystemNumber, "00"); //SAP实例 parms.Add(RfcConfigParameters.User, "XXXXX"); //用户名 parms.Add(RfcConfigParameters.Password, "XXXX"); //密码 parms.Add(RfcConfigParameters.Client, "800"); // Client parms.Add(RfcConfigParameters.Language, "ZH"); //登陆语言 parms.Add(RfcConfigParameters.PoolSize, "5"); parms.Add(RfcConfigParameters.MaxPoolSize, "10"); parms.Add(RfcConfigParameters.IdleTimeout, "60"); RfcDestination dest = RfcDestinationManager.GetDestination(parms); try { RfcRepository repo = dest.Repository; IRfcFunction companyBapi = repo.CreateFunction("ZZHHS_FUNC_FJ007"); IRfcTable table = companyBapi.GetTable("ITAB_01"); //获取内表对象 //for (int y = 0; y < table.RowCount; y++) //{ // table.CurrentIndex = y; // MessageBox.Show("给表对象赋值之前 CHECK:" + table.CurrentRow.GetValue("CHECK").ToString() + " BLDAT:" + table.CurrentRow.GetValue("BLDAT").ToString()); //} for (int i = 0; i < ErpInfoList.Count; i++) { table.Insert(); //table.CurrentRow.SetValue("CHECK", ErpInfoList[i].Check);//1 //都是赋值语句 table.CurrentRow.SetValue("UZAWE", ErpInfoList[i].Uzawe);//40 } for (int y = 0; y < table.RowCount; y++) { table.CurrentIndex = y; MessageBox.Show("执行函数前 CHECK:" + table.CurrentRow.GetValue("CHECK").ToString() + " BLDAT:" + table.CurrentRow.GetValue("BLDAT").ToString()); } companyBapi.SetValue("ITAB_01", table);//将表对象实例赋给参数 companyBapi.Invoke(dest); //执行函数 string MAKTX = companyBapi.GetValue("RETURN_MSG").ToString(); //获取输出参数 MessageBox.Show("SAP的返回信息:" + MAKTX); //IRfcTable table2 = companyBapi.GetTable("ITAB_01"); var table3 = (IRfcTable)companyBapi.GetValue("ITAB_01"); var result = table3.AsEnumerable() .Select(row => new { CHECK = row.GetValue("CHECK"), BLDAT = row.GetValue("BLDAT") }).ToList(); } catch (Exception ex) { MessageBox.Show("程序处理异常:" + ex.Message); } finally { } 这样无论我是用 table2 的方式还是用 table3的方式 再次去获得这个表对象的时候 获得的CHECK字段都是没有变化
关于c语言 fopen触发断点问题,求大神解惑
数据结构作业要构造huffman树并输出文件,但是过程遇到问题,困了好几天没能解决。 ![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149416_706766.png)![图片说明](https://img-ask.csdn.net/upload/201910/15/1571149429_15842.png) 如图,我尝过许多方法,文件名字符串双斜杠试过,作为变量传入也试过,但是都会发生这样的情况。但是更让我难以理解的是偶尔会成功打开并且成功写入,这就让我不知道要从哪里找问题了。 部分代码如下,程序还未完成但是可以调试部分功能了 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #define ERROR 0 #define OK 1 typedef int status; typedef struct { unsigned int weight; unsigned parent, lchild, rchild; }HTNode, *HuffmanTree; typedef char **HuffmanCode; void Get_Info(int *n, char **charset, int **w) { printf("请输入字符集大小:"); scanf("%d", n); getchar(); int i, m = 2 * (*n) - 1; *charset = (char*)malloc((*n) * sizeof(char)); *w = (int*)malloc((*n) * sizeof(int)); for (i = 0; i < *n; i++) { printf("请输入第%d个字符及其权值(中间用空格隔开):", i + 1); scanf("%c", (*charset)+i); getchar(); scanf("%d", (*w)+i); getchar(); } } void Select(HuffmanTree HT, int m, int *s1, int *s2) { //s1.w<s2.w int i, temp, tag = 1; HuffmanTree p; for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->parent == 0 && tag == 1) { *s1 = i; tag++; } else if (p->parent == 0 && tag == 2) { //没加else,导致同时执行 *s2 = i; break; } } if (HT[*s1].weight > HT[*s2].weight) { temp = *s1; *s1 = *s2; *s2 = temp; } for (i = 1, p = HT + 1; i <= m; p++, i++) { if (p->weight < HT[*s1].weight && p->parent == 0) { *s2 = *s1; *s1 = i; } else if (p->weight < HT[*s2].weight && p->weight != HT[*s1].weight && p->parent == 0) *s2 = i; } } void CreateHT(HuffmanTree *HT, int n, char *charset, int* w, char treefilename[]) { int i, m; int s1, s2; FILE *Huffman; HuffmanTree p; //初始化 m = 2 * n - 1; (*HT) = (HuffmanTree)malloc((m + 1) * sizeof(HuffmanCode)); for (p = *HT + 1, i = 1; i <= m; i++, p++) { p->weight = 0; p->parent = 0; p->lchild = 0; p->rchild = 0; } for (p = *HT + 1, i = 1; i <= n; i++, p++, w++) p->weight = *w; //建Huffman树 for (i = n + 1; i <= m; i++) { //调试分析1:写成i = 1,发生错误。 Select(*HT, i - 1, &s1, &s2); /*调试分析3:刚开始设置为i,导致select函数多找一位,Huffman树生成错误,应为i-1*/ (*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight; (*HT)[i].lchild = s1; (*HT)[i].rchild = s2; (*HT)[s1].parent = i; (*HT)[s2].parent = i; } //输出到Huffman文件 Huffman = fopen(treefilename, "w"); fprintf(Huffman, "W P L R\n"); for (i = 1; i <= m; i++) fprintf(Huffman, "%d %d %d %d\n", (*HT)[i].weight, (*HT)[i].parent, (*HT)[i].lchild, (*HT)[i].rchild); fclose(Huffman); } void Coding(HuffmanTree HT,HuffmanCode *HC, int n) { int start; unsigned int c, f; char *cd; (*HC) = (HuffmanCode)malloc((n + 1) * sizeof(char*)); cd = (char*)malloc(n * sizeof(char)); cd[n - 1] = '\0'; for (int i = 1; i <= n; ++i) { start = n - 1; for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent) { if (HT[f].lchild == c) cd[--start] = '0'; else cd[--start] = '1'; } (*HC)[i] = (char*)malloc((n - start) * sizeof(char)); strcpy((*HC)[i], &cd[start]); } free(cd); } status CodeFile(HuffmanCode HC, char *textfilename, char *codefilename, char *charset) { FILE *CodeFile, *TextFile; char text[1000],code[5000]; int length = 0, i, j; TextFile = fopen(textfilename, "r"); if (TextFile == NULL) { printf("正文文件不存在。请重试\n"); return ERROR; } while ((text[length] = fgetc(TextFile)) != EOF) length++; fclose(TextFile); CodeFile = fopen(codefilename, "w"); for (i = 0; i < length; i++) { j = 0; while (charset[j] != text[i]) j++; j++; fputs(HC[j], CodeFile); } fclose(CodeFile); return OK; } status Get_HT(HuffmanTree *HT, char *treefilename, int *n) { int status; char garbage[100]; FILE *Huffman; HuffmanTree p ,q; (*n) = 0; p = (HuffmanTree)malloc(sizeof(HuffmanCode)*2); Huffman = fopen(treefilename, "r"); if (Huffman == NULL) { printf("文件不存在!"); status = ERROR; } else { (*HT) = (HuffmanTree)malloc(sizeof(HTNode)); for (int i = 0; i < 100;i++) { fgets(garbage, 37, Huffman); puts(garbage); printf("*%d*", i); } while ((fscanf(Huffman ,"%d %d %d %d", &(p[*n+1].weight), &(p[*n + 1].parent), &(p[*n + 1].lchild), &(p[*n + 1].rchild)))!=EOF) {//eof标识文件输入结束 (*n)++; printf("%d %d %d %d\n", p[*n + 1].weight, p[*n + 1].parent, p[*n + 1].lchild, p[*n + 1].rchild); p = (HuffmanTree)realloc(p, sizeof(HuffmanCode)*(*n + 2)); } (*HT) = p; status = OK; } return status; } int main() { char *charset, treefilename[40], codefilename[40], textfilename[40], c; int i, n, *w, status; int op; HuffmanTree HT = NULL; HuffmanCode HC = NULL; printf("姓名:陈志涛 学号:2018051234 时间:2019/10/10\n"); printf("=======================Huffman编码=======================\n"); printf("操作说明:请输入操作序号,并根据提示输入\n"); printf("菜 单:1、构建Huffman树\n"); printf(" 2、编码\n"); printf(" 3、译码\n"); printf(" 4、退出程序\n"); do { printf("\n>>>请输入操作序号:"); scanf("%d", &op); getchar(); switch (op){ case 1: Get_Info(&n, &charset, &w); printf("请输入Huffman树的文件存储地址:"); gets_s(treefilename); CreateHT(&HT, n, charset, w, treefilename); printf("Huffman树构建并保存成功。\n"); break; case 2: if (HT == NULL) { printf("当前未构建Huffman树,是否从文件中读取(Y/N)?"); scanf("%c", &c); getchar(); if (c == 'Y' || c == 'y') { printf("请输入Huffman文件存储地址:"); gets_s(treefilename); status = Get_HT(&HT, treefilename, &n); if (status == ERROR) { printf("获取Huffman树失败,请检查。"); break; } } else break; } Coding(HT, &HC, n); printf("请输入正文文件的存储地址:"); gets_s(textfilename); printf("请输入Huffman编码的目标存储地址:"); gets_s(codefilename); CodeFile(HC, textfilename, codefilename, charset); break; } printf("\n"); } while (1); system("pause"); return 0; } ``` 希望有好心人帮帮忙解惑
图像边缘检测用VC如何实现
这个程序我调不对,求大神帮忙 怎么实现把老师给的图检测出来,还有就是这个程序用VC建立什么类型的工程和文件 #define ff(x,y) pBmpBuf0[256*(y)+(x)] #define gg(x,y) pBmpBuf9[256*(y)+(x)] #include <windows.h> #include <stdio.h> #include <fstream.h> #include <math.h> unsigned char *pBmpBuf;//读入图像数据的指针 int bmpWidth;//图像的宽 int bmpHeight;//图像的高 RGBQUAD *pColorTable;//颜色表指针 int biBitCount;//图像类型,每像素位 //读图像的位图数据,宽,高,颜色表及每像素位等数据进内存,存放在相应的全局变量中 bool readBmp(char*bmpName) { FILE*fp=fopen(bmpName,"rb");//二进制读方式打开指定的图像文件 if(fp==0) return 0; //跳过图像文件头结构BITMAPFILEHEADER fseek(fp,sizeof(BITMAPFILEHEADER),0); //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中 BITMAPFILEHEADER head; fread(&head,sizeof(BITMAPFILEHEADER),1,fp);//获取图像宽,高,每像素所占位数等信息 bmpWidth=head.biWidth; bmpHeight=head.biHeight; biBitCount=head.biBitCount; //定义变量,计算图像每行像素所占的字节数(必须是4的倍数) int lineByte=(bmpWidth*biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表项为256 if(biBitCount==8) { //申请颜色表所需要的空间,读颜色表进内存 pColorTable=new RGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp); } //申请位图数据所需要的空间,读位图数据内存 pBmpBuf=new unsigned char[lineByte*bmpHeight]; fread(pBmpBuf,1,lineByte*bmpHeight,fp); fclose(fp);//关闭文件 return 1;//读取文件成功 } //给定一个图像位图数据,宽,高,颜色表指针以及每像素所占的位数等信息,将其写到指定文件中 bool saveBmp (char*bmpName,unsigned char *imgBuf,int width,int height,int biBitCount,RGBQUAD*pColorTable) { //如果位图数据指针为0,则没有数据传入,函数返回 if(!imgBuf) return 0; //颜色表大小,以字节为单位,灰度图颜色表为1024字节 int colorTablesize=0; if(biBitCount==8) colorTablesize=1024; //待存储图像数据每行字节数为4的倍数 int lineByte=(width*biBitCount/8+3)/4*4; //以二进制写的方式打开文件 FILE*fp=fopen(bmpName,"wb"); if(fp==0) return 0; //申请位图文件头结构变量,填写文件头信息 BITMAPFILEHEADER fileHead; fileHead.bfType=0x4D42;//bmp类型 //bfsize是图像文件4个组成部分之和 fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height; fileHead.bfReservedl=0; fileHead.bfReserved2=0; //bfOffBits是图像文件前3个部分所需空间之和 fileHead.bfOffBits=54+colorTablesize; //写文件头进文件 fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp); //申请位图信息头结构变量,填写信息头信息 BITMAPINFOHEADER head; head.biBitCount=biBitCount; head.biClrImportant=0; head.biClrUsed=0; head.biCompression=0; head.biHeight=height; head.biPlanes=1; head.biSize=40; head.biSizeImage=lineByte*height; head.biWidth=width; head.biXPelsPerMeter=0; head.biYPelsPerMeter=0; //写位图信息头进内存 fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp); //如有灰度图像,有颜色表,写入文件 fwrite(pColorTable,sizeof(RGBQUAD),256,fp); //写进位图数据进文件 fwrite(imgBuf,height*lineByte,1,fp); //关闭文件 fclose(fp); return 1; } //各边缘检测算子算法实现 // 函数声明 void roberts(unsigned char *pBmpBufroberts); void sobel(unsigned char *pBmpBufsobel); void robinson(unsigned char *pBmpBufrobinson); void prewitt(unsigned char *pBmpBufprewitt); void main() { //读入指定BMP文件进内存 char readPath[]="c:/text.BMP"; readBmp(readPath); //输出图像信息 printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount); //函数调用 roberts(pBmpBuf); sobel(pBmpBuf); robinson(pBmpBuf); prewitt(pBmpBuf); //清楚缓冲区,pBmpBuf和pcolorTable是全局变量在文件读入时申请的空间 delete []pBmpBuf; delete []pColorTable; } //各函数定义 //roberts算子 void roberts(unsigned char *pBmpBufroberts) { unsigned char *pBmpBuf0; unsigned char *pBmpBuf9[256*256]; int ix,iy,vx,vy,lx=256; pBmpBuf0=pBmpBufroberts; //模板1 for(ix=1;ix<255;ix++) { for(iy=1;iy<255;iy++) { vx=ff(ix+1,iy)-ff(ix,iy); vy=ff(ix,iy+1)-ff(ix,iy); gg(ix,iy)=abs(vx)+abs(vy); } } //将数据图像存盘 char writePath[]="textroberts1.BMP"; saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable); //模板2 for(ix=1;ix<255;ix++) for(iy=1;iy<255;iy++) { vx=ff(ix,iy)-ff(ix+1,iy+1); vy=ff(ix+1,iy)-ff(ix,iy+1); gg(ix,iy)=abs(vx)+abs(vy); } //将图像数据存盘 char writePath2[]="textroberts2.BMP"; saveBmp(writePath2,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable); } //robinson void robinson(unsigned char *pBmpBufrobin) { unsigned char *pBmpBuf0; pBmpBuf0=pBmpBufrobin; unsigned char pBmpBuf9[256*256]; int ix,iy,mx,my,jx,jy,jpv,mxav,im; static int mask [8][3][3]= {1,2,1,0,0,0,-1,-2,-1, 0,1,2,-1,0,1,-2,-1,0, -1,0,1,-2,0,2,-1,0,1, -2,-1,0,-1,0,1,0,-1,2, -1,-2,-1,0,0,0,1,2,1, 0,-1,-2,1,0,-1,2,1,0, 1,0,-1,2,0,2,1,0,-1, 2,1,01,0,-1,0,-1,-2, }; for(ix=1;ix<255;ix++) for(iy=1;iy<255;iy++) { for(im=0;im<=7;im++) { jpv=0; mxav=0; for(mx=0;mx<=2;mx++) { jx=ix-1+mx; for(my=0;my<=2;my++) { jy=iy-1+my; jpv=jpv+ff(jx,jy)*mask[im][mx][my]; } } if((jpv>mxav)||(im==0))mxav=jpv; } gg(ix,iy)=mxav; } char writePath[]="textrobinson.BMP"; saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable); } //prewitt void prewitt(unsigned char *pBmpBufprewitt) { unsigned char *pBmpBuf0; pBmpBuf0=pBmpBufprewitt; unsigned char *pBmpBuf9[256*256]; int ix,iy,im,mx,my; int jx,jy,jpv,mxav; static int mask[8][3][3]= { 1,1,1,1,-2,1,-1,-1,-1, 1,1,1,-1,-2,1,-1,-1,1, -1,1,1,-1,-2,1,-1,1,1, -1,-1,-1,-1,-2,1,1,1,1, 1,-1,-1,1,-2,,1,1,1,1, 1,1,1,1,-2,1,-1,-1,-1, 1,1,-1,1,-2,-1,1,1,-1, 1,1,1,1,-2,-1,1,-1,-1, }; for(ix=1;ix<255;ix++) for(iy=1;iy<255;iy++) { for(im=0;im<=7;im++) { jpv=0; mxav=0; for(mx=0;mx<=2;mx++) { jx=ix-1+mx; for(my=0;my<=2;my++) { jy=iy-1+my; jpv=jpv+ff(jx,jy)*mask[im][mx][my]; } } if((jpv>mxav)||(im==0))mxav=jpv; } gg(ix,iy)=mxav; } //将数据图像存盘 char writePath[]="textprewitt.BMP"; saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable) }; //sobel void sobel(unsigned char *pBmpBufsobel) { unsigned char *pBmpBuf0; unsigned char *pBmpBuf9[256*256]; int ix,iy,vx,vy,lx=256; pBmpBuf0=pBmpBufsobel; for(ix=1;ix<255;ix++) { for(iy=1;iy<255;iy++) { vx=(ff(ix-1,iy-1)+2*ff(ix-1,iy)+ff(ix-1,iy+1))-(ff(ix+1,iy-1)+2*ff(ix+1,iy)+ff(ix=1,iy+1)); vy=(ff(ix-1,iy-1)+2*ff(ix,iy-1)+ff(ix+1,iy-1))-(ff(ix-1,iy+1)+2*ff(ix,iy+1)+ff(ix+1,iy+1)); gg(ix,iy)=abs(vx)+abs(vy); } } //将数据图像存盘 char writePath[]="textsobel.BMP"; saveBmp(writePath,pBmpBuf9,bmpWidth,bmpHeight,biBitCount,pColorTable); }
ServletContextListener监听器在liunx下的工作异常?
我在web应用下写了一个监听器,这个监听器应在tomcat启动前执行,即tomcat打印出Server startup in xxxx ms前执行。监听器定时轮询启动一个任务,任务里派生多个线程去多个数据库读取数据,最后汇总数据得到结果,。有时数据库可能连接不通,因此有异常扑获代码,在window下该代码可以扑获异常,让这个监听器执行完毕。但在liunx下监听器没有扑获异常导致监听器没有执行完毕,导致程序出错,window和liunx的tomcat相同,唯一不同的时系统环境和tomcat启动的脚本一个.sh一个.bat [b]问题补充:[/b] to lovewhzlq:有啥解决办法吗 [b]问题补充:[/b] to lovewhzlq:可能是我的线程模型有问题,我用timetask执行一个任务,在任务的run方法里调用一个方法,该方法派生多个线程,然后再run方法里获取结果 [b]问题补充:[/b] to lovewhzlq:我搜了一下这个包好像很好用,不过这个包可以屏蔽window和liunx下系统线程调度的差异吗,每个run方法的异常如何扑获吗? [b]问题补充:[/b] to lovewhzlq:不知道ServletContextListener和这个concurrent包可以集成在一起用吗,我要研究一下 [b]问题补充:[/b] to lovewhzlq:我的线程模型里每个线程执行时,要传入不同的参数,这个用java.util.concurrent那个接口比较好 [b]问题补充:[/b] to lovewhzlq:我用了包还有这个问题 [b]问题补充:[/b] to lovewhzlq:我把出问题的代码等到tomcat启动后在liunx下执行也是好用,意思即是用SelvletContextListener在linux下启动tomcat时有问题 [b]问题补充:[/b] to 各位:有招吗,我没招了,在liunx下就挂住了,连接池初始化不了 [b]问题补充:[/b] to lovewhzlq:可以在struts的action里启动定时器吗 [b]问题补充:[/b] to lovewhzlq:我感觉关键还不是在调度,而是liunx下扑获数据库连接异常用时太长,导致僵死在那里
PHP网站语句如何优化,希望和高手一起探讨下
我的网站是PHP网站,使用的数据库是MySQL 的目前直接用网上的采集插件出现了很多慢查询和扫全表的动作,自己也在对应的表里建立了普通索引,但还是无法得到解决,一直报错在SQL语句里,对于这块本人学习尚浅。 MySQL引擎是InnoDB,下面是索引截图: ![图片说明](https://img-ask.csdn.net/upload/201906/16/1560632068_941383.jpg) 报错语句: select url from ve123_links_temp where url like 'jmw.com.cn%' UPDATE `ve123_links_temp` SET `no_id`='1' WHERE url='http://app.hiapk.com/hiapk/about/agreement' 还请各位高手指点迷津,到底如何优化 语句: <?php //抓全站--- 多线程 function all_links_duo($site_id,$ceng,$include_word,$not_include_word) { global $db; $new_url=array(); $fenge=array(); $nei=1;//1代表只收内链 2代表外链 空代表所有 $numm=2;//开启多少线程 echo "<br><b>开始抓取第".$ceng."层</b><br>"; $ceng++; $row=$db->get_one("select * from ve123_links_temp where site_id='".$site_id."' and no_id='0'"); if(empty($row)){echo " ---------- 没有新链接了<br>";return;}//如果找不到新增加url,则结束 $query=$db->query("select * from ve123_links_temp where site_id='".$site_id."' and no_id='0'"); while($row=$db->fetch_array($query)) { $new_url[]=$row[url]; } $he_num = ceil(count($new_url)/$numm);//计算需要循环多少次 $fenge=array_chunk($new_url,$numm);//把数组分割成多少块数组 每块大小$numm /* echo "一共多少个"; echo count($new_url); echo "需要循环"; echo $he_num; echo "次<br>"; */ for($i=0;$i<=$he_num;$i++) { /*echo "开始循环第 ".$i." 次<br>"; print_r($fenge[$i]); echo "<br>";*/ $fen_url = array(); $fen_url = cmi($fenge[$i]); //需要把得到的数组 (数组只包括 网址和源码) 分析 写入数据库 , /*echo "<b>本次抓完的网址为</b>"; print_r($fen_url[url]); echo "<br>";*/ foreach ((array)$fen_url as $url => $file) { $links = array(); $temp_links = array(); $cha_temp = array(); $loy = array(); $new_links = array(); $cha_links = array(); $cha_links_num = array(); $links = _striplinks($file); //从htmlcode中提取网址 $links = _expandlinks($links, $url); //补全网址 $links=check_wai($links,$nei,$url); $links=array_values(array_unique($links)); $bianma = bianma($file); //获取得到htmlcode的编码 $file = Convert_File($file,$bianma); //转换所有编码为gb2312 $loy = clean_lry($file,$url,"html"); $title=$loy["title"]; //从数组中得到标题,赋值给title $pagesize=number_format(strlen($file)/1024, 0, ".", ""); $fulltxt=Html2Text($loy["fulltext"]); $description=$loy["description"]; //从数组中得到标题,赋值给description $keywords=$loy["keywords"]; //从数组中得到标题,赋值给keywords $lrymd5=md5($fulltxt); $updatetime=time(); if($title==""){$title=str_cut($fulltxt,65); } //根据url,更新内容 $array=array('lrymd5'=>$lrymd5,'title'=>$title,'fulltxt'=>$fulltxt,'description'=>$description,'keywords'=>$keywords,'pagesize'=>$pagesize,'updatetime'=>$updatetime); $db->update("ve123_links",$array,"url='".$url."'"); $all_num = count($links); //开始读取 ve123_links_temp 中所有site_id 为$site_id 的url 然后和抓取的 $links 数组比较,将得到的差集创建到 ve123_links_temp 中 $query=$db->query("select url from ve123_links_temp where url like '%".getdomain($url)."%'"); while($row=$db->fetch_array($query)) { $temp_links[]=rtrim($row[url],"/"); } $cha_temp=array_diff($links,$temp_links); foreach((array)$cha_temp as $value) { if(check_include($value, $include_word, $not_include_word )) { $arral=array('url'=>$value,'site_id'=>$site_id); $db->insert("ve123_links_temp",$arral); } } //开始读取 ve123_links 中所有site_id 为 $site_id 的url 然后和抓取的 $links 数组比较,将得到的差集创建到 ve123_links 中 合集则输出 已存在了 $query=$db->query("select url from ve123_links where url like '%".getdomain($url)."%'"); while($row=$db->fetch_array($query)) { $new_links[]=rtrim($row[url],"/"); } $cha_links=array_diff($links,$new_links); foreach((array)$cha_links as $value) { if(check_include($value, $include_word, $not_include_word )) { $array=array('url'=>$value,'site_id'=>$site_id,'level'=>'1'); $db->insert("ve123_links",$array); $cha_links_num[]=$value; } } $cha_num = count($cha_links_num); printLinksReport($cha_num, $all_num, $cl=0); echo "<a href=".$url." target=_blank>".$url. "</a><br>"; $arral=array('no_id'=>1); $db->update("ve123_links_temp",$arral,"url='$url'"); ob_flush(); flush(); } } all_links_duo($site_id,$ceng,$include_word,$not_include_word);//再次调用本函数开始循环 } //一键找站 function find_sites($site_id,$ceng) { global $db; $new_url=array(); $fenge=array(); $numm=20;//开启多少线程 echo "<br><b>开始抓取第".$ceng."层</b><br>"; $ceng++; $row=$db->get_one("select * from ve123_sites_temp where site_id='".$site_id."' and no_id='0'"); if(empty($row)){echo " ---------- 没有新链接了<br>";return;}//如果找不到新增加url,则结束 $query=$db->query("select * from ve123_sites_temp where site_id='".$site_id."' and no_id='0'"); while($row=$db->fetch_array($query)) { $new_url[]=$row[url]; } $he_num = ceil(count($new_url)/$numm);//计算需要循环多少次 $fenge=array_chunk($new_url,$numm);//把数组分割成多少块数组 每块大小$numm for($i=0;$i<=$he_num;$i++) { $fen_url = array(); $fen_url = cmi($fenge[$i]); //需要把得到的数组 (数组只包括 网址和源码) 分析 写入数据库 , foreach ((array)$fen_url as $url => $file) { $links = array(); $fen_link = array(); $nei_link = array(); $wai_link = array(); $new_temp = array(); $cha_temp = array(); $new_site = array(); $cha_site = array(); $new_lik = array(); $cha_lik = array(); $links = _striplinks($file); //从htmlcode中提取网址 $links = _expandlinks($links, $url); //补全网址 $fen_link=fen_link($links,$url); //把内链和外链分开 $nei_link=array_values(array_unique($fen_link[nei])); //过滤内链 重复的网址 $wai_link=GetSiteUrl($fen_link[wai]); //把外链都转换成首页 $wai_link=array_values(array_unique($wai_link)); //过滤外链 重复的网址 //读出 ve123_sites_temp 中所有 site_id=-1 and no_id=0 $query=$db->query("select url from ve123_sites_temp where site_id='".$site_id."'"); while($row=$db->fetch_array($query)) { $new_temp[]=$row[url]; } $cha_temp=array_diff($nei_link,$new_temp);//与内链进行比较 得出差集 //将差集创建到 ve123_sites_temp 中 foreach((array)$cha_temp as $value) { $arral=array('url'=>$value,'site_id'=>$site_id,'no_id'=>0); $db->insert("ve123_sites_temp",$arral); } //读出 ve123_sites 中所有 site_id=-1 global $db; $query=$db->query("select url from ve123_sites where site_no='".$site_id."'"); while($row=$db->fetch_array($query)) { $new_site[]=$row[url]; } $cha_site=array_diff($wai_link,$new_site);//与外链进行比较 得出差集 //将差集创建到 ve123_sites 中 foreach((array)$cha_site as $value) { $arral=array('url'=>$value,'site_no'=>$site_id); $db->insert("ve123_sites",$arral); } //读出 ve123_links 中所有 site_id=-1 global $db; global $db; $query=$db->query("select url from ve123_links where site_id='".$site_id."'"); while($row=$db->fetch_array($query)) { $new_lik[]=$row[url]; } $cha_lik=array_diff($wai_link,$new_lik);//与外链进行比较 得出差集 //将得到的差集 创建到 ve123_links foreach ((array)$cha_lik as $value) { $array=array('url'=>$value,'site_id'=>$site_id); $db->insert("ve123_links",$array); echo "<font color=#C60A00><b>抓取到:</b></font>"; echo "<a href=".$value." target=_blank>".$value."</a><br>"; } $arral=array('no_id'=>1); $db->update("ve123_sites_temp",$arral,"url='$url'"); ob_flush(); flush(); } } find_sites($site_id,$ceng);//再次调用本函数开始循环 } //一键更新 已抓站 function Update_sites($site_id) { global $db; $numm=20;//开启多少线程 $new_url = array(); $fenge = array(); $query=$db->query("select url from ve123_links where site_id='".$site_id."' and length(lrymd5)!=32"); while($row=$db->fetch_array($query)) { $new_url[]=$row[url]; } $he_num = ceil(count($new_url)/$numm);//计算需要循环多少次 $fenge=array_chunk($new_url,$numm);//把数组分割成多少块数组 每块大小$numm for($i=0;$i<=$he_num;$i++) { $fen_url = array(); $fen_url = cmi($fenge[$i]); //需要把得到的数组 (数组只包括 网址和源码) 分析 写入数据库 , foreach ((array)$fen_url as $url => $file) { $links = array(); $temp_links = array(); $cha_temp = array(); $loy = array(); $new_links = array(); $cha_links = array(); $cha_links_num = array(); $bianma = bianma($file); //获取得到htmlcode的编码 $file = Convert_File($file,$bianma); //转换所有编码为gb2312 if($file==-1) {echo "<b><font color=#C60A00>抓取失败</b></font> ".$url."<br>"; continue;} $loy = clean_lry($file,$url,"html"); //设置分析数组 $title=$loy["title"]; //从数组中得到标题,赋值给title $pagesize=number_format(strlen($file)/1024, 0, ".", ""); $fulltxt=Html2Text($loy["fulltext"]); $description=$loy["description"]; //从数组中得到标题,赋值给description $keywords=$loy["keywords"]; //从数组中得到标题,赋值给keywords $lrymd5=md5($fulltxt); $updatetime=time(); if($title==""){$title=str_cut($fulltxt,65); } //根据url,更新内容 echo "<b><font color=#0Ae600>已更新</font></b>"; echo $title; echo "<a href=".$url." target=_blank>".$url. "</a><br>"; $array=array('lrymd5'=>$lrymd5,'title'=>$title,'fulltxt'=>$fulltxt,'description'=>$description,'keywords'=>$keywords,'pagesize'=>$pagesize,'updatetime'=>$updatetime); $db->update("ve123_links",$array,"url='".$url."'"); } } } //一键找站 暂时不用的 function find_sites_($url) { $oldtime=time(); $site_id = -1; $numm=10; $links=array(); $fen_link=array(); $lrp =array(); $nei_link =array(); $wai_link =array(); $new_temp =array(); $cha_temp =array(); $new_site =array(); $cha_site =array(); $new_lik =array(); $cha_lik =array(); $fenge =array(); $lrp = cmi($url); $links = _striplinks($lrp[$url]); //从htmlcode中提取网址 $links = _expandlinks($links, $url); //补全网址 $fen_link=fen_link($links,$url); //把内链和外链分开 $nei_link=array_values(array_unique($fen_link[nei])); //过滤内链 重复的网址 $wai_link=GetSiteUrl($fen_link[wai]); //把外链都转换成首页 $wai_link=array_values(array_unique($wai_link)); //过滤外链 重复的网址 /*print_r($nei_link); echo "<br><br>"; print_r($wai_link);*/ //读出 ve123_sites_temp 中所有 site_id=-1 and no_id=0 global $db; $query=$db->query("select url from ve123_sites_temp where site_id='-1' and no_id='0'"); while($row=$db->fetch_array($query)) { $new_temp[]=$row[url]; } $cha_temp=array_diff($nei_link,$new_temp);//与内链进行比较 得出差集 //将差集创建到 ve123_sites_temp 中 foreach((array)$cha_temp as $value) { $arral=array('url'=>$value,'site_id'=>$site_id,'no_id'=>0); $db->insert("ve123_sites_temp",$arral); } //读出 ve123_temp 中所有 site_id=-1 global $db; global $db; $query=$db->query("select url from ve123_sites where site_no='-1'"); while($row=$db->fetch_array($query)) { $new_site[]=$row[url]; } $cha_site=array_diff($wai_link,$new_site);//与外链进行比较 得出差集 //将差集创建到 ve123_sites 中 foreach((array)$cha_site as $value) { $arral=array('url'=>$value,'site_no'=>$site_id); $db->insert("ve123_sites",$arral); } //读出 ve123_links 中所有 site_id=-1 global $db; global $db; $query=$db->query("select url from ve123_sites where site_id='-1'"); while($row=$db->fetch_array($query)) { $new_lik[]=$row[url]; } $cha_lik=array_diff($wai_link,$new_lik);//与外链进行比较 得出差集 //将得到的差集 创建到 ve123_links $he_num = ceil(count($cha_lik)/$numm);//计算需要循环多少次 $fenge=array_chunk($cha_lik,$numm);//把数组分割成多少块数组 每块大小$numm for($i=0;$i<=$he_num;$i++) { $fen_url = array(); $fen_url = cmi($fenge[$i]); //多线程开始采集 foreach ((array)$fen_url as $url => $file) { $bianma = bianma($file); //获取得到htmlcode的编码 $file = Convert_File($file,$bianma); //转换所有编码为gb2312 $loy = clean_lry($file,$url,"html"); //过滤 file 中标题等 到数组 $title=$loy["title"]; //从数组中得到标题,赋值给title $pagesize=number_format(strlen($file)/1024, 0, ".", ""); $fulltxt=Html2Text($loy["fulltext"]); $description=$loy["description"]; //从数组中得到标题,赋值给description $keywords=$loy["keywords"]; //从数组中得到标题,赋值给keywords $lrymd5=md5($fulltxt); $updatetime=time(); if($title==""){$title=str_cut($fulltxt,65); } //根据url,更新内容 $array=array('url'=>$value,'lrymd5'=>$lrymd5,'title'=>$title,'fulltxt'=>$fulltxt,'description'=>$description,'keywords'=>$keywords,'pagesize'=>$pagesize,'updatetime'=>$updatetime); $db->insert("ve123_links",$array); echo "<font color=#C60A00><b>抓取到:</b></font>".$title; echo "<a href=".$url." target=_blank>".$url."</a><br>"; } } $newtime=time(); echo " --- <b>用时:</b>"; echo date("H:i:s",$newtime-$oldtime-28800); echo "<br>"; del_links_temp($site_id); } //抓全站--- 单线程 function all_url_dan($url,$old,$nei,$ooo,$site_id,$include_word,$not_include_word) { if(!is_url($url)) { return false;} global $db,$config; $snoopy = new Snoopy; //国外snoopy程序 $snoopy->fetchlry($url); $links=$snoopy->resulry; if(!is_array($links)) {return;} $links=check_wai($links,$nei,$url); $links=array_values(array_unique($links)); $title=$snoopy->title; $fulltxt=$snoopy->fulltxt; $lrymd5=md5($fulltxt); $pagesize=$snoopy->pagesize; $description=$snoopy->description; $keywords=$snoopy->keywords; $updatetime=time(); if($title==""){$title=str_cut($fulltxt,65); } //读取url,更新内容 $array=array('lrymd5'=>$lrymd5,'title'=>$title,'fulltxt'=>$fulltxt,'description'=>$description,'keywords'=>$keywords,'pagesize'=>$pagesize,'updatetime'=>$updatetime); $db->update("ve123_links",$array,"url='".$url."'"); $all_num = count($links); $temp_links=array(); $cha_temp=array(); //开始读取 ve123_links_temp 中所有site_id 为$site_id 的url 然后和抓取的 $links 数组比较,将得到的差集创建到 ve123_links_temp 中 $query=$db->query("select url from ve123_links_temp where url like '%".getdomain($url)."%'"); while($row=$db->fetch_array($query)) { $temp_links[]=rtrim($row[url],"/"); } $cha_temp=array_diff($links,$temp_links); foreach((array)$cha_temp as $value) { $arral=array('url'=>$value,'site_id'=>$site_id); $db->insert("ve123_links_temp",$arral); } //开始读取 ve123_links 中所有site_id 为 $site_id 的url 然后和抓取的 $links 数组比较,将得到的差集创建到 ve123_links 中 合集则输出 已存在了 $query=$db->query("select url from ve123_links where url like '%".getdomain($url)."%'"); while($row=$db->fetch_array($query)) { $new_links[]=rtrim($row[url],"/"); } $cha_links=array_diff($links,$new_links); $cha_num = count($cha_links); foreach((array)$cha_links as $value) { if(check_include($value, $include_word, $not_include_word )) { $array=array('url'=>$value,'site_id'=>$site_id,'level'=>'1'); $db->insert("ve123_links",$array); } } printLinksReport($cha_num, $all_num, $cl=0); echo "<a href=".$old." target=_blank>".$old. "</a>"; ob_flush(); flush(); } //抓全站--- 单线程---不用的 function add_all_url_ ($url,$old,$numm,$ooo,$site_id,$include_word,$not_include_word) { if(!is_url($url)) { return false;} global $db,$config; $snoopy = new Snoopy; //国外snoopy程序 $snoopy->fetchlry($url); $links=$snoopy->resulry; if(!is_array($links)) {return;} $links=check_wai($links,$numm,$url); $links=array_values(array_unique($links)); $title=$snoopy->title; $fulltxt=$snoopy->fulltxt; $lrymd5=md5($fulltxt); $pagesize=$snoopy->pagesize; $description=$snoopy->description; $keywords=$snoopy->keywords; $updatetime=time(); if($title==""){$title=str_cut($fulltxt,65); } //读取url,更新内容 $array=array('lrymd5'=>$lrymd5,'title'=>$title,'fulltxt'=>$fulltxt,'description'=>$description,'keywords'=>$keywords,'pagesize'=>$pagesize,'updatetime'=>$updatetime); $db->update("ve123_links",$array,"url='".$url."'"); $all_num = count($links); $temp_links=array(); $cha_temp=array(); //开始读取 ve123_links_temp 中所有site_id 为$site_id 的url 然后和抓取的 $links 数组比较,将得到的差集创建到 ve123_links_temp 中 $query=$db->query("select url from ve123_links_temp where url like '%".getdomain($url)."%'"); while($row=$db->fetch_array($query)) { $temp_links[]=rtrim($row[url],"/"); } $cha_temp=array_diff($links,$temp_links); foreach((array)$cha_temp as $value) { $arral=array('url'=>$value,'site_id'=>$site_id); $db->insert("ve123_links_temp",$arral); } //开始读取 ve123_links 中所有site_id 为 $site_id 的url 然后和抓取的 $links 数组比较,将得到的差集创建到 ve123_links 中 合集则输出 已存在了 $query=$db->query("select url from ve123_links where url like '%".getdomain($url)."%'"); while($row=$db->fetch_array($query)) { $new_links[]=rtrim($row[url],"/"); } $he_links=array_intersect($links,$new_links); $he_num = count($he_links); $cha_links=array_diff($links,$new_links); $cha_num = count($cha_links); foreach((array)$cha_links as $value) { if(check_include($value, $include_word, $not_include_word )) { $array=array('url'=>$value,'site_id'=>$site_id,'level'=>'1'); $db->insert("ve123_links",$array); } } printLinksReport($cha_num, $all_num, $cl=0); echo "<a href=".$old." target=_blank>".$old. "</a>"; ob_flush(); flush(); } function printLinksReport($cha_num, $all_num, $cl) { global $print_results, $log_format; $cha_html = " <font color=\"blue\">页面包含<b>$all_num</b>条链接</font>。 <font color=\"red\"><b>$cha_num</b>条新链接。</font>\n"; $no_html = " <font color=\"blue\">页面包含<b>$all_num</b>条链接</font>。 没有新链接。\n"; if($cha_num==0) {print $no_html; flush();} else{print $cha_html;} } function add_links_insite($link,$old,$numm,$ooo,$site_id,$include_word,$not_include_word) { if(!is_url($link)) { return false; } global $db,$config; /* $spider=new spider; //系统自带蜘蛛 echo "<b>网站编码</b>(默认GB2312)<b>:"; $spider->url($link); echo "</b><br>"; $links= $spider->get_insite_links(); */ //$site_url=GetSiteUrl($link); $url_old=GetSiteUrl($old); echo "原始页=".$url_old." - - <"; echo "首层 id=".$site_id."> - - <"; echo "包含字段=".$include_word.">"; echo "<br>"; /*if($ooo==0) { $site=$db->get_one("select * from ve123_sites where url='".$url_old."'"); $site_id=$site["site_id"]; $include_word=$site["include_word"]; $not_include_word=$site["not_include_word"]; $spider_depth=$site["spider_depth"]; } */ $snoopy = new Snoopy; //国外snoopy程序 $snoopy->fetchlinks($link); $links=$snoopy->results; $links=check_wai($links,$numm,$link); $links=array_values(array_unique($links)); foreach((array)$links as $value) { $row=$db->get_one("select * from ve123_links_temp where url='".$value."'"); if(empty($row)) { $arral=array('url'=>$value,'site_id'=>$site_id); $db->insert("ve123_links_temp",$arral); } $value=rtrim($value,"/"); $row=$db->get_one("select * from ve123_links where url='".$value."'"); if (check_include($value, $include_word, $not_include_word )) { if(empty($row)&&is_url($value)) { echo "<font color=#C60A00><b>抓取到:</b></font>"; $array=array('url'=>$value,'site_id'=>$site_id,'level'=>'1'); $db->insert("ve123_links",$array); } else { echo "<b>已存在了:</b>";} echo "<a href=".$value." target=_blank>".$value. "</a><br>"; ob_flush(); flush(); //$row=$db->get_one("select * from ve123_links_temp where url='".$value."'"); // if(empty($row)&&is_url($value)) // { // $array=array('url'=>$value,'site_id'=>$site_id); // $db->insert("ve123_links_temp",$array); // } } } } //只保留内链或者外链 function check_wai($lry_all,$nei,$url) { $lry_nei=array();//站内链接数组 $lry_wai=array();//站外链接数组 $new_url=getdomain($url); if($nei=="") { foreach ((array)$lry_all as $value) { $lry_nei[]=rtrim($value,"/"); } return $lry_nei; } foreach ((array)$lry_all as $value) { if(getdomain($value)==$new_url) { $lry_nei[]=rtrim($value,"/"); //$lry_nei[]=$value; } else { $lry_wai[]=rtrim($value,"/"); } } if($nei==1){return $lry_nei;} if($nei==2){return $lry_wai;} } //把内链和外链分开 function fen_link($lry_all,$url) { $data=array();//站外链接数组 $new_url=getdomain($url); foreach ((array)$lry_all as $value) { if(getdomain($value)==$new_url) { $data['nei'][]=rtrim($value,"/"); } else { $data['wai'][]=rtrim($value,"/"); } } return $data; } function check_include($link, $include_word, $not_include_word) { $url_word = Array (); $not_url_word = Array (); $is_shoulu = true; if ($include_word != "") { $url_word = explode(",", $include_word); } if ($not_include_word != "") { $not_url_word = explode(",", $not_include_word); } foreach ($not_url_word as $v_key) { $v_key = trim($v_key); if ($v_key != "") { if (substr($v_key, 0, 1) == '*') { if (preg_match(substr($v_key, 1), $link)) { $is_shoulu = false; break; } } else { if (!(strpos($link, $v_key) === false)) { $is_shoulu = false; break; } } } } if ($is_shoulu && $include_word != "") { $is_shoulu = false; foreach ($url_word as $v_key) { $v_key = trim($v_key); if ($v_key != "") { if (substr($v_key, 0, 1) == '*') { if (preg_match(substr($v_key, 1), $link)) { $is_shoulu = true; break 2; } } else { if (strpos($link, $v_key) !== false) { $is_shoulu = true; break; } } } } } return $is_shoulu; } function add_links_site_fromtemp($in_url) { global $db; $domain=getdomain($in_url); $query=$db->query("select * from ve123_links_temp where url like '%".$domain."%' and no_id='0'"); while($row=$db->fetch_array($query)) { @$db->query("update ve123_links_temp set no_id='1' where url='".$row["url"]."'"); add_links_insite($row["url"],$row["url"],1,1); //sleep(3); } //sleep(5); add_links_site_fromtemp($in_url) ; } function insert_links($url) { global $db,$config; $spider=new spider; $spider->url($url); $links= $spider->links(); $sites= $spider->sites(); foreach($sites as $value) { $site_url=GetSiteUrl($link); $site=$db->get_one("select * from ve123_sites where url='".$site_url."'"); $site_id=$site["site_id"]; $row=$db->get_one("select * from ve123_links where url='".$value."'"); if(empty($row)&&is_url($value)) { echo $value."<br>"; $array=array('url'=>$value,'site_id'=>$site_id,'level'=>'0'); $db->insert("ve123_links",$array); } else { echo "已存在:".$value."<br>"; } ob_flush(); flush(); //sleep(1); $row=$db->get_one("select * from ve123_sites where url='".$value."'"); if(empty($row)&&is_url($value)) { $array=array('url'=>$value,'spider_depth'=>$config["spider_depth"],'addtime'=>time()); $db->insert("ve123_sites",$array); } } //sleep(1); foreach($links as $value) { $row=$db->get_one("select * from ve123_links_temp where url='".$value."'"); if(empty($row)&&is_url($value)) { $array=array('url'=>$value); $db->insert("ve123_links_temp",$array); } } } function GetUrl_AllSite($in_url) { global $db; $query=$db->query("select * from ve123_links_temp where url like '%".$in_url."%' and updatetime<='".(time()-(86400*30))."'"); while($row=$db->fetch_array($query)) { @$db->query("update ve123_links_temp set updatetime='".time()."' where url='".$row["url"]."'"); insert_links($row["url"]); //sleep(3); } //sleep(5); GetUrl_AllSite($in_url) ; } function Updan_link($url,$site_id) { global $db; $row=$db->get_one("select * from ve123_links_temp where url='".$url."'"); if(empty($row)) { $arral=array('url'=>$url,'site_id'=>$site_id); $db->insert("ve123_links_temp",$arral); } $row=$db->get_one("select * from ve123_links where url like '%".$url."%'"); if(empty($row)) { echo "<font color=#C60A00><b>抓取到:</b></font>".$url."<br>"; $array=array('url'=>$url,'site_id'=>$site_id,'level'=>'1'); $db->insert("ve123_links",$array); } else { echo "已存在:".$url."<br>"; } } function Updan_zhua($url,$site_id) { global $db; $lrp = array(); $links = array(); $fen_link = array(); $nei_link = array(); $new_temp = array(); $cha_temp = array(); $lrp = cmi($url); $links = _striplinks($lrp[$url]); //从htmlcode中提取网址 $links = _expandlinks($links, $url); //补全网址 $fen_link=fen_link($links,$url); //把内链和外链分开 $nei_link=array_values(array_unique($fen_link[nei])); //过滤内链 重复的网址 //读出 ve123_sites_temp 中所有 site_id=-1 and no_id=0 $query=$db->query("select url from ve123_sites_temp where site_id='".$site_id."'"); while($row=$db->fetch_array($query)) { $new_temp[]=$row[url]; } $cha_temp=array_diff($nei_link,$new_temp);//与内链进行比较 得出差集 //将差集创建到 ve123_sites_temp 中 foreach((array)$cha_temp as $value) { $arral=array('url'=>$value,'site_id'=>$site_id,'no_id'=>0); $db->insert("ve123_sites_temp",$arral); } } function Update_link($url) { global $db,$bug_url; $is_success=FALSE; $is_shoulu=FALSE; /*$spider=new spider; $spider->url($url); $title=$spider->title; $fulltxt=$spider->fulltxt; $lrymd5=md5($spider->fulltxt); $pagesize=$spider->pagesize; $keywords=$spider->keywords; $htmlcode=$spider->htmlcode; $description=$spider->description;*/ $snoopy = new Snoopy; //国外snoopy程序 $snoopy->fetchtext($url); $title=$snoopy->title; $fulltxt=$snoopy->fulltxt; $lrymd5=md5($fulltxt); $pagesize=$snoopy->pagesize; $description=$snoopy->description; $keywords=$snoopy->keywords; //echo "fulltxt=".$fulltxt."<br>"; $updatetime=time(); //$site_url=GetSiteUrl($url); //$site=$db->get_one("select * from ve123_sites where url='".$site_url."'"); //$site_id=$site["site_id"]; //echo "site_id".$site["site_id"]."<br>"; if($title==""){$title=str_cut($fulltxt,65); } echo "<b><font color=#0Ae600>已更新</font></b>"; echo $title; $array=array('lrymd5'=>$lrymd5,'title'=>$title,'fulltxt'=>$fulltxt,'description'=>$description,'keywords'=>$keywords,'pagesize'=>$pagesize,'updatetime'=>$updatetime); //$db->query("update ve123_links set updatetime='".time()."' where url='".$url."'"); //更新时间 //$s=array(); //$s=explode("?",$title); //$domain=GetSiteUrl($url); //$site=$db->get_one("select * from ve123_sites where url='".$domain."'"); $db->update("ve123_links",$array,"url='".$url."'"); $is_success=TRUE; if(empty($bug_url)) { exit(); } return $is_success; } function Update_All_Link_($in_url='',$days,$qiangzhi) { global $db; $new_url=array(); $fen_url=array(); $fenge=array(); $numm=20;//开启多少线程 //if($qiangzhi==0){ $lry="and strlen(lrymd5)!=32";} //else { ;} if(empty($in_url)) { $sql="select url from ve123_links where length(lrymd5)!=32 order by link_id desc"; } else { $sql="select url from ve123_links where url like '%".getdomain($in_url)."%' and length(lrymd5)!=32 order by link_id desc"; } echo $sql."<br>"; $query=$db->query($sql); while($row=$db->fetch_array($query)) { $new_url[]=$row[url]; } $he_num = ceil(count($new_url)/$numm);//计算需要循环多少次 //echo "<br><b>需要循环多少次=</b>".$he_num."<br>"; $fenge=array_chunk($new_url,$numm);//把数组分割成多少块数组 每块大小$numm for($i=0;$i<=$he_num;$i++) //for($i=0;$i<=1;$i++) { $fen_url=cmi($fenge[$i]); //需要把得到的数组 (数组只包括 网址和源码) 分析 写入数据库 , foreach ((array)$fen_url as $url => $file) { $bianma = bianma($file); //获取得到htmlcode的编码 $file = Convert_File($file,$bianma); //转换所有编码为gb2312 $lry = clean_lry($file,$url,"html"); $title=$lry["title"]; //从数组中得到标题,赋值给title $pagesize=number_format(strlen($file)/1024, 0, ".", ""); $fulltxt=Html2Text($lry["fulltext"]); $description=$lry["description"]; //从数组中得到标题,赋值给description $keywords=$lry["keywords"]; //从数组中得到标题,赋值给keywords $lrymd5=md5($fulltxt); $updatetime=time(); if($title==""){$title=str_cut($fulltxt,65); } echo "<b><font color=#0Ae600>已更新</font></b>"; echo $title; echo "<a href=".$url." target=_blank>".$url. "</a><br>"; $array=array('lrymd5'=>$lrymd5,'title'=>$title,'fulltxt'=>$fulltxt,'description'=>$description,'keywords'=>$keywords,'pagesize'=>$pagesize,'updatetime'=>$updatetime); $db->update("ve123_links",$array,"url='".$url."'"); } } } function cmi($links,$killspace=TRUE,$forhtml=TRUE,$timeout=6,$header=0,$follow=1){ $res=array();//用于保存结果 $mh = curl_multi_init();//创建多curl对象,为了几乎同时执行 foreach ((array)$links as $i => $url) { $conn[$url]=curl_init($url);//若url中含有gb2312汉字,例如FTP时,要在传入url的时候处理一下,这里不用 curl_setopt($conn[$url], CURLOPT_TIMEOUT, $timeout);//此时间须根据页面的HTML源码出来的时间,一般是在1s内的,慢的话应该也不会6秒,极慢则是在16秒内 curl_setopt($conn[$url], CURLOPT_HEADER, $header);//不返回请求头,只要源码 curl_setopt($conn[$url],CURLOPT_RETURNTRANSFER,1);//必须为1 curl_setopt($conn[$url], CURLOPT_FOLLOWLOCATION, $follow);//如果页面含有自动跳转的代码如301或者302HTTP时,自动拿转向的页面 curl_multi_add_handle ($mh,$conn[$url]);//关键,一定要放在上面几句之下,将单curl对象赋给多对象 } //下面一大步的目的是为了减少cpu的无谓负担,暂时不明,来自php.net的建议,几乎是固定用法 do { $mrc = curl_multi_exec($mh,$active);//当无数据时或请求暂停时,active=true } while ($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时 while ($active and $mrc == CURLM_OK) {//当无数据时或请求暂停时,active=true,为了减少cpu的无谓负担,这一步很难明啊 if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach ((array)$links as $i => $url) { $cinfo=curl_getinfo($conn[$url]);//可用于取得一些有用的参数,可以认为是header $res[$url]=curl_multi_getcontent($conn[$url]); if(!$forhtml){//节约内存 $res[$url]=NULL; } /*下面这一段放一些高消耗的程序代码,用来处理HTML,我保留的一句=NULL是要提醒,及时清空对象释放内存,此程序在并发过程中如果源码太大,内在消耗严重 //事实上,这里应该做一个callback函数或者你应该将你的逻辑直接放到这里来,我为了程序可重复,没这么做 preg_match_all($preg,$res[$i],$matchlinks); $res[$i]=NULL;*/ curl_close($conn[$url]);//关闭所有对象 curl_multi_remove_handle($mh , $conn[$url]); //用完马上释放资源 } curl_multi_close($mh);$mh=NULL;$conn=NULL;$links=NULL; return $res; } function clean_lry($file, $url, $type) { $data=array(); $file = preg_replace("/<link rel[^<>]*>/i", " ", $file); //$file = preg_replace("@<!--sphider_noindex-->.*?<!--\/sphider_noindex-->@si", " ",$file); $file = preg_replace("@<!--.*?-->@si", " ",$file); $file = preg_replace("@<script[^>]*?>.*?</script>@si", " ",$file); $file = preg_replace("/&nbsp;/", " ", $file); $file = preg_replace("/&raquo;/", " ", $file); $file=str_replace("'","‘",$file); $regs = Array (); preg_match("/<meta +name *=[\"']?description[\"']? *content=[\"']?([^<>'\"]+)[\"']?/i", $file, $regs); if (isset ($regs)) { $description = $regs[1]; $file = str_replace($regs[0], "", $file); } $regs = Array (); preg_match("/<meta +name *=[\"']?keywords[\"']? *content=[\"']?([^<>'\"]+)[\"']?/i", $file, $regs); if (isset ($regs)) { $keywords = $regs[1]; $file = str_replace($regs[0], "", $file); } $regs = Array (); $keywords = preg_replace("/[, ]+/", " ", $keywords); if (preg_match("@<title *>(.*?)<\/title*>@si", $file, $regs)) { $title = trim($regs[1]); $file = str_replace($regs[0], "", $file); } $file = preg_replace("@<style[^>]*>.*?<\/style>@si", " ", $file); //create spaces between tags, so that removing tags doesnt concatenate strings $file = preg_replace("/<[\w ]+>/", "\\0 ", $file); $file = preg_replace("/<\/[\w ]+>/", "\\0 ", $file); $file = strip_tags($file); //$fulltext = $file; //$file .= " ".$title; $file = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $file); $file = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $file); $file = strtolower($file); $file = preg_replace("/&[a-z]{1,6};/", " ", $file); $file = preg_replace("/[\*\^\+\?\\\.\[\]\^\$\|\{\)\(\}~!\"\/@#?%&=`?><:,]+/", " ", $file); $file = preg_replace("/\s+/", " ", $file); //$data['fulltext'] = $fulltext; $data['fulltext'] = addslashes($file); $data['title'] = addslashes($title); $data['description'] = $description; $data['keywords'] = $keywords; return $data; } function bianma($file) { preg_match_all("/<meta.+?charset=([-\w]+)/i",$file,$rs); $chrSet=strtoupper(trim($rs[1][0])); return $chrSet; } function Convert_File($file,$charSet) { $conv_file = html_entity_decode($file); $charSet = strtoupper(trim($charSet)); if($charSet != "GB2312"&&$charSet != "GBK") { $file=convertfile($charSet,"GB2312",$conv_file); if($file==-1){ return -1; } } return $file; } function convertfile($in_charset, $out_charset, $str) { //if(function_exists('mb_convert_encoding')) //{ $in_charset=explode(',',$in_charset); $encode_arr = array('GB2312','GBK','UTF-8','ASCII','BIG5','JIS','eucjp-win','sjis-win','EUC-JP'); $cha_temp=array_intersect($encode_arr,$in_charset); $cha_temp=implode('',$cha_temp); if(empty($in_charset)||empty($cha_temp)) { $encoded = mb_detect_encoding($str, $encode_arr); $in_charset=$encoded; } if(empty($in_charset)){ return -1; } echo $in_charset; return mb_convert_encoding($str, $out_charset, $in_charset); /*} else { require_once PATH.'include/charset.func.php'; $in_charset = strtoupper($in_charset); $out_charset = strtoupper($out_charset); if($in_charset == 'UTF-8' && ($out_charset == 'GBK' || $out_charset == 'GB2312')) { return utf8_to_gbk($str); } if(($in_charset == 'GBK' || $in_charset == 'GB2312') && $out_charset == 'UTF-8') { return gbk_to_utf8($str); } return $str; }*/ } function Update_All_Link($in_url='',$days,$qiangzhi) { global $db; if(empty($in_url)) { //$sql="select * from ve123_links where updatetime<='".(time()-(86400*$days))."' order by link_id desc";//echo $days."<br>"; $sql="select * from ve123_links where updatetime+86400 <".time()." order by link_id ";//echo $days."<br>"; } else { $sql="select * from ve123_links where url like '%".getdomain($in_url)."%' order by link_id desc";//echo $days."<br>"; //$sql="select * from ve123_links where url like '%".$in_url."%' order by link_id desc";//echo $days."<br>"; } //$sql="select * from ve123_links order by link_id"; echo $sql."<br>"; $query=$db->query($sql); while($row=$db->fetch_array($query)) { if(is_url($row["url"])) { // echo "呵呵呵呵".$row["lrymd5"]."<br>"; ob_flush(); flush(); //sleep(1); //if($row["lrymd5"]==""){ Update_link($row["url"],$row["lrymd5"]); } if($qiangzhi==1){ Update_link($row["url"]); } else { if(strlen($row["lrymd5"])!=32){ Update_link($row["url"]); } else {echo ""; } } echo ""; } ////sleep(2); } // echo "<br><b>全部更新完成</b> 完成日期:"; // echo date("Y年m月d日 H:i:s",time()); //sleep(2); // Update_All_Link($in_url) ; } function url_ce($val, $parent_url, $can_leave_domain) { global $ext, $mainurl, $apache_indexes, $strip_sessids; $valparts = parse_url($val); $main_url_parts = parse_url($mainurl); //if ($valparts['host'] != "" && $valparts['host'] != $main_url_parts['host'] && $can_leave_domain != 1) {return '';} reset($ext); while (list ($id, $excl) = each($ext)) if (preg_match("/\.$excl$/i", $val)) return ''; if (substr($val, -1) == '\\') {return '';} if (isset($valparts['query'])) {if ($apache_indexes[$valparts['query']]) {return '';}} if (preg_match("/[\/]?mailto:|[\/]?javascript:|[\/]?news:/i", $val)) {return '';} if (isset($valparts['scheme'])) {$scheme = $valparts['scheme'];} else {$scheme ="";} if (!($scheme == 'http' || $scheme == '' || $scheme == 'https')) {return '';} $regs = Array (); while (preg_match("/[^\/]*\/[.]{2}\//", $valpath, $regs)) { $valpath = str_replace($regs[0], "", $valpath); } $valpath = preg_replace("/\/+/", "/", $valpath); $valpath = preg_replace("/[^\/]*\/[.]{2}/", "", $valpath); $valpath = str_replace("./", "", $valpath); if(substr($valpath,0,1)!="/") {$valpath="/".$valpath;} $query = ""; if (isset($val_parts['query'])) {$query = "?".$val_parts['query'];} if ($main_url_parts['port'] == 80 || $val_parts['port'] == "") {$portq = "";} else {$portq = ":".$main_url_parts['port'];} return $val; } function iframe_ce($val, $parent_url, $can_leave_domain) { global $ext, $mainurl, $apache_indexes, $strip_sessids; $valparts = parse_url($val); $main_url_parts = parse_url($mainurl); //if ($valparts['host'] != "" && $valparts['host'] != $main_url_parts['host'] && $can_leave_domain != 1) {return '';} reset($ext); while (list ($id, $excl) = each($ext)) if (preg_match("/\.$excl$/i", $val)) return ''; if (substr($val, -1) == '\\') {return '';} if (isset($valparts['query'])) {if ($apache_indexes[$valparts['query']]) {return '';}} if (preg_match("/[\/]?mailto:|[\/]?javascript:|[\/]?news:/i", $val)) {return '';} if (isset($valparts['scheme'])) {$scheme = $valparts['scheme'];} else {$scheme ="";} if (!($scheme == 'http' || $scheme == '' || $scheme == 'https')) {return '';} $regs = Array (); while (preg_match("/[^\/]*\/[.]{2}\//", $valpath, $regs)) { $valpath = str_replace($regs[0], "", $valpath); } $valpath = preg_replace("/\/+/", "/", $valpath); $valpath = preg_replace("/[^\/]*\/[.]{2}/", "", $valpath); $valpath = str_replace("./", "", $valpath); if(substr($valpath,0,1)!="/") {$valpath="/".$valpath;} $query = ""; if (isset($val_parts['query'])) {$query = "?".$val_parts['query'];} if ($main_url_parts['port'] == 80 || $val_parts['port'] == "") {$portq = "";} else {$portq = ":".$main_url_parts['port'];} return $val; } function _striplinks($document) { $match = array(); $links = array(); preg_match_all("'<\s*(a\s.*?href|[i]*frame\s.*?src)\s*=\s*([\'\"])?([+:%\/\?~=&\\\(\),._a-zA-Z0-9-]*)'isx",$document,$links,PREG_PATTERN_ORDER); foreach ($links[3] as $val) { if (($a = url_ce($val, $url, $can_leave_domain)) != '') { $match[] = $a; } $checked_urls[$val[1]] = 1; } return $match; } function _expandlinks($links,$URI) { preg_match("/^[^\?]+/",$URI,$match); $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]); $match = preg_replace("|/$|","",$match); $match_part = parse_url($match); $match_root = $match_part["scheme"]."://".$match_part["host"]; $URI_PARTS = parse_url($URI); $host = $URI_PARTS["host"]; $search = array( "|^http://".preg_quote($host)."|i", "|^(\/)|i", "|^(?!http://)(?!mailto:)|i", "|/\./|", "|/[^\/]+/\.\./|" ); $replace = array( "", $match_root."/", $match."/", "/", "/" ); $expandedLinks = preg_replace($search,$replace,$links); return $expandedLinks; } function foothtml() { echo "<div style=\"text-align:center;\"><a target=\"_blank\" href=\"http://www.php.com\"> Php</a></div>"; } ?> ``` ```
3年swing,1年JavaEE,1年java socket转android什么待遇
3年swing,技能除了跟做游戏的比足够了。做过IM 3款,手术X光机客户端1款,线程是我的强项,过度Android有绝对的自信。 <br />1年JavaEE,spring struts都摸过,腻外了 <br />1年java服务器开发,做过的项目包括网关、邮件服务器、金融信息发布、用过纯socket,MIMA框架,设计过协议,也熟悉一些协议比如sip、xmpp、activesync、webdav等等,http更不用说。写过点C代码,不多,JNI调用。 <br />在外企干过2年,目前做手机服务器端。 <br /> <br />如果转Android,能给什么价格。听说android动辄就10k?有那么值钱么 <br />主要和市场升温有关吧,android诞生2007年底,企业用人都是1年android开发经验。 <br />android人才紧缺是不是?<br/><strong>问题补充</strong><br/><div class="quote_title">proper 写道</div><div class="quote_div">Android没那么值钱的... <br /> <br />show一下你的app,然后再讨论工资... <br /> <br /></div> <br /> <br />package com.xxx.framework.components.transport.socket.codec; <br /> <br />import java.nio.ByteOrder; <br />import org.apache.mina.common.ByteBuffer; <br />import org.apache.mina.common.IoSession; <br />import org.apache.mina.filter.codec.CumulativeProtocolDecoder; <br />import org.apache.mina.filter.codec.ProtocolDecoderOutput; <br /> <br />/** <br /> * 新华社系统Socket通信协议解码器。具体协议信息参见《xxx》。 <br /> * 解码器的解码时机由MINA框架决定,一般地:客户端发来的二进制消息先是经过协议解码器处理,即doDecode方法; <br /> * 解码器处理、过滤、封装后抛给下一层解码器(如果存在);最后由最终的解码器抛给应用层的Handler处理具体业务逻辑。 <br /> * 总之,解码器的责任是将网络直接发送来的原始的二进制数据封装成应用层能识别的特定类对象,并上抛给应用层。 <br /> * 上抛的过程由解码器方法参数ProtocolDecoderOutput的write方法完成。 <br /> * 注意:为配合与多种异构客户端的通信,规定:协议解码的字节序是从最低有效位到最高有效位。 <br /> * <br /> * @author xxx <br /> */ <br />final class UploadDecoder extends CumulativeProtocolDecoder { <br /> <br />&nbsp;&nbsp;&nbsp; /** <br />&nbsp;&nbsp;&nbsp;&nbsp; * 覆盖超类的回调方法完成自定义协议解码,该方法由MINA框架负责调用 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @param session IoSession对象,由框架创建 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @param ioBuffer 存储原始二进制数据的缓冲区,由框架创建 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @param out ProtocolDecoderOutput对象,由框架创建 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @return 返回true,当且仅当缓冲区内有可以解析的数据而你需要再次调用doDecode时;返回false,如果缓冲区内其余的数据不足以进行解析, <br />&nbsp;&nbsp;&nbsp;&nbsp; * 然后当有更多的数据积累到缓冲区时doDecode方法会再次被通知。 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception <br />&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp; @Override <br />&nbsp;&nbsp;&nbsp; protected boolean doDecode(IoSession session, ByteBuffer ioBuffer, ProtocolDecoderOutput out) throws Exception { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioBuffer.order(ByteOrder.LITTLE_ENDIAN); // 修改缓冲区的字节顺序为little-endian,按照此顺序,多字节值的字节顺序是从最低有效位到最高有效位的。 <br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 根据新华社系统Socket通信协议规范,协议由两部分构成:消息头与消息体。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 其中消息头长度恒定为17字节;消息体长度不定,由消息头前4个字节给出。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 因此解析一条由客户端上传的消息需要2个步骤:获取并解析消息头;获取并解析消息体。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Upload request = (Upload) session.getAttribute("xhs-upload"); // 从session对象中获取“xhs-upload”属性值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (request == null) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果request对象是null,则表示是解析消息头的阶段。如果是消息刚刚接收到即解析的是新消息,request对象一定是在session中不存在的。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ioBuffer.remaining() &gt;= 17) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 检查缓冲区可用字节个数是否大于等于17。因为根据协议规定,消息头的长度恒定为17, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 分别是消息长度4字节、客户端标识11字节、命令标识1字节、zip压缩标识1字节。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果大于等于17,就表明有足够的数据来解析消息头了。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int totalLength = ioBuffer.getInt(); // 读取缓冲区前4个字节合并为一个整型,该值受字节序的影响,但是规定字节序是从最低有效位到最高有效位 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] clientIdentify = new byte[11]; // 创建11字节容量的数组容纳客户端标识 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioBuffer.get(clientIdentify); // 从缓冲区读取11个字节的数据填充进数组 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte command = ioBuffer.get(); // 从冲缓冲区读取1字节作为命令标识 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte zip = ioBuffer.get(); // 从冲缓冲区读取1字节作为zip压缩标识 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request = UploadFactory.createUpload(command); // 根据命令的类型创建适当的请求 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.messageTotalSize = totalLength; // 设置请求的消息长度 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.clientIdentify = new String(clientIdentify); // 设置请求的客户端标识属性 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.zip = (zip != (byte) 0); // 设置请求的zip压缩标识属性,当且仅当数值 0 代表非压缩 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 向session添加标识键为“xhs-upload”的属性,将请求对象作为属性值传入。这有两个作用: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 1、将xhs-upload键设置成有值状态,代表消息头已经解析完成。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 2、将之前解析出来的消息长度、客户端标识、命令标识、zip压缩标识等信息封装进请求对象暂时存储到session对象中,以便下次调用doDecode方法时利用。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 注意:这时消息应该缺少消息体部分。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("xhs-upload", request); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 因为当消息头解析完成后,这时缓冲区内可能还有足够的积累数据可以继续解析消息体甚至下一条消息(也可能没有),返回true使框架再次调用doDecode方法。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 即使缓冲区内没有足够的数据了,也应该留给下次调用doDecode方法时去判断。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果缓冲区可用字节个数不足15个,直接返回false告诉框架不要再回调doDecode方法,直到网络获取到数据压进缓冲区时再调用。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果request对象不是null,则表示是消息头已经解析完成并存储,目前是解析消息体阶段。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bodyLength = request.messageTotalSize - 17; // 取得消息体的长度,即消息的总长度 - 消息头的长度(17) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ioBuffer.remaining() &gt;= bodyLength) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 检查缓冲区的可用字节数是否大于等于消息体长度,即是否读取到消息体了。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] messageBody = new byte[bodyLength]; // 创建定长的数组存放消息体 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioBuffer.get(messageBody); // 从缓冲区中读取bodyLength字节的数据填充进数组 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.messageBody = messageBody; // 设置请求的消息体 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 将session对象的“xhs-upload”键及其对应的属性值移除从而: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 1、将xhs-upload键设置成无值状态,代表消息体已经解析完成。再次进入等待解析消息头阶段 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 2、释放存储“xhs-upload”键的属性值占用的内存。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.removeAttribute("xhs-upload"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 将解码后生成的请求对象对象抛给位于应用层的Handler处理,或者抛给下一层解码器(如果存在)。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(request); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 因为当一条完整消息解析完成后,这时缓冲区内可能还有足够的积累数据可以继续解析下一条消息(也可能没有),返回true使框架再次调用doDecode方法。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 即使缓冲区内没有足够的数据了,也应该留给下次调用doDecode方法时去判断。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果缓冲区内可用字节个数不足以构成完整的消息体,直接返回false告诉框架不要再回调doDecode方法,直到网络获取到数据压进缓冲区时再调用。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; } <br />} <br /> <br />新闻发布程序的MINA解码器,别被注释吓死 <br /><br/><strong>问题补充</strong><br/><div class="quote_title">javagui 写道</div><div class="quote_div"> <br /> <br />应该是MINA把。 <br /></div> <br /> <br />拼错了,是Apache MINA,本来是想用xsocket来着,但是xsocket人气没MINA高 <br />
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
JAVA后端面试《Spring》
Spring1.Spring是什么?有什么好处?2.IOC是什么?有什么好处?具体过程?3.DI是什么?4.IOC和DI的关系?5.bean标签的属性有哪些?6.IOC创建对象有哪几种方式?7.Spring是如何实现IOC的?也就是如何创建对象的? 1.Spring是什么?有什么好处? 概念: SPring是一个支持控制反转(IOC)和面向切面编程(AOP)的容器框架。 好处: 两降低&gt;&...
AI 医生“战疫”在前线
作者| Just出品|CSDN(CSDNnews)紧急驰援疫区,AI医生也出动了。截止到2月6日,随着新冠病毒肺炎疫情的不断发展,全国累计已有31161例确诊病例,26359例疑...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
用Python爬取新型冠状病毒肺炎实时数据,pyecharts v1.x绘制省市区疫情地图
文章目录运行结果(2020-2-8数据)基本方案数据格式全国疫情地图实现福建省疫情地图实现福州市疫情地图实现其他 运行结果(2020-2-8数据) 基本方案 web请求用requests 网页内容解析用pyquery、beautifulsoup和正则表达式 地图用pyecharts v1.6.2 数据来源 全国数据来源于腾讯实时疫情动态,直接get到json 福州市数据来源于福建省疾病预...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问