day26<网络编程>
网络编程(网络编程概述)
网络编程(网络编程三要素之IP概述)
网络编程(网络编程三要素之端口号概述)
网络编程(网络编程三要素协议)
网络编程(Socket通信原理图解)
网络编程(UDP传输)
网络编程(UDP传输优化)
网络编程(UDP传输多线程)
网络编程(UDP聊天图形化界面)
网络编程(UDP聊天发送功能)
网络编程(UDP聊天记录功能)
网络编程(UDP聊天清屏功能)
网络编程(UDP聊天震动功能)
网络编程(UDP聊天快捷键和代码优化)
网络编程(UDP聊天生成jar文件)
网络编程(TCP协议)(掌握)
网络编程(TCP协议代码优化)
网络编程(服务端是多线程的)(掌握)
网络编程(练习)
网络编程(练习)
###26.01_网络编程(网络编程概述)(了解)
A:计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
B:网络编程
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
###26.02_网络编程(网络编程三要素之IP概述)(掌握)
每个设备在网络中的唯一标识
每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
ipconfig:查看本机IP192.168.12.42
ping:测试连接192.168.40.62
本地回路地址:127.0.0.1 255.255.255.255是广播地址
IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。
IPv6:8组,每组4个16进制数。
1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
1a2b::aaaa:0000:0000:0000:aabb:1f2f
1a2b:0000:aaaa::aabb:1f2f
1a2b:0000:aaaa::0000:aabb:1f2f
1a2b:0000:aaaa:0000::aabb:1f2f
###26.03_网络编程(网络编程三要素之端口号概述)(掌握)
每个程序在设备上的唯一标识
每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
端口号范围从0-65535
编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
常用端口
mysql: 3306
oracle: 1521
web: 80
tomcat: 8080
QQ: 4000
feiQ: 2425
###26.04_网络编程(网络编程三要素协议)(掌握)
为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
UDP
面向无连接,数据不安全,速度快。不区分客户端与服务端。(发短信)
TCP
面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据(打电话)
(你瞅啥,我瞅你咋地,咱俩唠唠)(约吗,约,什么什么)
###26.05_网络编程(Socket通信原理图解)(了解)
A:Socket套接字概述:
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO流传输。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
###26.06_网络编程(UDP传输)(了解)
1.发送Send
创建DatagramSocket, 随机端口号
创建DatagramPacket, 指定数据, 长度, 地址, 端口
使用DatagramSocket发送DatagramPacket
关闭DatagramSocket
String str = "what are you 弄啥呢?"; DatagramSocket socket = new DatagramSocket();//创建Socket相当于创建码头 DatagramPacket packet = //创建Packet相当于集装箱 new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666); socket.send(packet);//发货,将数据发出去 socket.close();//关闭码头 |
2.接收Receive
创建DatagramSocket, 指定端口号
创建DatagramPacket, 指定数组, 长度
使用DatagramSocket接收DatagramPacket
关闭DatagramSocket
从DatagramPacket中获取数据
DatagramSocket socket = new DatagramSocket(6666);//创建Socket相当于创建码头 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱 socket.receive(packet);//接货,接收数据 byte[] arr = packet.getData();//获取数据 int len = packet.getLength();//获取有效的字节个数 System.out.println(new String(arr,0,len)); socket.close(); |
3.接收方获取ip和端口号↓
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
###26.07_网络编程(UDP传输优化)
接收端Receive
DatagramSocket socket = new DatagramSocket(6666);//创建Socket相当于创建码头 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱 while(true) { socket.receive(packet);//接货,接收数据 byte[] arr = packet.getData();//获取数据 int len = packet.getLength();//获取有效的字节个数 String ip = packet.getAddress().getHostAddress();//获取ip地址 int port = packet.getPort();//获取端口号 System.out.println(ip + ":" + port + ":" + new String(arr,0,len)); } |
发送端Send
Scanner sc = new Scanner(System.in);//创建键盘录入对象 DatagramSocket socket = new DatagramSocket();//创建Socket相当于创建码头 while(true) { String line = sc.nextLine();//获取键盘录入的字符串 if("quit".equals(line)) { break; } DatagramPacket packet = //创建Packet相当于集装箱 new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666); socket.send(packet);//发货,将数据发出去 } socket.close();//关闭码头 |
###26.08_网络编程(UDP传输多线程)
A发送和接收在一个窗口完成
public class Demo3_MoreThread { public static void main(String[] args) { new Receive().start(); new Send().start(); } } class Receive extends Thread { public void run() { try { DatagramSocket socket = new DatagramSocket(6666);//创建Socket相当于创建码头 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱 while(true) { socket.receive(packet);//接货,接收数据 byte[] arr = packet.getData();//获取数据 int len = packet.getLength();//获取有效的字节个数 String ip = packet.getAddress().getHostAddress();//获取ip地址 int port = packet.getPort();//获取端口号 System.out.println(ip + ":" + port + ":" + new String(arr,0,len)); } } catch (IOException e) { e.printStackTrace(); } } } class Send extends Thread { public void run() { try { Scanner sc = new Scanner(System.in);//创建键盘录入对象 DatagramSocket socket = new DatagramSocket();//创建Socket相当于创建码头 while(true) { String line = sc.nextLine();//获取键盘录入的字符串 if("quit".equals(line)) { break; } DatagramPacket packet = //创建Packet相当于集装箱 new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666); socket.send(packet);//发货,将数据发出去 } socket.close(); } catch (IOException e) { e.printStackTrace(); } } } |
###26.09_网络编程(UDP聊天图形化界面)
###26.10_网络编程(UDP聊天发送功能)
###26.11_网络编程(UDP聊天记录功能)
###26.12_网络编程(UDP聊天清屏功能)
###26.13_网络编程(UDP聊天震动功能)
###26.14_网络编程(UDP聊天快捷键和代码优化)
###26.15_网络编程(UDP聊天生成jar文件)
public class Demo4_GUIChat extends Frame {//拿到Frame所有方法 //设置为成员变量 private TextField tf; private Button send; private Button log; private Button clear; private Button shake; private TextArea viewText; private TextArea sendText; private DatagramSocket socket; private BufferedWriter bw; public Demo4_GUIChat() { init();//初始化设置 southPanel();//南部 centerPanel();//中间 event(); } public void event() { this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { try { socket.close(); bw.close(); } catch (IOException e1) { e1.printStackTrace(); } System.exit(0); } }); send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { send(); } catch (IOException e1) { e1.printStackTrace(); } } }); log.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { logFile(); } catch (IOException e1) { e1.printStackTrace(); } } }); clear.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { viewText.setText(""); } }); shake.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { send(new byte[]{-1},tf.getText()); } catch (IOException e1) { e1.printStackTrace(); } } }); sendText.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { //if(e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown()) {//isControlDown ctrl是否被按下 if(e.getKeyCode() == KeyEvent.VK_ENTER) { try { send(); } catch (IOException e1) { e1.printStackTrace(); } } } }); } private void shake() { int x = this.getLocation().x;//获取横坐标位置 int y = this.getLocation().y;//获取纵坐标位置 for(int i = 0; i < 20; i++) { try { this.setLocation(x + 20, y + 20); Thread.sleep(20); this.setLocation(x + 20, y - 20); Thread.sleep(20); this.setLocation(x - 20, y + 20); Thread.sleep(20); this.setLocation(x - 20, y - 20); Thread.sleep(20); this.setLocation(x, y); } catch (InterruptedException e) { e.printStackTrace(); } } } //记录文件 private void logFile() throws IOException { bw.flush();//刷新缓冲区 FileInputStream fis = new FileInputStream("config.txt"); ByteArrayOutputStream baos = new ByteArrayOutputStream();//在内存中创建缓冲区 int len; byte[] arr = new byte[8192]; while((len = fis.read(arr)) != -1) { baos.write(arr, 0, len); } String str = baos.toString();//将内存中的内容转换成了字符串 viewText.setText(str); fis.close(); } private void send(byte[] arr, String ip) throws IOException { DatagramPacket packet = new DatagramPacket(arr, arr.length, InetAddress.getByName(ip), 9999); socket.send(packet);//发送数据 } private void send() throws IOException { String message = sendText.getText();//获取发送区域的内容 String ip = tf.getText();//获取ip地址; ip = ip.trim().length() == 0 ? "255.255.255.255" : ip; send(message.getBytes(),ip); String time = getCurrentTime();//获取当前时间 String str = time + " 我对:" + (ip.equals("255.255.255.255") ? "所有人" : ip) + "说\r\n" + message + "\r\n\r\n";//alt + shift + l 抽取局部变量 viewText.append(str);//将信息添加到显示区域中 bw.write(str);//将信息写到数据库中 sendText.setText(""); } private String getCurrentTime() { Date d = new Date();//创建当前日期对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); return sdf.format(d);//将时间格式化 } public void centerPanel() { Panel center = new Panel();//创建中间的Panel viewText = new TextArea();//显示的文本区 sendText = new TextArea(5,1);//发送的文本区域5行一列 center.setLayout(new BorderLayout());//设置为边界布局管理器 center.add(sendText,BorderLayout.SOUTH);//发送的文本区域放在南边 center.add(viewText,BorderLayout.CENTER);//显示区域放在中间 viewText.setEditable(false);//设置不可以编辑 viewText.setBackground(Color.WHITE);//设置背景颜色 sendText.setFont(new Font("xxx", Font.PLAIN, 18));//设置字体(名字样式大小) viewText.setFont(new Font("xxx", Font.PLAIN, 18)); this.add(center,BorderLayout.CENTER); } public void southPanel() { Panel south = new Panel();//创建南边的Panel tf = new TextField(15);//创建文本字段存储ip地址 tf.setText("127.0.0.1");//默认值 send = new Button("发 送");//创建发送按钮 log = new Button("记 录");//创建记录按钮 clear = new Button("清 屏");//创建清屏按钮 shake = new Button("震 动");//创建震动按钮 south.add(tf);//添加到south south.add(send); south.add(log); south.add(clear); south.add(shake); this.add(south,BorderLayout.SOUTH);//将Panel放在Frame的南边 } public void init() { this.setLocation(500, 50); this.setSize(500, 700); new Receive().start(); try { socket = new DatagramSocket(); bw = new BufferedWriter(new FileWriter("config.txt",true));//需要在尾部追加 } catch (Exception e) { e.printStackTrace(); } this.setVisible(true); } private class Receive extends Thread {//接收和发送需要同时执行,所以定义成多线程的 public void run() { try { DatagramSocket socket = new DatagramSocket(9999); DatagramPacket packet = new DatagramPacket(new byte[8192], 8192); while(true) {//不断接收 socket.receive(packet);//接收信息 byte[] arr = packet.getData();//获取字节数据 int len = packet.getLength();//获取有效的字节数据 if(arr[0] == -1 && len == 1) {//如果发过来的数组第一个存储的值是-1,并且数组长度是1 shake();//调用震动方法 continue;//终止本次循环,继续下次循环,因为震动后不需要执行下面的代码 } String message = new String(arr,0,len);//转换成字符串 String time = getCurrentTime();//获取当前时间 String ip = packet.getAddress().getHostAddress();//获取ip地址 String str = time + " " + ip + " 对我说:\r\n" + message + "\r\n\r\n"; viewText.append(str); bw.write(str); } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { new Demo4_GUIChat();//创建一个窗体 } } |
###26.16_网络编程(TCP协议)(掌握)
1.客户端
创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
输入流可以读取服务端输出流写出的数据
输出流可以写出数据到服务端的输入流
Socket socket = new Socket("127.0.0.1", 12345); InputStream is = socket.getInputStream();//获取客户端输入流 OutputStream os = socket.getOutputStream();//获取客户端的输出流 byte[] arr = new byte[1024]; int len = is.read(arr);//读取服务器发过来的数据 System.out.println(new String(arr,0,len)); //将数据转换成字符串并打印 os.write("学习挖掘机哪家强?".getBytes());//客户端向服务器写数据 socket.close(); |
2.服务端
创建ServerSocket(需要指定端口号)
调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
输入流可以读取客户端输出流写出的数据
输出流可以写出数据到客户端的输入流
ServerSocket server = new ServerSocket(12345); Socket socket = server.accept();//接受客户端的请求 InputStream is = socket.getInputStream();//获取客户端输入流 OutputStream os = socket.getOutputStream();//获取客户端的输出流 os.write("百度一下你就知道".getBytes());//服务器向客户端写出数据 byte[] arr = new byte[1024]; int len = is.read(arr);//读取客户端发过来的数据 System.out.println(new String(arr,0,len)); //将数据转换成字符串并打印 socket.close(); |
###26.17_网络编程(TCP协议代码优化)
客户端
Socket socket = new Socket("127.0.0.1", 12345); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//将字节流包装成了字符流 PrintStream ps = new PrintStream(socket.getOutputStream());//PrintStream中有写出换行的方法 System.out.println(br.readLine()); ps.println("我想报名黑马程序员"); System.out.println(br.readLine()); ps.println("大哭!!!能不能给次机会"); socket.close(); |
服务端
ServerSocket server = new ServerSocket(12345); Socket socket = server.accept();//接受客户端的请求 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//将字节流包装成了字符流 PrintStream ps = new PrintStream(socket.getOutputStream());//PrintStream中有写出换行的方法 ps.println("欢迎咨询黑马程序员"); System.out.println(br.readLine()); ps.println("不好意思,爆满了"); System.out.println(br.readLine()); socket.close(); |
###26.18_网络编程(服务端是多线程的)(掌握)
ServerSocket server = new ServerSocket(12345); while(true) { final Socket socket = server.accept();//接受客户端的请求 new Thread() { public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//将字节流包装成了字符流 PrintStream ps = new PrintStream(socket.getOutputStream());//PrintStream中有写出换行的方法 ps.println("欢迎咨询黑马程序员"); System.out.println(br.readLine()); ps.println("不好意思,爆满了"); System.out.println(br.readLine()); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } |
###26.19_网络编程(练习)
客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到是反转后的字符串
Scanner sc = new Scanner(System.in);//创建键盘录入对象 Socket socket = new Socket("127.0.0.1", 54321);//创建客户端,指定ip地址和端口号 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取输入流 PrintStream ps = new PrintStream(socket.getOutputStream());//获取输出流 ps.println(sc.nextLine());//将字符串写到服务器去 System.out.println(br.readLine()); //将反转后的结果读出来 socket.close(); |
ServerSocket server = new ServerSocket(54321); System.out.println("服务器启动,绑定54321端口"); while(true) { final Socket socket = server.accept();//接受客户端的请求 new Thread() {//开启一条线程 public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取输入流 PrintStream ps = new PrintStream(socket.getOutputStream());//获取输出流 String line = br.readLine();//将客户端写过来的数据读取出来 line = new StringBuilder(line).reverse().toString();//链式编程 ps.println(line);//反转后写回去 socket.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } |
###26.20_网络编程(练习)
客户端向服务器上传文件
public static void main(String[] args) throws UnknownHostException, IOException { // 1.提示输入要上传的文件路径, 验证路径是否存在以及是否是文件夹 File file = getFile(); // 2.发送文件名到服务端 Socket socket = new Socket("127.0.0.1", 12345); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println(file.getName()); // 6.接收结果, 如果存在给予提示, 程序直接退出 String result = br.readLine();//读取存在后不存在的结果 if("存在".equals(result)) { System.out.println("您上传的文件已经存在,请不要重复上传"); socket.close(); return; } // 7.如果不存在, 定义FileInputStream读取文件, 写出到网络 FileInputStream fis = new FileInputStream(file); byte[] arr = new byte[8192]; int len; while((len = fis.read(arr)) != -1) { ps.write(arr, 0, len); } fis.close(); socket.close(); } private static File getFile() { Scanner sc = new Scanner(System.in);//创建键盘录入对象 System.out.println("请输入一个文件路径:"); while(true) { String line = sc.nextLine(); File file = new File(line); if(!file.exists()) { System.out.println("您录入的文件路径不存在,请重新录入:"); }else if(file.isDirectory()) { System.out.println("您录入的是文件夹路径,请输入一个文件路径:"); }else { return file; } } } |
//3,建立多线程的服务器 ServerSocket server = new ServerSocket(12345); System.out.println("服务器启动,绑定12345端口号"); //4.读取文件名 while(true) { final Socket socket = server.accept();//接受请求 new Thread() { public void run() { try { InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); PrintStream ps = new PrintStream(socket.getOutputStream()); String fileName = br.readLine(); //5.判断文件是否存在, 将结果发回客户端 File dir = new File("update"); dir.mkdir();//创建文件夹 File file = new File(dir,fileName);//封装成File对象 if(file.exists()) {//如果服务器已经存在这个文件 ps.println("存在");//将存在写给客户端 socket.close();//关闭socket return; }else { ps.println("不存在"); } //8.定义FileOutputStream, 从网络读取数据, 存储到本地 FileOutputStream fos = new FileOutputStream(file); byte[] arr = new byte[8192]; int len; while((len = is.read(arr)) != -1) { fos.write(arr, 0, len); } fos.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } |
###26.21_day26总结
把今天的知识点总结一遍。
1,网络三要素
2,udp和tcp的区别
3,多线程服务器
4,两个tcp练习必须掌握
day26<网络编程>的更多相关文章
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
随机推荐
- Python 按当前日期(年、月、日)创建多级目录的方法
先看实际效果,现在时间2018.4.26 使用python脚本按照年月日生成多级目录,创建的目录可以将系统生成的日志文件放入其中,方便查阅,代码如下: #!/usr/bin/env python #c ...
- 使用jquery插件validate制作的表单验证案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- css3实现jquery mobile的页面过度原理
1.两个页面在同一个html中用js点击实现另外一个页面增加ui-page-active slid in等各种效果,每个页面中是一个绝对定位 .ui-mobile [data-role=page] { ...
- 在linux命令行输出颜色
示例: #include <stdio.h> int main() { printf("\e[31;1m Hello, world! \e[0m\n"); } 也就是说 ...
- pyv8使用总结
在使用python爬虫的过程中,难免遇到要加载原网站的js脚本并执行.但是python本身无法解析js脚本. 不过python这么猛的语言,当然设置了很多方法来执行js脚本.其中一个比较简单的方法是使 ...
- C/C++捕获段错误,打印出错的具体位置(精确到哪一行)_转
转自:C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 修订:2013-02-16 其实还可以使用 glibc 的 backtrace_symbols 函数,把栈帧各返回地址里面的数字地址翻译 ...
- Iconfont在移动端遇到问题的探讨
Iconfont越来越得到前端的关注,特别是阿里那个iconfont库的推出和不断完善,再加上连IE6都能兼容,的确是个好东西. 既然那么火,我们公司移动项目也计划加入这个iconfont,于是我就针 ...
- zookeeper连接 org.apache.curator.framework.imps.CuratorFrameworkImpl Background exception was not retry-able or retry gave up [main-EventThread]
ERROR org.apache.curator.framework.imps.CuratorFrameworkImpl Background exception was not retry-able ...
- unsupported major.monor version 51.0 (unable to load *.servlet)………………
unsupported major.monor version 51.0 (unable to load *.servlet)------ 这种异常是因为编译war或者java程序的JDK版本和运行部 ...
- brew install mac安装失败的问题
问题:brew 安装失败思路:将github仓库放到本地,不用ruby下载解决办法:1.下载https://raw.githubusercontent.com/Homebrew/install/mas ...