黑马程序员_Java基础_网络编程(下)_24
来源:互联网 发布:射手播放器 mac破解版 编辑:程序博客网 时间:2024/05/22 03:35
------- android培训、java培训、期待与您交流!----------
导读:TCP上传图片,TCP-客户并发登陆,浏览器客户端-自定义服务端,浏览器客户端-Tomcat服务端,自定义图形界面浏览器-Tomcat服务器,URL-Connection,域名解析
1、网络编程(TCP上传图片)
/*
需求:上传图片。
*/
/*
客户端。
1,服务端点。
2,读取客户端已有的图片数据。
3,通过socket 输出流将数据发给服务端。
4,读取服务端反馈信息。
5,关闭。
*/
import java.io.*;
import java.net.*;
class PicClient
{
publicstatic void main(String[] args)throws Exception
{
Sockets = new Socket("192.168.1.254",10007);
FileInputStreamfis = new FileInputStream("c:\\1.bmp");
OutputStreamout = s.getOutputStream();
byte[]buf = new byte[1024];
intlen = 0;
while((len=fis.read(buf))!=-1)
{
out.write(buf,0,len);
}
//告诉服务端数据已写完
s.shutdownOutput();
InputStreamin = s.getInputStream();
byte[] bufIn = new byte[1024];
intnum = in.read(bufIn);
System.out.println(newString(bufIn,0,num));
fis.close();
s.close();
}
}
/*
服务端
*/
class PicServer
{
publicstatic void main(String[] args) throws Exception
{
ServerSocketss = new ServerSocket(10007);
Sockets = ss.accept();
InputStreamin = s.getInputStream();
FileOutputStreamfos = new FileOutputStream("server.bmp");
byte[]buf = new byte[1024];
intlen = 0;
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
OutputStreamout = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
ss.close();
}
}
/*
需求:上传图片。
*/
import java.io.*;
import java.net.*;
class PicClient
{
publicstatic void main(String[] args)throws Exception
{
if(args.length!=1) //主函数传值,将文件路径传进程序。如果为1,相当于传入了一个参数
{
System.out.println("请选择一个jpg格式的图片");
return;
}
Filefile = new File(args[0]);
if(!(file.exists()&& file.isFile()))
{
System.out.println("该文件有问题,要么补存在,要么不是文件");
return;
}
if(!file.getName().endsWith(".jpg")) //只能传输图片文件。
{
System.out.println("图片格式错误,请重新选择");
return;
}
if(file.length()>1024*1024*5) //判断文件大小,大小5M的不要。
{
System.out.println("文件过大,没安好心");
return;
}
Sockets = new Socket("192.168.1.254",10007);
FileInputStreamfis = new FileInputStream(file);
OutputStreamout = s.getOutputStream();
byte[]buf = new byte[1024];
intlen = 0;
while((len=fis.read(buf))!=-1)
{
out.write(buf,0,len);
}
//告诉服务端数据已写完
s.shutdownOutput();
InputStreamin = s.getInputStream();
byte[] bufIn = new byte[1024];
intnum = in.read(bufIn);
System.out.println(newString(bufIn,0,num));
fis.close();
s.close();
}
}
class PicThread implements Runnable
{
privateSocket s;
PicThread(Sockets) //获取哪个客户端,就封装哪个客户端。
{
this.s= s;
}
publicvoid run()
{
intcount = 1;
Stringip =s.getInetAddress().getHostAddress();
try
{
System.out.println(ip+"....connected");
InputStreamin = s.getInputStream();
Filedir = new File("d:\\pic");
Filefile = new File(dir,ip+"("+(count)+")"+".jpg");
while(file.exists())
file= new File(dir,ip+"("+(count++)+")"+".jpg");
//如果文件存在的话,创建一个count++的文件。
FileOutputStreamfos = new FileOutputStream(file);
byte[]buf = new byte[1024];
intlen = 0;
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
OutputStreamout = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}
catch(Exception e)
{
thrownew RuntimeException(ip+"上传失败");
}
}
}
class PicServer
{
publicstatic void main(String[] args) throws Exception
{
ServerSocketss = new ServerSocket(10007);
while(true)
{
Sockets = ss.accept();
newThread(new PicThread(s)).start(); //玩多线程,服务器要玩多线程。
}
//ss.close();
}
}
2、网络编程(TCP-客户并发登陆)
/*
客户端通过键盘录入用户名。服务端对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登陆。并在客户端显示 xxx,欢迎光临。
如果该用户存在,在服务端显示xxx,尝试登陆。并在客户端显示 xxx,该用户不存在。最多就登录三次。
*/
import java.io.*;
import java.net.*;
class LoginClient
{
publicstatic void main(String[] args) throws Exception
{
Sockets = new Socket("192.168.1.254",10008);
BufferedReaderbufr =
newBufferedReader(new InputStreamReader(System.in));
PrintWriterout = new PrintWriter(s.getOutputStream(),true);
BufferedReaderbufIn =
newBufferedReader(new InputStreamReader(s.getInputStream()));
for(intx=0; x<3; x++)
{
Stringline = bufr.readLine();
if(line==null) //如果按下一个Ctrl+C那么就结束,不想录入了。不能把null传给服务端。
break;
out.println(line);
Stringinfo = bufIn.readLine();
System.out.println("info:"+info);
if(info.contains("欢迎"))
//如果服务器发过来的信息中包含有“欢迎”字样,表示已经登陆。不用再登陆了跳出循环。
break;
}
bufr.close();
s.close();
}
}
class UserThread implements Runnable
{
privateSocket s;
UserThread(Sockets)
{
this.s= s;
}
publicvoid run()
{
Stringip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
try
{
for(intx=0; x<3; x++)
{
BufferedReaderbufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
Stringname = bufIn.readLine();
if(name==null) //如果name为null的话,如果尝试的次数不足三次的话,会一直的输出null.
break;
BufferedReaderbufr = new BufferedReader(new FileReader("user.txt"));
PrintWriterout = new PrintWriter(s.getOutputStream(),true);
Stringline = null;
booleanflag = false;
while((line=bufr.readLine())!=null)
{
if(line.equals(name)) //判断客户端传来的用户名,我数据库中的名字是否一样。
{
flag= true;
break;
}
}
if(flag) //根据循环后的结果来判断,定义标记。
{
System.out.println(name+",已登录");
out.println(name+",欢迎光临");
break;
}
else
{
System.out.println(name+",尝试登录");
out.println(name+",用户名不存在");
}
}
s.close(); //如果搞了三次还没有登进服务器,我认为你是在暴力登陆服务器,把你干掉。
}
catch(Exception e)
{
thrownew RuntimeException(ip+"校验失败");
}
}
}
class LoginServer
{
publicstatic void main(String[] args) throws Exception
{
ServerSocketss = new ServerSocket(10008);
while(true)
{
Sockets = ss.accept();
newThread(new UserThread(s)).start();
}
}
}
4、网络编程(浏览器客户端-自定义服务端)
/*
演示客户端和服务端。
1,
客户端:浏览器 (telnet)
服务端:自定义。
2,(见第5个)
客户端:浏览器。
服务端:Tomcat服务器。(Tomcat能提供服务,说明里面封装了ServerSocket)
3,(见第6个)
客户端:自定义。(图形界面)
服务端:Tomcat服务器。
*/
import java.net.*;
import java.io.*;
class ServerDemo
{
publicstatic void main(String[] args) throws Exception
{
ServerSocketss = new ServerSocket(11000);
Sockets = ss.accept();
System.out.println(s.getInetAddress().getHostAddress());
InputStreamin = s.getInputStream();
byte[]buf = new byte[1024];
intlen = in.read(buf);
System.out.println(newString(buf,0,len));
PrintWriterout = new PrintWriter(s.getOutputStream(),true);
out.println("<fontcolor='red' size='7'>客户端你好</font>");
s.close();
ss.close();
}
}
- 在浏览器的地址栏上输入:http://192.168.1.254.11000。则可以向本机的服务器发请求。服务器收到请求的话,会向浏览器返回信息:“客户端你好”。
- tomcat服务器整天就干这个事,整天用PrintWriter,用out将数据全部打到客户端去,而浏览器牛就牛在浏览器能解析。
- tel是windows中给我们提供的一个远程登陆的一个工具,它可以用来连接网络中的任意一台主机。在DOC命令下连接,连接之后,可以对于这台主机进行命令性的配置(路由器,交换机等)。简单理解,telnet是一个客户端软件。在DOC下,它可以把<font color='red' size='7'>客户端你好</font>原样显示出来,因为HTML的代码,它解析不了。
5、网络编程(浏览器客户端-Tomcat服务端)
- 玩服务器要先明确端口,要不然你连不上。Tomcat的端口为8080
Tomcat有什么好处,它可以读取你自定义的资源(网页)。
- 自己定义一个html文件放在http://192.168.1.254/myweb/目录下。
<html>
<body>
<h1>这是我的主页</h1>
<fontsize=5 color=red>欢迎光临</front>
<div>
主页示例</br>
主页示例</br>
主页示例</br>
</div>
</body>
</html>
- 在应用层有一个公用的HTTP传输协议,这是一个公用的规则。浏览器厂商要想和不同服务器的厂商进行数据交互的话,他们都必须尊从一个规则就可以。
6、网络编程(自定义浏览器-Tomcat服务端)
- import java.io.*;
import java.net.*;
class MyIE
{
publicstatic void main(String[] args) throws Exception
{
Sockets = new Socket("192.168.1.254",8080);
PrintWriterout = new PrintWriter(s.getOutputStream(),true);
out.println("GET/myweb/demo.html HTTP/1.1");
out.println("Accept:*/*"); //什么都支持。
out.println("Accept-Language:zh-cn");
out.println("Host:192.168.1.254:11000");
out.println("Connection:closed");
out.println();
out.println();
BufferedReaderbufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
Stringline = null;
while((line=bufr.readLine())!=null)
{
System.out.println(line);
}
s.close();
}
}
- /*
http://192.168.1.254:11000/myweb/demo.html,这句话的意思是,用HTTP协议向主机192.168.1.254的端口11000发送请求。请求资源路径是myweb,资源是demo.html.
下面内容是浏览器向服务器发送的请求:(请求消息头)
GET /myweb/demo.html HTTP/1.1
Accept: application/x-shockwave-flash,image/gif, image/x-xbitmap, image/jpeg, i
mage/pjpeg, application/vnd.ms-excel,application/vnd.ms-powerpoint, application
/msword, application/QVOD,application/QVOD,
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.1; SV1; .NET CLR 2.0
.50727)
Host: 192.168.1.254:11000
Connection: Keep-Alive
*/
- GET是一种请求方式。
- 目前HTTP协议有两个版本的,一个是1.0,一个是1.1
- Accept代表告诉服务器,我(浏览器)能接受什么样的数据。flash,gif,bmp,jpg,excel,PPT,word,快播等。如果服务器发过来的数据浏览器不支持,则浏览器要安装一个软件。
- Accept-Language:zh-cn.浏览器告诉服务器,我是简体中文版。
- Accept-Encoding:告诉服务器,我支持的封装形式。
先在新浪这一端把你的数据给压缩了,比如说要给你几百K的数据,一压缩变成了几十K,速度会很快(提高了传输效率)。到了这边,你再解压缩就行了。
- User-Agent:这是用户的一些信息。
- Host:我想访问你192.168.1.254的11000端口。(一台服务器可以装多台的主机要访问哪一个主机一定要明确一下)
- Connection:KeepAlive保持存活。(如果为closed,表示你把数据发给我就结束。)
- 请求消息头的第一行是请求行,最下面是一个空行(必须有一个空行,隔开消息头和数据体),空行的下面是请求数据体。
- 浏览器向Tomcat发什么东西,我们都知道了,我们也可以搞一个。
- 响应消息头:由Tomcat服务器发过来的。
HTTP/1.1 200 OK (200代表响应状态码,代表成功,描述信息。)
Server:Apache-Coyote/1.1 (服务器是Apache的)
ETag:W/”243-1295838676765”
Last-Modidied: (文件是什么时候被修改的)
Content-Type:text/html (我给你发是一个,html文本)
Content-Length:243 (字节长度)
Date:
Connection:close
<html>
<body>
<h1>这是我的主页</h1>
<fontsize=5 color=red>欢迎光临</front>
<div>
主页示例</br>
主页示例</br>
主页示例</br>
</div>
</body>
</html>
- 这里收到的数据是和浏览器是一样的。
7、网络编程(自定义图形界面浏览器-Tomcat服务器)
- 浏览器这个软件,它强大就强大在,它里面挂了n多个内置的解析的引擎(html解析引擎,css解析引擎,javascript解析引擎)。我们的软件走的是传输层,而浏览器走的是应用层,我们把传输层的数据都拿过来了,而浏览器把,HTTP有关协议封装的信息给拆掉了。
- import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class MyIEByGUI
{
privateFrame f;
privateTextField tf;
privateButton but;
privateTextArea ta;
privateDialog d;
privateLabel lab;
privateButton okBut;
MyIEByGUI()
{
init();
}
publicvoid init()
{
f= new Frame("my window");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf= new TextField(60);
but= new Button("转到");
ta= new TextArea(25,70);
d= new Dialog(f,"提示信息-self",true);
d.setBounds(400,200,240,150);
d.setLayout(newFlowLayout());
lab= new Label();
okBut= new Button("确定");
d.add(lab);
d.add(okBut);
f.add(tf);
f.add(but);
f.add(ta);
myEvent();
f.setVisible(true);
}
privatevoid myEvent()
{
okBut.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
d.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
tf.addKeyListener(newKeyAdapter()
{
publicvoid keyPressed(KeyEvent e)
{
try
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
catch(Exception ex)
{
}
}
});
but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
try
{
showDir();
}
catch(Exception ex)
{
}
}
});
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
privatevoid showDir()throws Exception
{
ta.setText("");
Stringurl = tf.getText(); //http://192.168.1.254:8080/myweb/demo.html
intindex1 = url.indexOf("//")+2; //找到索引的位置,即192中1的位置。
intindex2 = url.indexOf("/",index1); //从index1的位置向后面找”/”,”/”的索引就是index2.
Stringstr = url.substring(index1,index2); //截取子串。
String[]arr = str.split(":"); //用分隔符,进行分隔获得主机地址和端口。
Stringhost = arr[0];
intport = Integer.parseInt(arr[1]);
Stringpath = url.substring(index2); //获取资源路径。
//ta.setText(str+"...."+path);
Sockets = new Socket(host,port);
PrintWriterout = new PrintWriter(s.getOutputStream(),true);
out.println("GET"+path+" HTTP/1.1");
out.println("Accept:*/*");
out.println("Accept-Language:zh-cn");
out.println("Host:192.168.1.254:11000");
out.println("Connection:closed");
out.println();
out.println();
BufferedReaderbufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
Stringline = null;
while((line=bufr.readLine())!=null)
{
ta.append(line+"\r\n"); //将从服务器发过来的数据,添加到文本区域,并添加回车。
}
s.close();
}
publicstatic void main(String[] args)
{
newMyIEByGUI();
}
}
8、网络编程(URL-Connection)
- java.net中的类URL,类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。URI(UniformResource Identifiers)的范围要比URL要大,虽然都是代表统一的定位符。书本后面的条形码也是唯一的,它也是URI的范畴。
- 构造方法:
Ø URL(String spec):根据 String 表示形式创建 URL 对象。(整个的封装)
Ø URL(String protocol, String host, int port,String file):根据指定 protocol、host、port 号和 file 创建 URL 对象。(分开封装)
- URL中的get方法,也是在截取字符串,它帮你封装完了之后,你就不用管了,它用起来要方便的多。
- import java.net.*;
class URLDemo
{
publicstatic void main(String[] args) throws MalformedURLException
{
URLurl = newURL("http://192.168.1.254/myweb/demo.html?name=haha&age=30");
//用?进行信息的分隔,用&进行多信息的连接,信息都是以键值对的形式存在的。。
System.out.println("getProtocol():"+url.getProtocol());
System.out.println("getHost():"+url.getHost());
System.out.println("getPort():"+url.getPort()); //如果发请求的时候没有指定端口,getPort()返回的值是-1;
System.out.println("getPath():"+url.getPath()); //只获取路径。
System.out.println("getFile():"+url.getFile()); //除了获取路径,还获取参数。
System.out.println("getQuery():"+url.getQuery()); //拿是是?后面的键值对参数。有些时候,你向服务端提交的时候,需要带着客户端的一些特定的信息。这个时候就用加参数的形式,把参数提交到服务端去。
/*intport = getPort();
if(port==-1)
port= 80; //如果返回值不是-1那么就用设定的端口,如果端口是-1,就用浏览器的默认端口80。
getPort()==-1
*/
}
}
/*
String getFile():获取此 URL 的文件名。
String getHost():获取此 URL 的主机名(如果适用)。
String getPath():获取此 URL 的路径部分。
intgetPort():获取此 URL 的端口号。
String getProtocol():获取此 URL 的协议名称。
String getQuery():获取此 URL 的查询部
*/
- 通过URL可以把url信息封装成Socket对象,Socket对象走的是传输层。URLConnection openConnection():返回一个 URLConnection 对象,它表示到 URL所引用的远程对象的连接。也就是说只要调用这个方法,就可以连接到一台主机。获取这个主机的连接对象。
- java.net中的类URLConnection,public abstract class URLConnectionextends Object中一个抽象的类,它有两个直接的子类:HttpURLConnection,JarURLConnection.
- InputStream getInputStream():返回从此打开的连接读取的输入流。(这方法一猜就是Socket的方法)
- OutputStream getOutputStream():返回写入到此连接的输出流。
- import java.net.*;
import java.io.*;
class URLConnectionDemo
{
publicstatic void main(String[] args) throws Exception
{
URLurl = new URL("http://192.168.1.254:8080/myweb/demo.html");
URLConnectionconn = url.openConnection();
//它在内部帮你做了连接动作,封装在了内部,并且是带着协议来封装的。这个时候已经连出去了,不用写Socket了。以前我们玩Socket是在传输层,现在它把Socket封装在内部,用的是HTTP封装,而在我们是在应用层。
System.out.println(conn);
InputStreamin = conn.getInputStream();
byte[]buf = new byte[1024];
intlen = in.read(buf);
System.out.println(newString(buf,0,len));
}
}
- 这个时候服务器端发过来的数据,经过传输层,到达应用层。在应用层运用HTTP协议进行解包后,拆掉了响应头中的响应信息。最终显示在了显示器上。
- //第七个代码中showDir()的替代方法。这个更简单。
private void showDir() throws Exception
{
ta.setText("");
StringurlPath = tf.getText();//http://192.168.1.254:8080/myweb/demo.html
URLurl = new URL(urlPath);
URLConnectionconn = url.openConnection();
InputStreamin = conn.getInputStream();
byte[]buf = new byte[1024];
intlen = in.read(buf);
ta.setText(newString(buf,0,len));
}
- URL中的另一个方法,InputStreamopenStream():打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。(相当先连接,再开流openConnection().getInputStream())。
- 如果先建立连接的话,里面可以有更多的方法可以用。可以往服务器中再发一些东西都可以,甚至可以解析它的头。如String getContentType():返回 content-type 头字段的值。等。
9、网络编程(小知识点)
- Socket类有一个空的构造函数,Socket()。可以通过void connect(SocketAddress endpoint):将此套接字连接到服务器。SocketAddressendpoint和InetAddress有什么区别呢?java.net中的类SocketAddress是一个抽象的类,它的子类InetSocketAddress,实现 IP 套接字地址(IP 地址 + 端口号)。
- ServerSocket 中的一个构造方法:ServerSocket(intport, int backlog):利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。backlog - 队列的最大长度(能同时连到服务器的客户端的最大的个数,别的人还连进来必须有一个人断线,他才能连进来)。这是ServerSocket的指定队列的特点,最大连接数的特点。
10、网络编程(域名解析)
- 浏览器在写入一个网址的时候它到底做了什么事情?
- 浏览器在解析完http://192.168.1.254:8080/myweb/demo.html后,要先看它是什么协议,看完这个协议后,它会启用相对应的协议并解析后面相对应的主机和端口,把主机和端口封装成Socket。我们写的时候,写的是www.sina.com.cn,当写主机名的时候,要把它翻译成主机的地址,才能去访问这个主机。想要将主机名翻译成IP地址,需要域名解析。DNS。DNS把地址给返回给客户端,客户机再向这个解析出来的地址发请求,发到8080端口上。用的是电信的宽带,你不配置DNS的话,它默认走的就是电信的DNS服务器。如果你配置的话,要走你指定的DNS服务器。当然找联通的DNS也可以,但是谁离我近我找谁。如果访问美国的DNS的话,我可能请求时间过长超时,没有解析成功,该页就无法显示。
- http://127.0.0.1:8080和http://localhost:8080,我没有走公网。为什么127.0.0.1和localhost是一样的呢?其实127和localhost的映射关系就是本机上。c:\windows\systems\drivers\etc\hosts中有一个映射关系:127.0.0.1 localhost。可以在这里面把localhost改成自己想要的名字。一个地址也可以对应多个名字,可以再在文件中加一个127.0.0.1 www.sina.com.cn(这样的话就不走DNS服务器了)。当我们在访问网络主机的时候,它先找的是本地,这样的话速度就会快了一些。看看本地的文件hosts中有没有对应的地址。本地没有的话,再往外面去找。
- 有些收费软件它总去自己的网站上去更新。一更新发现那个注册码不是最新的,它会告诉你这个软件不让你用。软件一启动的话,它会自动向某个网站发请求。可以在host文件中做一些手脚,那么这个软件一启动,它再向网站上更新的话,走127.0.0.1这个地址,更新失败,不让他更新。
- 在上网的时候有些网站总是配合一些广告页面,这些广告页面,和一些恶意的代码或者病毒,为了不再受恶意软件的侵害,360等软件就在hosts文件中配置了这些文件的映射表,全映射到本地来,连不出去。
- 如果直接输入一个IP地址的话,就不走DNS了。只有写主机名的时候,才走这个映射关系。先走本地文件,再走网络DNS,没查着则该页不可显示。
------- android培训、java培训、期待与您交流!----------
- 黑马程序员_Java基础_网络编程(下)_24
- 黑马程序员_Java基础_网络编程
- 黑马程序员_Java基础_网络编程
- 黑马程序员_java基础_网络编程
- 黑马程序员_Java基础_网络编程(上)_23
- 黑马程序员_学习笔记_Java基础_网络编程
- 黑马程序员_Java基础_网络编程基础相关
- 黑马程序员_Java基础_网络编程相关小项目
- 黑马程序员_Java基础_网络编程相关小项目
- 黑马程序员_Java基础_编程基础
- 黑马程序员_JAVA基础_网络(一)
- 黑马程序员_Java语言_网络编程
- 黑马程序员_java学习日记_Java高新技术_网络编程
- 黑马程序员_java基础之网络编程
- 黑马程序员_java基础-网络编程
- 黑马程序员_java基础网络编程
- 黑马程序员_Java基础:网络编程总结
- 黑马程序员_Java基础-网络编程
- C++11 标准新特性:Defaulted 和 Deleted 函数
- MySQL性能优化的最佳20+条经验
- DCE和DTE的区别
- Oracle10g Physical DataGuard 详细搭建过程
- C++11的线程、锁和条件变量
- 黑马程序员_Java基础_网络编程(下)_24
- Reactive Cocoa Tutorial [2] = "百变RACStream";
- C++11 标准新特性: 右值引用与转移语义
- python理论学习(二)
- C++开发者都应该使用的10个C++11特性
- python理论学习(三)
- C++ 11语法甜点1
- C++ 11语法甜点2
- c++11中的tuple(元组)