十一、网络编程

 
 
 

11.1 网络通信协议

  • 网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换。

  • TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

11.2 协议分类

通信的协议还是比较复杂的,java.net 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。

java.net 包中提供了两种常见的网络协议的支持:

  • TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

    • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

      • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。

      • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。

      • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。

完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。

  • UDP:用户数据报协议(User Datagram Protocol)。UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。

 

11.3 网络编程三要素

 

协议

  • 协议:计算机网络通信必须遵守的规则,已经介绍过了,不再赘述。

IP地址

  • IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话,那么“IP地址”就相当于“电话号码”。

IP地址分类

  • IPv4:是一个32位的二进制数,通常被分为4个字节,表示成a.b.c.d 的形式,例如192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。

  • IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。有资料显示,全球IPv4地址在2011年2月分配完毕。

    为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。

 

端口号

网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?

如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。

  • 端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

利用协议+IP地址+端口号 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。

 

11.4 TCP通信

 

概述

TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

两端通信时步骤:

  1. 服务端程序,需要事先启动,等待客户端的连接。

  2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

在Java中,提供了两个类用于实现TCP通信程序:

  1. 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。

  2. 服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

 

11.5 Socket类

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。

构造方法

  • `public Socket(String host, int port)` :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。

    小贴士:回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。

构造举例,代码如下:


Socket client = new Socket("localhost", 6666);
 
 
 
1
 
 
 
 
 
1
Socket client = new Socket("localhost", 6666);
 
 

成员方法

  • public InputStream getInputStream() : 返回此套接字的输入流。

    • 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。

    • 关闭生成的InputStream也将关闭相关的Socket。

  • public OutputStream getOutputStream() : 返回此套接字的输出流。

    • 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。

    • 关闭生成的OutputStream也将关闭相关的Socket。

  • public void close() :关闭此套接字。

    • 一旦一个socket被关闭,它不可再使用。

    • 关闭此socket也将关闭相关的InputStream和OutputStream 。

  • public void shutdownOutput() : 禁用此套接字的输出流。

    • 任何先前写出的数据将被发送,随后终止输出流。

 

11.6 ServerSocker类

ServerSocket类:这个类实现了服务器套接字,该对象等待通过网络的请求。

构造方法

  • public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。

构造举例,代码如下:

ServerSocket server = new ServerSocket(6666);
 
 
 
1
 
 
 
 
 
1
ServerSocket server = new ServerSocket(6666);
 
 

成员方法

  • public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

 

11.7 简单的TCP 网络程序

 

TCP通信分析图解

  1. 【服务端】启动,创建ServerSocket对象,等待连接。

  2. 【客户端】启动,创建Socket对象,请求连接。

  3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象。

  4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据 。

  5. 【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。

到此,客户端向服务端发送数据成功。

 

自此,服务端向客户端回写数据。

  1. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。

  2. 【客户端】Scoket对象,获取InputStream,解析回写数据。

  3. 【客户端】释放资源,断开连接。

客户端向服务器发送数据 并回信儿

服务端实现:

        System.out.println("服务端启动 , 等待连接 .... ");
// 1.创建 ServerSocket对象,绑定端口,开始等待连接
ServerSocket ss = new ServerSocket(6666);
// 2.接收连接 accept 方法, 返回 socket 对象.
Socket server = ss.accept();
// 3.通过socket 获取输入流
InputStream is = server.getInputStream();
// 4.一次性读取数据
// 4.1 创建字节数组
byte[] b = new byte[1024];
// 4.2 据读取到字节数组中.
int len = is.read(b);
// 4.3 解析数组,打印字符串信息
String msg = new String(b, 0, len);
System.out.println(msg);
// =================回写数据=======================
// 5. 通过 socket 获取输出流
OutputStream out = server.getOutputStream();
// 6. 回写数据
out.write("我很好,谢谢你".getBytes());
//5.关闭资源.
is.close();
server.close();
}
 
 
 
24
 
 
 
 
 
1
        System.out.println("服务端启动 , 等待连接 .... ");
