项目要求实现远程打印,目前设备已经到货,打印机为芯烨XP-80X热敏打印机。

一:去http://www.xprinter.net/里下载使用手册和编程手册,注:其他品牌去百度搜索官网

二:去服务与支持菜单找到驱动,下载到本机,方便测试打印机,可以用本机连接打印机,进而设置相关参数,效果如下图

三:点击打印测试是否连得通打印机,如果可以的话,那么说明这台打印机的ip已经设置好,可以从电脑中拔出插口了。

四:打印机原理:实际打印机内部存在一个socekServer在时刻捕捉通过socket连接进来的线程,具体请参考另一篇socket小结,这里就不多做介绍了。

五:重点是:参考官网下载的编程手册,来发送对应格式的流数据来让打印机解决,之前百度了一下,发现并没有好的方法,所以自己只能详细阅读了一下,编程手册,用java写了一个工具类,希望能给大家帮助,直接上代码:

package com.tms.helper.utils;import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;/*** Created by haha on 2017/4/25.*/
public class EscPosUtil {public static final byte ESC = 27;public static final byte FS = 28;public static final byte GS = 29;public static final byte DLE = 16;public static final byte EOT = 4;public static final byte ENQ = 5;public static final byte SP = 32;public static final byte HT = 9;public static final byte LF = 10;public static final byte CR = 13;public static final byte FF = 12;public static final byte CAN = 24;/*** CodePage table*/public static class CodePage {public static final byte PC437       = 0;public static final byte KATAKANA    = 1;public static final byte PC850       = 2;public static final byte PC860       = 3;public static final byte PC863       = 4;public static final byte PC865       = 5;public static final byte WPC1252     = 16;public static final byte PC866       = 17;public static final byte PC852       = 18;public static final byte PC858       = 19;}/*** BarCode table*/public static class BarCode {public static final byte UPC_A       = 0;public static final byte UPC_E       = 1;public static final byte EAN13       = 2;public static final byte EAN8        = 3;public static final byte CODE39      = 4;public static final byte ITF         = 5;public static final byte NW7         = 6;//public static final byte CODE93      = 72;public static final byte CODE128     = 73;}/*** Print and line feed* LF* @return bytes for this command*/public static String printLinefeed(){return "$ESC_10";}/*** Turn underline mode on, set at 1-dot width* ESC - n* @return bytes for this command*/public static String underline1DotOn(){return "$ESC_27_45_1";}/*** Turn underline mode on, set at 2-dot width* ESC - n* @return bytes for this command*/public static String underline2DotOn(){return "$ESC_27_45_2";}/*** Turn underline mode off* ESC - n* @return bytes for this command*/public static String underlineOff(){return "$ESC_27_45_0";}/*** Initialize printer* Clears the data in the print buffer and resets the printer modes to the modes that were* in effect when the power was turned on.* ESC @* @return bytes for this command*/public static String initPrinter(){return "$ESC_27_64";}/*** Turn emphasized mode on* ESC E n* @return bytes for this command*/public static String emphasizedOn(){byte[] result = new byte[3];result[0] = ESC;result[1] = 69;result[2] = 0xF;return "$ESC_27_69_1";}/*** Turn emphasized mode off* ESC E n* @return bytes for this command*/public static String emphasizedOff(){return "$ESC_27_69_0";}/*** double_strike_on* ESC G n* @return bytes for this command*/public static String doubleStrikeOn(){return "$ESC_27_71_1";}/*** double_strike_off* ESC G n* @return bytes for this command*/public static String doubleStrikeOff(){return "$ESC_27_71_0";}/*** Select Font A* ESC M n* @return bytes for this command*/public static String selectFontA(){return "$ESC_27_77_0";}/*** Select Font B* ESC M n* @return bytes for this command*/public static String selectFontB(){return "$ESC_27_77_1";}/*** Select Font C ( some printers don't have font C )* ESC M n* @return bytes for this command*/public static String selectFontC(){return "$ESC_27_77_2";}/*** double height width mode on Font A* ESC ! n* @return bytes for this command*/
//    public static String doubleHeightWidthOn()
//    {
//        return "$ESC_27_33_56";
//    }public static List<String> doubleHeightWidthOn(){return Arrays.asList("$ESC_27_33_56","$ESC_28_33_12");}/*** double height width mode off Font A* ESC ! n* @return bytes for this command*/public static List<String> doubleHeightWidthOff(){return Arrays.asList("$ESC_27_33_0","$ESC_28_33_0");}/*** Select double height mode Font A* ESC ! n* @return bytes for this command*/public static String doubleHeightOn(){return "$ESC_27_33_16";}/*** disable double height mode, select Font A* ESC ! n* @return bytes for this command*/public static String doubleHeightOff(){return "$ESC_27_33_0";}/*** justification_left* ESC a n* @return bytes for this command*/public static String justificationLeft(){return "$ESC_27_97_0";}/*** justification_center* ESC a n* @return bytes for this command*/public static String justificationCenter(){return "$ESC_27_97_1";}/*** justification_right* ESC a n* @return bytes for this command*/public static String justificationRight(){return "$ESC_27_97_2";}/*** Print and feed n lines* Prints the data in the print buffer and feeds n lines* ESC d n* @param n lines* @return bytes for this command*/public static String printAndFeedLines(byte n){return "$ESC_27_100_" + String.valueOf(n);}/*** Print and reverse feed n lines* Prints the data in the print buffer and feeds n lines in the reserve direction* ESC e n* @param n lines* @return bytes for this command*/public static String printAndReverseFeedLines(byte n){return "$ESC_27_101_" + String.valueOf(n);}/*** Drawer Kick* Drawer kick-out connector pin 2* ESC p m t1 t2* @return bytes for this command*/public static String drawerKick(){return "$ESC_27_112_0_60_120";}/*** Select printing color1* ESC r n* @return bytes for this command*/public static String selectColor1(){return "$ESC_27_114_0";}/*** Select printing color2* ESC r n* @return bytes for this command*/public static String selectColor2(){return "$ESC_27_114_1";}/*** Select character code table* ESC t n* @param cp example:CodePage.WPC1252* @return bytes for this command*/public static String selectCodeTab(byte cp){byte[] result = new byte[3];result[0] = ESC;result[1] = 116;result[2] = cp;return "$ESC_27_116_" + String.valueOf(cp);}/*** white printing mode on* Turn white/black reverse printing mode on* GS B n* @return bytes for this command*/public static String whitePrintingOn(){return "$ESC_29_66_1";}/*** white printing mode off* Turn white/black reverse printing mode off* GS B n* @return bytes for this command*/public static String whitePrintingOff(){return "$ESC_29_66_0";}/*** feed paper and cut* Feeds paper to ( cutting position + n x vertical motion unit )* and executes a full cut ( cuts the paper completely )* @return bytes for this command*/public static String feedPaperCut(){return "$ESC_29_86_65_0";}/*** feed paper and cut partial* Feeds paper to ( cutting position + n x vertical motion unit )* and executes a partial cut ( one point left uncut )* @return bytes for this command*/public static String feedPaperCutPartial(){return "$ESC_29_86_66_0";}/*** select bar code height* Select the height of the bar code as n dots* default dots = 162* @param dots ( heigth of the bar code )* @return bytes for this command*/public static String barcodeHeight(byte dots){return "$ESC_29_104_" + String.valueOf(dots);}/*** select font hri* Selects a font for the Human Readable Interpretation (HRI) characters when printing a barcode, using n as follows:* @param n*           Font*           0, 48 Font A*           1, 49 Font B* @return bytes for this command*/public static String selectFontHri( byte n ){return "$ESC_29_102_" + String.valueOf(n);}/*** select position_hri* Selects the print position of Human Readable Interpretation (HRI) characters when printing a barcode, using n as follows:* @param n*           Print position*           0, 48 Not printed*           1, 49 Above the barcode*           2, 50 Below the barcode*           3, 51 Both above and below the barcode* @return bytes for this command*/public static String selectPositionHri( byte n ){return "$ESC_29_72_" + String.valueOf(n);}/*** print bar code* @param barcode_typ( Barcode.CODE39, Barcode.EAN8 ,...)* @param barcode2print* @return bytes for this command*/public static byte[] printBarcode(byte barcode_typ, String barcode2print ){byte[] barcodebytes = barcode2print.getBytes();byte[] result = new byte[3+barcodebytes.length+1];result[0] = GS;result[1] = 107;result[2] = barcode_typ;int idx = 3;for ( int i = 0; i < barcodebytes.length; i++ ){result[idx] = barcodebytes[i];idx++;}result[idx] = 0;return result;}public static String printBarcode39(String barcodeContent) {byte[] barcodeBytes = barcodeContent.getBytes();StringBuilder result = new StringBuilder("$ESC_29_107_4_");for (int i = 0; i < barcodeBytes.length; i++) {result.append(barcodeBytes[i]).append("_");}result.append("0");return result.toString();}/*** Set horizontal tab positions* @param col ( coulumn )* @return bytes for this command*/public String setHTPosition( byte col ){return "$ESC_27_68_" + String.valueOf(col) + "_0";}/*** Print and line feed* LF* @return bytes for this command*/public static byte[] print_linefeed(){byte[] result = new byte[1];result[0] = LF;return result;}/*** Turn underline mode on, set at 1-dot width* ESC - n* @return bytes for this command*/public  static byte[] underline_1dot_on(){byte[] result = new byte[3];result[0] = ESC;result[1] = 45;result[2] = 1;return result;}/*** Turn underline mode on, set at 2-dot width* ESC - n* @return bytes for this command*/public  static byte[] underline_2dot_on(){byte[] result = new byte[3];result[0] = ESC;result[1] = 45;result[2] = 2;return result;}/*** Turn underline mode off* ESC - n* @return bytes for this command*/public  static byte[] underline_off(){byte[] result = new byte[3];result[0] = ESC;result[1] = 45;result[2] = 0;return result;}/*** Initialize printer* Clears the data in the print buffer and resets the printer modes to the modes that were* in effect when the power was turned on.* ESC @* @return bytes for this command*/public  static byte[] init_printer(){byte[] result = new byte[2];result[0] = ESC;result[1] = 64;return result;}/*** Turn emphasized mode on* ESC E n* @return bytes for this command*/public  static byte[] emphasized_on(){byte[] result = new byte[3];result[0] = ESC;result[1] = 69;result[2] = 0xF;return result;}/*** Turn emphasized mode off* ESC E n* @return bytes for this command*/public  static byte[] emphasized_off(){byte[] result = new byte[3];result[0] = ESC;result[1] = 69;result[2] = 0;return result;}/*** double_strike_on* ESC G n* @return bytes for this command*/public  static byte[] double_strike_on(){byte[] result = new byte[3];result[0] = ESC;result[1] = 71;result[2] = 0xF;return result;}/*** double_strike_off* ESC G n* @return bytes for this command*/public  static byte[] double_strike_off(){byte[] result = new byte[3];result[0] = ESC;result[1] = 71;result[2] = 0xF;return result;}/*** Select Font A* ESC M n* @return bytes for this command*/public  static byte[] select_fontA(){byte[] result = new byte[3];result[0] = ESC;result[1] = 77;result[2] = 0;return result;}/*** Select Font B* ESC M n* @return bytes for this command*/public  static byte[] select_fontB(){byte[] result = new byte[3];result[0] = ESC;result[1] = 77;result[2] = 1;return result;}/*** Select Font C ( some printers don't have font C )* ESC M n* @return bytes for this command*/public  static byte[] select_fontC(){byte[] result = new byte[3];result[0] = ESC;result[1] = 77;result[2] = 2;return result;}/*** double height width mode on Font A* ESC ! n* @return bytes for this command*/public  static byte[] double_height_width_on(){byte[] result = new byte[3];result[0] = ESC;result[1] = 33;result[2] = 56;return result;}/*** double height width mode off Font A* ESC ! n* @return bytes for this command*/public static  byte[] double_height_width_off(){byte[] result = new byte[3];result[0] = ESC;result[1] = 33;result[2] = 0;return result;}/*** Select double height mode Font A* ESC ! n* @return bytes for this command*/public  static byte[] double_height_on(){byte[] result = new byte[3];result[0] = ESC;result[1] = 33;result[2] = 16;return result;}/*** disable double height mode, select Font A* ESC ! n* @return bytes for this command*/public static  byte[] double_height_off(){byte[] result = new byte[3];result[0] = ESC;result[1] = 33;result[2] = 0;return result;}/*** justification_left* ESC a n* @return bytes for this command*/public static  byte[] justification_left(){byte[] result = new byte[3];result[0] = ESC;result[1] = 97;result[2] = 0;return result;}/*** justification_center* ESC a n* @return bytes for this command*/public  static byte[] justification_center(){byte[] result = new byte[3];result[0] = ESC;result[1] = 97;result[2] = 1;return result;}/*** justification_right* ESC a n* @return bytes for this command*/public  static byte[] justification_right(){byte[] result = new byte[3];result[0] = ESC;result[1] = 97;result[2] = 2;return result;}/*** Print and feed n lines* Prints the data in the print buffer and feeds n lines* ESC d n* @param n lines* @return bytes for this command*/public static byte[] print_and_feed_lines(byte n){byte[] result = new byte[3];result[0] = ESC;result[1] = 100;result[2] = n;return result;}/*** Print and reverse feed n lines* Prints the data in the print buffer and feeds n lines in the reserve direction* ESC e n* @param n lines* @return bytes for this command*/public static byte[] print_and_reverse_feed_lines(byte n){byte[] result = new byte[3];result[0] = ESC;result[1] = 101;result[2] = n;return result;}/*** Drawer Kick* Drawer kick-out connector pin 2* ESC p m t1 t2* @return bytes for this command*/public static byte[] drawer_kick(){byte[] result = new byte[5];result[0] = ESC;result[1] = 112;result[2] = 0;result[3] = 60;result[4] = 120;return result;}/*** Select printing color1* ESC r n* @return bytes for this command*/public static byte[] select_color1(){byte[] result = new byte[3];result[0] = ESC;result[1] = 114;result[2] = 0;return result;}/*** Select printing color2* ESC r n* @return bytes for this command*/public static byte[] select_color2(){byte[] result = new byte[3];result[0] = ESC;result[1] = 114;result[2] = 1;return result;}/*** Select character code table* ESC t n* @param cp example:CodePage.WPC1252* @return bytes for this command*/public static  byte[] select_code_tab(byte cp){byte[] result = new byte[3];result[0] = ESC;result[1] = 116;result[2] = cp;return result;}/*** white printing mode on* Turn white/black reverse printing mode on* GS B n* @return bytes for this command*/public  static byte[] white_printing_on(){byte[] result = new byte[3];result[0] = GS;result[1] = 66;result[2] = (byte)128;return result;}/*** white printing mode off* Turn white/black reverse printing mode off* GS B n* @return bytes for this command*/public  static byte[] white_printing_off(){byte[] result = new byte[3];result[0] = GS;result[1] = 66;result[2] = 0;return result;}/*** feed paper and cut* Feeds paper to ( cutting position + n x vertical motion unit )* and executes a full cut ( cuts the paper completely )* @return bytes for this command*/public  static byte[] feedpapercut(){byte[] result = new byte[4];result[0] = GS;result[1] = 86;result[2] = 65;result[3] = 0;return result;}/*** feed paper and cut partial* Feeds paper to ( cutting position + n x vertical motion unit )* and executes a partial cut ( one point left uncut )* @return bytes for this command*/public  static byte[] feedpapercut_partial(){byte[] result = new byte[4];result[0] = GS;result[1] = 86;result[2] = 66;result[3] = 0;return result;}/*** select bar code height* Select the height of the bar code as n dots* default dots = 162* @param dots ( heigth of the bar code )* @return bytes for this command*/public  static byte[] barcode_height(byte dots){byte[] result = new byte[3];result[0] = GS;result[1] = 104;result[2] = dots;return result;}/*** select font hri* Selects a font for the Human Readable Interpretation (HRI) characters when printing a barcode, using n as follows:* @param n*           Font*           0, 48 Font A*           1, 49 Font B* @return bytes for this command*/public  static byte[] select_font_hri( byte n ){byte[] result = new byte[3];result[0] = GS;result[1] = 102;result[2] = n;return result;}/*** select position_hri* Selects the print position of Human Readable Interpretation (HRI) characters when printing a barcode, using n as follows:* @param n*           Print position*           0, 48 Not printed*           1, 49 Above the barcode*           2, 50 Below the barcode*           3, 51 Both above and below the barcode* @return bytes for this command*/public  static byte[] select_position_hri( byte n ){byte[] result = new byte[3];result[0] = GS;result[1] = 72;result[2] = n;return result;}/*** print bar code* @param barcode_typ( Barcode.CODE39, Barcode.EAN8 ,...)* @param barcode2print* @return bytes for this command*/public  static byte[] print_bar_code(byte barcode_typ, String barcode2print ){byte[] barcodebytes = barcode2print.getBytes();byte[] result = new byte[3+barcodebytes.length+1];
//        byte[] result = new byte[3+barcodebytes.length];result[0] = GS;result[1] = 107;result[2] = barcode_typ;int idx = 3;for ( int i = 0; i < barcodebytes.length; i++ ){result[idx] = barcodebytes[i];idx++;}result[idx] = 0;return result;}/*** print bar code* @param barcode_typ( Barcode.CODE39, Barcode.EAN8 ,...)* @param barcode2print* @return bytes for this command*/public  static byte[] print_bar_code128(byte barcode_typ, String barcode2print ){byte[] barcodebytes = barcode2print.getBytes();byte[] result = new byte[4+barcodebytes.length];
//        byte[] result = new byte[3+barcodebytes.length];result[0] = GS;result[1] = 107;result[2] = barcode_typ;result[3] = (byte) barcodebytes.length;/*result[4] = 123;result[5] =66;*/int idx = 4;for ( int i = 0; i < barcodebytes.length; i++ ){result[idx] = barcodebytes[i];idx++;}//result[idx] = 0;return result;}public static byte[] set_print_area_width(int leftMargin, int rightMargin ){byte[] result = new byte[4];
//        byte[] result = new byte[3+barcodebytes.length];result[0] = GS;result[1] = 87;result[2] = (byte) leftMargin;result[3] = (byte) rightMargin; return result;}public  static byte[] set_bar_code_width(int n){byte[] result = new byte[3];result[0] = GS;result[1] = 119;result[2] = (byte) n;return result;}/*** Set horizontal tab positions* @param col ( coulumn )* @return bytes for this command*/public  static byte[] set_HT_position( byte col ){byte[] result = new byte[4];result[0] = ESC;result[1] = 68;result[2] = col;result[3] = 0;return result;}public static byte[] set_chinese_on() {byte[] result = new byte[2];result[0] = FS;result[1] = 38;return result;}public static byte[] set_chinese_off() {byte[] result = new byte[2];result[0] = FS;result[1] = 46;return result;}public static byte[] set_chinese_super_on() {byte[] result = new byte[3];result[0] = FS;result[1] = 33;result[2] = 12;return result;}public static byte[] set_chinese_super_off() {byte[] result = new byte[3];result[0] = FS;result[1] = 33;result[2] = 0;return result;}public static void main(String[] args) throws IOException {String ip = "172.28.15.43";int port = 9100;String code = "1234567890";int skip = 2;Socket client=new java.net.Socket();OutputStreamWriter outSW = null;client.connect(new InetSocketAddress(ip,port),10000); // 创建一个 socket
//        socketWriter = new PrintWriter(client.getOutputStream());// 创建输入输出数据流outSW = new OutputStreamWriter(client.getOutputStream(), "GBK");BufferedWriter socketWriter = new BufferedWriter(outSW);
//        socketWriter.write(new String(set_chinese_on(), "UTF-8"));socketWriter.write(new String(justification_center(), "UTF-8"));socketWriter.write("***测试***\n");socketWriter.write("快来买吧\n");socketWriter.write(new String(justification_left(), "UTF-8"));socketWriter.write("订单号:170426543103\n");socketWriter.write("哈哈哈\n");socketWriter.write("-------------------------------------------\n");socketWriter.write(new String(emphasized_on(), "UTF-8"));socketWriter.write(new String(double_height_width_on(), "UTF-8"));socketWriter.write("367#085_1300\n");socketWriter.write(new String(double_height_width_off(), "UTF-8"));socketWriter.write(new String(emphasized_off(), "UTF-8"));socketWriter.write("测试人:王大帅哥\n");socketWriter.write("手机:13052235269\n");socketWriter.write(new String(emphasized_on(), "UTF-8"));socketWriter.write(new String(set_chinese_super_on(), "UTF-8"));socketWriter.write(new String(double_height_width_on(), "UTF-8"));socketWriter.write("你说我是不是帅哥\n");socketWriter.write(new String(double_height_width_off(), "UTF-8"));socketWriter.write(new String(set_chinese_super_off(), "UTF-8"));socketWriter.write(new String(emphasized_off(), "UTF-8"));socketWriter.write("\n\n");socketWriter.write(new String(set_bar_code_width(2), "UTF-8"));socketWriter.write(new String(print_bar_code128(BarCode.CODE128,"{Bcb7099132890012345"), "UTF-8"));socketWriter.write("\n");socketWriter.write("cb7099132890012345");for(int i=0;i<skip;i++){socketWriter.write("\n");}socketWriter.write(new String(feedpapercut(), "UTF-8"));socketWriter.flush();socketWriter.close();}
}

这里面较详细的列出了很多的方法,比如一些格式的设置:居中、居左、居右,大小写、加粗,也有较流行的条形码打印功能,自己写了CODE39和CODE128码两种格式,大家有兴趣可以参考编程手册来完成其他编码,不过笔者觉得这两种是现在比较流行的条形码,足够使用了。

六:打印结果展示:

ESC/POS协议打印机工具类(java)相关推荐