2
        // 1.创建 ServerSocket对象,绑定端口,开始等待连接
3
        ServerSocket ss = new ServerSocket(6666);
4
        // 2.接收连接 accept 方法, 返回 socket 对象.
5
        Socket server = ss.accept();
6
        // 3.通过socket 获取输入流
7
        InputStream is = server.getInputStream();
8
        // 4.一次性读取数据
9
      // 4.1 创建字节数组
10
        byte[] b = new byte[1024];
11
      // 4.2 据读取到字节数组中.
12
        int len = is.read(b);
13
        // 4.3 解析数组,打印字符串信息
14
        String msg = new String(b, 0, len);
15
        System.out.println(msg);
16
// =================回写数据=======================
17
      // 5. 通过 socket 获取输出流
18
       OutputStream out = server.getOutputStream();
19
      // 6. 回写数据
20
       out.write("我很好,谢谢你".getBytes());
21
        //5.关闭资源.
22
        is.close();
23
        server.close();
24
    }
 
 
客户端实现
	public static void main(String[] args) throws Exception {
System.out.println("客户端 发送数据");
// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
Socket client = new Socket("localhost", 6666);
// 2.获取流对象 . 输出流
OutputStream os = client.getOutputStream();
// 3.写出数据.
os.write("你好么? tcp ,我来了".getBytes());
// ==============解析回写=========================
// 4. 通过Scoket,获取 输入流对象
InputStream in = client.getInputStream();
// 4. 关闭资源 .
os.close();
client.close();
}
 
 
 
15
 
 
 
 
 
1
public static void main(String[] args) throws Exception {
2
System.out.println("客户端 发送数据");
3
// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
4
Socket client = new Socket("localhost", 6666);
5
// 2.获取流对象 . 输出流
6
OutputStream os = client.getOutputStream();
7
// 3.写出数据.
8
os.write("你好么? tcp ,我来了".getBytes());
9
        // ==============解析回写=========================
10
      // 4. 通过Scoket,获取 输入流对象
11
      InputStream in = client.getInputStream();
12
// 4. 关闭资源 .
13
os.close();
14
client.close();
15
}
 
 
 

11.8 文件上传案例

文件上传分析图解

  1. 【客户端】输入流,从硬盘读取文件数据到程序中。

  2. 【客户端】输出流,写出文件数据到服务端。

  3.  
     
     
    1
     
     
     
     
     
    1
    
    
     
     
  4. 【服务端】输入流,读取文件数据到服务端程序。

  5. 【服务端】输出流,写出文件数据到服务器硬盘中。

基本实现

服务端实现:

    public static void main(String[] args) throws IOException {
System.out.println("服务器 启动..... ");
// 1. 创建服务端ServerSocket
ServerSocket serverSocket = new ServerSocket(6666);
// 2. 建立连接
Socket accept = serverSocket.accept();
// 3. 创建流对象
// 3.1 获取输入流,读取文件数据
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
// 3.2 创建输出流,保存到本地 .
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
// 4. 读写数据
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
//5. 关闭 资源
bos.close();
bis.close();
accept.close();
System.out.println("文件上传已保存");
}
 
 
 
23
 
 
 
 
 
1
    public static void main(String[] args) throws IOException {
2
        System.out.println("服务器 启动.....  ");
3
        // 1. 创建服务端ServerSocket
4
      ServerSocket serverSocket = new ServerSocket(6666);
5
  // 2. 建立连接 
6
        Socket accept = serverSocket.accept();
7
      // 3. 创建流对象
8
      // 3.1 获取输入流,读取文件数据
9
        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
10
        // 3.2 创建输出流,保存到本地 .
11
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
12
// 4. 读写数据
13
        byte[] b = new byte[1024 * 8];
14
        int len;
15
        while ((len = bis.read(b)) != -1) {
16
            bos.write(b, 0, len);
17
        }
18
        //5. 关闭 资源
19
        bos.close();
20
        bis.close();
21
        accept.close();
22
        System.out.println("文件上传已保存");
23
    }
 
 
客户端实现
public static void main(String[] args) throws IOException {
// 1.创建流对象
// 1.1 创建输入流,读取本地文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg"));
// 1.2 创建输出流,写到服务端
Socket socket = new Socket("localhost", 6666);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); //2.写出数据.
byte[] b = new byte[1024 * 8 ];
int len ;
while (( len = bis.read(b))!=-1) {
bos.write(b, 0, len);
bos.flush();
}
System.out.println("文件发送完毕");
// 3.释放资源 bos.close();
socket.close();
bis.close();
System.out.println("文件上传完毕 ");
}
 
 
 
23
 
 
 
 
 
1
public static void main(String[] args) throws IOException {
2
        // 1.创建流对象
3
        // 1.1 创建输入流,读取本地文件  
4
        BufferedInputStream bis  = new BufferedInputStream(new FileInputStream("test.jpg"));
5
        // 1.2 创建输出流,写到服务端 
6
        Socket socket = new Socket("localhost", 6666);
7
        BufferedOutputStream   bos   = new BufferedOutputStream(socket.getOutputStream());
8

9
        //2.写出数据. 
10
        byte[] b  = new byte[1024 * 8 ];
11
        int len ; 
12
        while (( len  = bis.read(b))!=-1) {
13
            bos.write(b, 0, len);
14
            bos.flush();
15
        }
16
        System.out.println("文件发送完毕");
17
        // 3.释放资源
18

19
        bos.close(); 
20
        socket.close();
21
        bis.close(); 
22
        System.out.println("文件上传完毕 ");
23
}
 
 

11.8.1 上传文件优化

1.文件名称写死的问题
服务端,保存文件的名称如果写死,那么最终导致服务器硬盘,只会保留一个文件,建议使用系统时间优化,保证文件名称唯一,代码如下:
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis()+".jpg") // 文件名称
BufferedOutputStream bos = new BufferedOutputStream(fis);
 
 
 
2
 
 
 
 
 
1
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis()+".jpg") // 文件名称
2
BufferedOutputStream bos = new BufferedOutputStream(fis);
 
 
2.循环接收的问题
服务端,指保存一个文件就关闭了,之后的用户无法再上传,这是不符合实际的,使用循环改进,可以不断的接收不同用户的文件,代码如下:
// 每次接收新的连接,创建一个Socket
while(true){
Socket accept = serverSocket.accept();
......
}
 
 
 
5
 
 
 
 
 
1
// 每次接收新的连接,创建一个Socket
2
while(true){
3
    Socket accept = serverSocket.accept();
4
    ......
5
}
 
 
3.效率问题
服务端,在接收大文件时,可能耗费几秒钟的时间,此时不能接收其他用户上传,所以,使用多线程技术优化,代码如下:
while(true){
Socket accept = serverSocket.accept();
// accept 交给子线程处理.
new Thread(() -> {
......
InputStream bis = accept.getInputStream();
......
}).start();
}
 
 
 
1
 
 
 
 
 