  1. SHA1签名工具类java

    SHA1签名工具类java package com.net.util;import java.security.MessageDigest; import java.util.Iterator; im ...

  2. 自定义日期工具类 java 1614698552

    自定义日期工具类 java 1614698552 需求 思路 演练 日期转字符串的方法 字符串转日期方法 测试类 更多尝试 测试另一个方法

  3. 财务转换工具 - 人民币金额转大写工具类 java 版本

    文章目录 财务转换工具 - 人民币金额转大写工具类 java 版本 1.示例 2.代码 财务转换工具 - 人民币金额转大写工具类 java 版本 1.示例 public static void mai ...

  4. 腾讯开放平台接口鉴权(计算签名)工具类 java版

    腾讯开放平台 接口鉴权(签名)工具类 java版 用到了Hutool工具类 package top.seasmall.platform.core.config.nettyws.util;import ...

  5. MD5工具类(java实现版)

    MD5工具类(java实现版) 介绍 MD5(Message Digest Algorithm)加密算法是不对称的加密算法,因为其实不可逆的,实际上其不能算作加密算法, 因为其不可解密.其实现原理是基 ...

  6. java 路径 工具类,java 绝对路径工具类

    在程中我们常取一些资源的绝对径,下面给出一个简单方便的工具类来帮助我们轻松的找到我想的资源.(适用于CS/BS应用) import java.io.File; import java.io.IOExc ...