1
while(true){
2
    Socket accept = serverSocket.accept();
3
    // accept 交给子线程处理.
4
    new Thread(() -> {
5
      ......
6
        InputStream bis = accept.getInputStream();
7
      ......
8
    }).start();
9
}
 
 
优化实现
    public static void main(String[] args) throws IOException {
System.out.println("服务器 启动..... ");
// 1. 创建服务端ServerSocket
ServerSocket serverSocket = new ServerSocket(6666);
// 2. 循环接收,建立连接
while (true) {
Socket accept = serverSocket.accept();
/*
3. socket对象交给子线程处理,进行读写操作
Runnable接口中,只有一个run方法,使用lambda表达式简化格式
*/
new Thread(() -> {
try (
//3.1 获取输入流对象
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
//3.2 创建输出流对象, 保存到本地 .
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
BufferedOutputStream bos = new BufferedOutputStream(fis);) {
// 3.3 读写数据
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
//4. 关闭 资源
bos.close();
bis.close();
accept.close();
System.out.println("文件上传已保存");
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
 
 
 
1
35
 
 
 
 
 
1
    public static void main(String[] args) throws IOException {
2
        System.out.println("服务器 启动.....  ");
3
        // 1. 创建服务端ServerSocket
4
        ServerSocket serverSocket = new ServerSocket(6666);
5
      // 2. 循环接收,建立连接
6
        while (true) {
7
            Socket accept = serverSocket.accept();
8
          /* 
9
          3. socket对象交给子线程处理,进行读写操作
10
               Runnable接口中,只有一个run方法,使用lambda表达式简化格式
11
            */
12
            new Thread(() -> {
13
                try (
14
                    //3.1 获取输入流对象
15
                    BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
16
                    //3.2 创建输出流对象, 保存到本地 .
17
                    FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
18
                    BufferedOutputStream bos = new BufferedOutputStream(fis);) {
19
                    // 3.3 读写数据
20
                    byte[] b = new byte[1024 * 8];
21
                    int len;
22
                    while ((len = bis.read(b)) != -1) {
23
                      bos.write(b, 0, len);
24
                    }
25
                    //4. 关闭 资源
26
                    bos.close();
27
                    bis.close();
28
                    accept.close();
29
                    System.out.println("文件上传已保存");
30
                } catch (IOException e) {
31
                  e.printStackTrace();
32
                }
33
            }).start();
34
        }
35
    }
 
 
11.8.2 信息会写
 

信息回写分析图解

前四步与基本文件上传一致.

  1. 【服务端】获取输出流,回写数据。

  2. 【客户端】获取输入流,解析回写数据。

回写实现

服务端
    public static void main(String[] args) throws IOException {
System.out.println("服务器 启动..... ");
// 1. 创建服务端ServerSocket
ServerSocket serverSocket = new ServerSocket(6666);
// 2. 循环接收,建立连接
while (true) {
Socket accept = serverSocket.accept();
/*
3. socket对象交给子线程处理,进行读写操作
Runnable接口中,只有一个run方法,使用lambda表达式简化格式
*/
new Thread(() -> {
try (
//3.1 获取输入流对象
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
//3.2 创建输出流对象, 保存到本地 .
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
BufferedOutputStream bos = new BufferedOutputStream(fis);
) {
// 3.3 读写数据
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
} // 4.=======信息回写===========================
System.out.println("back ........");
OutputStream out = accept.getOutputStream();
out.write("上传成功".getBytes());
out.close();
//================================ //5. 关闭 资源
bos.close();
bis.close();
accept.close();
System.out.println("文件上传已保存");
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
 
 
 
1
44
 
 
 
1
    public static void main(String[] args) throws IOException {
2
        System.out.println("服务器 启动.....  ");
3
        // 1. 创建服务端ServerSocket
4
        ServerSocket serverSocket = new ServerSocket(6666);
5
        // 2. 循环接收,建立连接
6
        while (true) {
7
            Socket accept = serverSocket.accept();
8
          /*
9
          3. socket对象交给子线程处理,进行读写操作
10
               Runnable接口中,只有一个run方法,使用lambda表达式简化格式
11
            */
12
            new Thread(() -> {
13
                try (
14
                    //3.1 获取输入流对象
15
                    BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
16
                    //3.2 创建输出流对象, 保存到本地 .
17
                    FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
18
                    BufferedOutputStream bos = new BufferedOutputStream(fis);
19
                ) {
20
                    // 3.3 读写数据
21
                    byte[] b = new byte[1024 * 8];
22
                    int len;
23
                    while ((len = bis.read(b)) != -1) {
24
                        bos.write(b, 0, len);
25
                    }
26

27
                    // 4.=======信息回写===========================
28
                    System.out.println("back ........");
29
                    OutputStream out = accept.getOutputStream();
30
                    out.write("上传成功".getBytes());
31
                    out.close();
32
                    //================================
33

34
                    //5. 关闭 资源
 
 
35
                    bos.close();
36
                    bis.close();
37
                    accept.close();
38
                    System.out.println("文件上传已保存");
39
                } catch (IOException e) {
40
                    e.printStackTrace();
41
                }
42
            }).start();
43
        }
44
    }
 
 
客户端
    public static void main(String[] args) throws IOException {
// 1.创建流对象
// 1.1 创建输入流,读取本地文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg"));
// 1.2 创建输出流,写到服务端
Socket socket = new Socket("localhost", 6666);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); //2.写出数据.
byte[] b = new byte[1024 * 8 ];
int len ;
while (( len = bis.read(b))!=-1) {
bos.write(b, 0, len);
}
// 关闭输出流,通知服务端,写出数据完毕
socket.shutdownOutput();
System.out.println("文件发送完毕");
// 3. =====解析回写============
InputStream in = socket.getInputStream();
byte[] back = new byte[20];
in.read(back);
System.out.println(new String(back));
in.close();
// ============================ // 4.释放资源
socket.close();
bis.close();
}
 
 
 
1
29
 
 
 
 
 
1
    public static void main(String[] args) throws IOException {
2
        // 1.创建流对象
3
        // 1.1 创建输入流,读取本地文件
4
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg"));
5
        // 1.2 创建输出流,写到服务端
6
        Socket socket = new Socket("localhost", 6666);
7
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
8

9
        //2.写出数据.
10
        byte[] b  = new byte[1024 * 8 ];
11
        int len ;
12
        while (( len  = bis.read(b))!=-1) {
13
            bos.write(b, 0, len);
14
        }
15
      // 关闭输出流,通知服务端,写出数据完毕
16
        socket.shutdownOutput();
17
        System.out.println("文件发送完毕");
18
        // 3. =====解析回写============
19
        InputStream in = socket.getInputStream();
20
        byte[] back = new byte[20];
21
        in.read(back);
22
        System.out.println(new String(back));
23
        in.close();
24
        // ============================
25

26
        // 4.释放资源
27
        socket.close();
28
        bis.close();
29
    }
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

11Java网络编程的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

随机推荐

  1. CoreFoundation对象的内存管理

    近来没什么新项目做,想学习一些swift开源项目,看了几个文件感觉有点懵,可能水平还没达到,等用到具体内容的时候再去仔细看吧. 关于现在的项目,想想单元测试还可以完善一下,就在framwork工程中写 ...

  2. Linux学习笔记(第十一章)

    文件系统及程序资源的配置ulimit: 环境变量: bash变量 alias设定变量别名 设定别名 取消别名 指令执行顺序 组合键 通配符 数据流重导向 多指令 以下命令都需用管道符链接: 截取命令: ...

  3. C# WPF xml序列化 反序列化

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  4. python 穷举法 算24点(史上最简短代码)

    本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...

  5. LSTM生成尼采风格文章

    LSTM生成文本 github地址 使用循环神经网络生成序列文本数据.循环神经网络可以用来生成音乐.图像作品.语音.对话系统对话等等. 如何生成序列数据? 深度学习中最常见的方法是训练一个网络模型(R ...

  6. HTML基础语法

    目录 HTML基础语法 1.全局架构标签 2.标题 3.段落 4.文本 5.属性 6.链接 7.图片 8.列表 9.表格 10.区块 11.布局 12.表单 13.框架 14.头部 HTML基础语法 ...

  7. kali黑客渗透测试基础环境准备

    1.apt-get install python-nmap 2.apt-get install python-setuptools 正在读取软件包列表... 完成 正在分析软件包的依赖关系树      ...

  8. linux中使sqlplus能够上下翻页

    安装包链接:https://pan.baidu.com/s/1WsQTeEQClM88aEqIvNi2ag 提取码:s241  rlwrap-0.37-1.el6.x86_64.rpm 和 rlwra ...

  9. 前端开发工具icestar

    前端开发工具icestar 最近忙里偷闲,把之前的mock工具进行了全面的重构,最大的改变就是换了个名称icestar,icestar意思就是"爱死他",首先他的预想并不只是替代m ...

  10. Siki_Unity_2-9_C#高级教程(未完)

    Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...