  7. java分页的工具类,java分页工具类

    PageBean-分页 package com.soyea.util; import java.io.Serializable; import java.util.List; /** * 分页工具类 ...

  8. java配置文件工具类,java项目加载配置文件的工具类

    java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...

  9. 去除html标签的工具类,Java正则匹配过滤移除html标签以及获取img完整标签工具类...

    工具类记录于此,以供参考. package com.gccp.translate.biz.util; import org.apache.commons.lang3.StringUtils; impo ...

  10. 工具类|Java生成商城常用的核销码,长度12位~

    对于一些商城类项目而言,有一些需要核销码的地方,其实核销码有很多种生成方式,今天用一个比较简单的方式生成随机核销码,7位的随机数,如果是小商城,在一天内基本上不会有重复的,如果想校验重复的,可以将每次 ...

最新文章

  1. R语言中的dnorm(),pnorm(),qnorm(),rnorm()的解释
  2. python用matplotlib画人口图_Python+Matplotlib画contour图
  3. ElasticSearch 6.x 学习笔记:12.字段类型
  4. Java 客户端界面功能:停止当前操作
  5. Shell-实际业务操作02
  6. C++中类的组合和继承关系
  7. [Oracle] Enable Row Movement
  8. 《算法竞赛进阶指南》 0x50 动态规划
  9. Java+sql server+CallableStatement调用存储过程三种情况 (转)
  10. 深度学习《Photo Editing》
  11. python数据如何保存到excel中
  12. 李晓枫:金融信息化发展和创新的三方面
  13. Java面试题超详细讲解系列之七【MySQL篇】
  14. Js之History对象
  15. linux ftps ftp,Linux下ftp+SSL实现ftps
  16. png能转换成html吗,png转化成pdf
  17. 计算机主板启动加密码,电脑主板BIOS加密解密设置
  18. 阿里云ACP认证哪个值得考?考试时间怎么安排?
  19. 一分钟解决“仅限中国大陆地区播放” (转)
  20. 普通用户sftp 无法使用解决方法

热门文章

  1. SQL SERVER拼接字符串(字符串中有变量)
  2. 干货满满,30个Python源代码!
  3. android多屏幕共享,一种实现多人屏幕无线共享的方法技术
  4. 2016考研数学三复习计划
  5. IDEA 强大文件对比功能
  6. 原生Java萝卜影视4.0.5源码/完美修复完整版萝卜影视源码
  7. 让大家在30分钟内完成APPLEALC的声卡仿冒
  8. Navicat premium注册机打不开的解决办法
  9. 安卓模拟器手游辅助制作教程
  10. vscode 文件高亮插件_实用的Visual Studio Code插件