tcpip网络编程 尹圣雨源码_网络编程——学习笔记

一、计算机网络

1、简介

  • 计算机网络,是把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多计算机可以方便的相互传递信息,共享硬件、软件、数据等资源。计算机网络提供如下功能:

    • 资源共享

    • 信息传输和集中分布

    • 均衡负荷和分布处理

    • 综合信息服务

  • 实现计算机网络条件

    • ip、端口

    • 协议

    • http,upd,tcp/ip

    • 硬件支持

    • 软件支持

2、网络范围

  • 按照规模大小和延伸范围可以分为:局域网、城域网、广域网,其中Internet 是最大的广域网。

  • 按照网络的拓扑结构可以分为:星型网络、总线网络、环线网络、树形网络、星型环线网络等。

  • 按照网络的传播介质可以分为:双绞线网、同轴电缆网、光纤网和卫星网等。

3、网络协议

  • OSI七层模型

  • 17bad5b618f400978c97328ab2c400c6.png

  • TCP、UDP都是属于传输层

    • TCP、UDP都是依赖于ip

  • Http属于应用层

    • 依赖于tcp/ip  协议实现

二、ip和端口

1、IP概述

  • IP 地址用于唯一地表示网络中的一个通信实体。基于 IP 协议网络中传输的数据包,都必须使用IP 地址来进行标识。

2、端口号

  • 端口主要跟应用有关

三、InetAddress用法

1、简介

  • 通过此对象,获取ip地址及主机名、获取ip状态

2、举例

package IP地址;import java.io.IOException;import java.net.InetAddress;import java.net.UnknownHostException;public class MainTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        //获取本机的ip地址和IP名        try {            //返回本地主机的地址            InetAddress ipAddress = InetAddress.getLocalHost();            //ip地址用byte数组装,原始ip地址            System.out.println("原始ip地址******************");            byte[] ipBuf = ipAddress.getAddress();            for(byte v:ipBuf) {                System.out.print(v+"\t");            }            System.out.println("调用getHostAddress方法,打印出192.。。。。的形式,返回String类型");            String str = ipAddress.getHostAddress();            System.out.println("ip地址为:"+str);            System.out.println("获取此ip地址的主机名**********");            System.out.println(ipAddress.getHostName());        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        System.out.println("根据主机获取对应的InetAddress对象******************");        try {            InetAddress inetAddress = InetAddress.getByName("www.bilibili.com");            //InetAddress inetAddress = InetAddress.getByName("192.168.137.1");            //判断是否可以到达            System.out.println(inetAddress.isReachable(100));            //输出可连接到ip地址            System.out.println(inetAddress.getHostAddress());        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }}}

四、TCP/IP协议

1、简介

  • TCP/IP通信协议是一种可靠的网络协议

    • 通过TCP/IP协议实现数据传输,保证数据不丢失,对方肯定可以稳定接到数据

    • 可靠

  • 特点

    • socket.getInputStream():读数据

    • socket.getOutputStream():写数据

    • server(服务端)

    • client(客户端)

    • 四次挥手

    • 三次握手

    • 它是面向对象连接的协议

    • 关闭连接

    • TCP/IP协议它是针对客户端(client)、服务端(Server)而言的

    • 当连接成功之后,建立网络虚拟链路,此链路其实就是网络IO流,生成一个端点,此端点就是Socket(套接口),通过Socket获取IO流的输入和输出

2、tcp/ip工作原理

6af33501d571672a34e7217247b6c90d.png

  • 工作步骤

    • 客户端与服务端面向连接

    • 三次握手

    • 18127b47943c3e45d4cd950d5d57c8ac.png

    • 所谓三次握手(Three-Way Handshake)即建立TCP连接,是指建立一个TCP连接时,需要客户端和务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发

  • 建立连接关系之后,产生网络虚拟链路,就是网络IO流(SocketStream)

  • 如何实现数据通讯

    • 获取针对客户端而言的,获取输入流,读数据

      InputStream inputstream=socket.getInputStream();
    • 读数据

      inputstream.read(buf);
    • 获取针对客户端而言,获取输出流

      OutputStream outPutStram=socket.getOutputStream()
    • 写数据

      outPutStream.write(xxx);
    • 客户端发送数据给服务端

    • 服务端发送数据给客户端

  • 关闭连接

    • 四次挥手

    • 16413b5e4ab543b71360fbe9349795d5.png

五、第一个tcp/ip实例

  • 需求

    • 服务端发送字符串给客户端

1、创建TCP服务器端

package 第一个tcpip实例;import java.io.IOException;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;/* * 编写一个tcpip的服务端程序 * */public class TcpIpServer {    //定义端口    public static final int PORT=30001;     public static void main(String[] args) {        //创建ServerSocket对象        //创建tcpip服务端程序的类对象        ServerSocket ss=null;        try {                   ss=new ServerSocket(PORT);            //调用一个方法            //它是一个阻塞方法,等待客户端的连接,客户端一有连接,立即返回socket对象            System.out.println("accept start");            Socket socket=ss.accept();            System.out.println("accept end  socket ip="+socket.getInetAddress().getHostAddress());            //服务端发送字符串“hello world”给客户端接受            //获取输出流对象            OutputStream outputStream=socket.getOutputStream();            //写数据            byte buf[]="hello world".getBytes();            outputStream.write(buf);            outputStream.flush();        } catch (IOException e) {                   // TODO Auto-generated catch block            e.printStackTrace();        }}}

2、创建TCP客户端

package 第一个tcpip实例;import java.io.IOException;import java.io.InputStream;import java.net.Socket;public class TcpIpClient {    public static void main(String[] args) {        //针对tcpip的服务端,进行连接        //创建Socket对象        try {            Socket ss=new Socket("192.168.59.90", TcpIpServer.PORT);            //客户端读取服务端发送过来的数据            InputStream inStream=ss.getInputStream();            byte []buf=new byte[32];            int readLen=inStream.read(buf);            String receiveMessage=new String(buf,0,readLen);            System.out.println("接受服务端发送过来的数据="+receiveMessage);            //关闭tcpip的连接            ss.close();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }}}

3、第二个TCP实例

  • 需求

    • 客户端与服务端可以相互收发数据

  • 实例

    package 第二个tcpip实例;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class Server {    public final static int PORT=30004;    public static void main(String[] args) {        //创建ServerSocket         ServerSocket ss=null;        try {            ss=new ServerSocket(PORT);            //等待客户端的连接,此accept方法是等待、阻塞方法            Socket socket=ss.accept();            //发送数据给客户端            OutputStream outputStream=socket.getOutputStream();            outputStream.write("欢迎光临!".getBytes());            outputStream.flush();            //接受客户端发送过来的数据            InputStream inStream=socket.getInputStream();            byte buf[]=new byte[32];            int readLen=inStream.read(buf);            System.out.println("接受客户端发送过来的数据="+new String(buf,0,readLen));        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }}}
    package 第二个tcpip实例;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class Client {    public static void main(String[] args) {        Socket socket=null;        try {            socket=new Socket("192.168.59.90",Server.PORT);            InputStream inputStream=socket.getInputStream();            //定义buf数组            byte buf[]=new byte[32];            int readLen=inputStream.read(buf);            //获取数据            String recMessage=new String(buf,0,readLen);            System.out.println("recMessage="+recMessage);            //客户端又发送数据给服务端            OutputStream outputStream=socket.getOutputStream();            outputStream.write("我已经收到".getBytes());            outputStream.flush();        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally {            if(socket!=null)            {                try {                    socket.close();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }           }}}
    • 客户端

    • 服务端

4、第三个实例

  • 需求

    • 实现点对点的tcpip聊天功能

  • 所需技术

    • 网络编程

    • IO流

    • 多线程

  • 代码实现

  • 74345623d4c4c59fb306c2e4bef678e4.png

  • 编写服务端程序

    package 第三个tcpip实例;import java.io.IOException;import java.io.OutputStream;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Scanner;public class TcpIpChatServer {    public static final int PORT=30005;    //获取键盘内容    private static Scanner sc=new Scanner(System.in);    public static void main(String[] args) throws IOException {        //创建tcpip的Server端的对象        ServerSocket ss=new ServerSocket(PORT);        //等待监听客户端的连接        Socket socket=ss.accept();        System.out.println("有客户端连接,客户端ip="+socket.getInetAddress().getHostAddress());        //获取输出流的对象        OutputStream outputStream=socket.getOutputStream();        //创建一个打印流         PrintStream ps=new PrintStream(outputStream);        /*         * 可以通过主线程实现写功能         * */        System.out.println("退出输入按q,请输入发送给客户端的内容:");        //定义发送消息的变量        String sendMessage=null;        while((sendMessage=sc.nextLine())!=null)        {            if(sendMessage.equals("q"))            {                //退出聊天                break;            }            ps.println(sendMessage);            ps.flush();        }}    /*     * 实现读线程     * */}
  • 编写客户端程序

    package 第三个tcpip实例;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;import java.net.UnknownHostException;public class TcpIpChatClient {    public static void main(String[] args) throws UnknownHostException, IOException {        //创建Socket对象        Socket socket=new Socket("192.168.59.90", TcpIpChatServer.PORT);        //创建一个专门处理读数据的线程        new TcpIpChatClient().new ReadDataThread(socket).start();}    //定义一个读数据的线程类    public class ReadDataThread extends Thread{        private Socket socket;        private BufferedReader br;        public ReadDataThread(Socket socket) throws IOException        {            this.socket=socket;            //将输入流装饰成缓存流来读取数据            //将inputstream---->inputStreamReader(转换流)---->bufferReader            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));        }        /*         * 可以在子线程的执行体读取数据         * */        @Override        public void run() {            String receveMessage=null;            //读数据            try {                while((receveMessage=br.readLine())!=null)                {                    System.out.println("接受服务端发送过来的数据="+receveMessage);                }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }}}

5、第四个实例

  • 需求

    • 实现聊天室

dd2a1888d6bba8d1fb15da6cc6e1bca8.png

  • 编写服务器

    package 聊天群;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.List;public class Server {    public static final int PORT = 11111;    //定义一个集合,存储Socket对象    private static List<Socket> socketList = new ArrayList<>();    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        //创建ServerSocket对象        ServerSocket ss = new ServerSocket(PORT);        System.out.println("服务器已经启动");        //监听客户端的连接        //一个socket对象对应一个客户端,不断监听客户端的连接        while(true) {            Socket socket = ss.accept();            socketList.add(socket);            System.out.println("接收客户端连接,并且启动子线程 客户端ip:"+socket.getInetAddress().getHostAddress());                        //创建子线程,每个Socket对象,对应一个子线程            new Server().new ReadClientDataThread(socket).start();        }}    /*     * 读取数据的线程     * */    class ReadClientDataThread extends Thread{        private Socket socket;        private BufferedReader br;        public ReadClientDataThread(Socket socket) throws IOException {            this.socket = socket;            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));        }        @Override        public void run() {            //不断读取客户端数据            String recMessage=null;            //获取客户端发送过来的数据,要将数据分发其它的客户端            //因此首先要获取其它客户端的Socket对象,当前socket对象保存在集合对象里面            //遍历存储socket对象的集合            try {                while((recMessage=br.readLine())!=null) {                    //获取客户端发送过来的数据,要将数据分发其它的客户端                    //因此首先要获取其它客户端的Socket对象,当前socket对象保存在集合对象里面                    //遍历存储socket对象的集合                    for(Socket sc:socketList) {                        //封装打印流(PrintStream)                        PrintStream ps=new PrintStream(sc.getOutputStream());                        //将数据写到另外的客户端                        ps.println(recMessage);                    }                }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }}}
  • 编写客户端

    package 聊天群;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner;import java.io.OutputStream;public class ChatClient {    // 获取键盘内容    private static Scanner sc = new Scanner(System.in);    public static void main(String[] args) throws UnknownHostException, IOException {        // 创建Socket对象        Socket socket = new Socket("192.168.59.21",Server.PORT);        // 创建一个专门处理读数据的线程        new ChatClient().new ReadDataThread(socket).start();        // 获取输出流的对象        OutputStream outputStream = socket.getOutputStream();        // 创建一个打印流        PrintStream ps = new PrintStream(outputStream);        /*        * 可以通过主线程实现写功能        */        System.out.println("退出输入按q,请输入发送给服务端的内容:");        // 定义发送消息的变量        String sendMessage = null;        while ((sendMessage = sc.nextLine()) != null) {            if (sendMessage.equals("q")) {                // 退出聊天                break;        }            ps.println(sendMessage);            ps.flush();    }        System.out.println("主线程结束");        sc.close();}    // 定义一个读数据的线程类    public class ReadDataThread extends Thread {        private Socket socket;        private BufferedReader br;        public ReadDataThread(Socket socket) throws        IOException {            this.socket = socket;            // 将输入流装饰成缓存流来读取数据            // 将inputstream---->inputStreamReader(转换流)---->bufferReader            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));    }        /*         * 可以在子线程的执行体读取数据        */        @Override        public void run() {            String receveMessage = null;            // 读数据            try {                while ((receveMessage = br.readLine()) !=null) {                    System.out.println("接受服务端发送过来的数据=" + receveMessage);            }            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();        }    }}}

六、UDP协议

1、简介

  • UDP协议:用户数据报协议

    • udp协议它是基于数据报,以数据报为单位来传输

  • 传输的是不可靠的数据协议

    • 传输过程中可能存在丢失

  • 非面向连接协议

  • 他没有很明确的客户端、服务端之分

2、UDP协议的优缺点

  • 缺点:

    • 数据传输不可靠

  • 优点:

    • 数据传输速度快

  • 作用域

    • 视频传输(高效,实时的效果)

    • 游戏

3、UDP协议传输原理

  • udp协议它是以数据报(packet)为单位传输,它只管发送,不管你是否接收成功,它是没有应答机制(ack机制)

  • 2c7650b3a655196487326e984d145610.png

  • 数据报包括

    • 目标ip

    • 端口

    • 数据部分

    • 报头

4、UDP核心类

1、DatagramSocket
  • 发送、接收数据

  • DatagramSocket的构造器

    • DatagramSocket(port):绑定端口,创建接收方

    • DatagramSocket():没有绑定端口,它是发送方

    • receive(DatagramPacket  p):接收数据

    • send(DatagramPacket  p):发送数据

2、DatagramPacket
  • 此类描述数据报内容

    • 数据部分

    • ip部分

    • 端口

  • 分析DatagramPacket的构造器

    • 起始位置是offer,长度为length的字节数组接收数据报

    • 将长度为length的字节数组发送到目标主机的ip及端口

    • 用来接收长度为length的数据报

    • DatagramPacket(byte[] buf,int length):肯定属于接收数据报的对象,构造

    • DatagramPacket(byte[] buf,int length,InetAddress address,int port):用来发送数据报 的对象

    • DatagramPacket(byte[] buf,int offest, int length)

3、举例
package udp协议;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import org.junit.Test;public class UDPTest {    //发送端    @Test    public void testSender() throws IOException {        //创建DatagramSocket对象,作为发送方,不需要绑定端口        DatagramSocket socket = new DatagramSocket();        String str = "我是UDP方式发送的数据";        byte[] data = str.getBytes();        InetAddress inet = InetAddress.getLocalHost();        //定义数据报        DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9000);        //发送数据报        socket.send(packet);        socket.close();}    //接收端    @Test    public void testReceiver() throws IOException {        //创建DataDatagramSocket,绑定端口,属于接收端        DatagramSocket socket = new DatagramSocket(9000);        byte[] buffer = new byte[100];        //创建DatagramPacket对象,它是属于接收数据报,将数据报的内容存储到buf数组中去        DatagramPacket packet = new DatagramPacket(buffer, 0,buffer.length);        //调用receiver方法接收数据,它是一个阻塞方法        //将接受的数据存储到数据报中        socket.receive(packet);        //将数据报的字节数组转化成String字符串型        //packet.getData();//接收到的数据        System.out.println(new String(packet.getData(),0,packet.getLength()));        socket.close();}}

5、编写第二个实例

  • 需求

    • 基于UDP协议的实现点对点的聊天功能

  • 所需要技术

    • UDP协议

    • 多线程实现

  • 举例

package UDP点对点聊天;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.util.Scanner;public class A {    private static Scanner sc = new Scanner(System.in);    public static final int PORT=30001;    public static void main(String[] args) throws IOException {        // TODO Auto-generated method stub        //定义发送方的DatagramSocket对象        DatagramSocket sendDS = new DatagramSocket();        //定义接收方的DatagramSocket对象,绑定端口        DatagramSocket receiveDS = new DatagramSocket(PORT);        //启动子线程,接收数据        new A().new ReadDataThread(receiveDS).start();        /*         * 主线程负责发送数据         * */        System.out.println("请输入发送给B主机的内容(退出按n):");        String sendMessage = null;        while((sendMessage=sc.next())!=null) {            if(sendMessage.equals("n")) {                System.out.println("结束聊天!");                break;            }            //创建DatagramPackage对象(发送包),绑定ip和端口            DatagramPacket sendPacket = new DatagramPacket(sendMessage.getBytes(), sendMessage.getBytes().length, InetAddress.getLocalHost(), B.PORT);            //发送包            sendDS.send(sendPacket);        }}    /*     * 子线程负责读取数据     * */    public class ReadDataThread extends Thread{        private DatagramSocket receiveDS;        public ReadDataThread(DatagramSocket receiveDS) {            this.receiveDS = receiveDS;        }        @Override        public void run() {            while(true) {                byte[] buf = new byte[128];                //创建数据报,属于接收数据的数据报                DatagramPacket dp = new DatagramPacket(buf, buf.length);                try {                    receiveDS.receive(dp);                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                //将字节数组转换成字符串                String recMessage = new String(dp.getData(), 0, dp.getLength());                System.out.println("接收B主机发送过来的数据:"+recMessage);            }        }}}
package UDP点对点聊天;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Scanner;public class B {    public static final int PORT=30002;    private static Scanner sc = new Scanner(System.in);    public static void main(String[] args) {        // TODO Auto-generated method stub        //定义发送方的DatagramSocket对象        try {            DatagramSocket sendDS = new DatagramSocket();            //定义接收方的DatagramSocket对象,绑定端口号            DatagramSocket receiveDS = new DatagramSocket(PORT);            //启动子线程            new B().new ReceiveThread(receiveDS).start();            /*             * 主线程负责发送数据             * */            System.out.println("请输入发送给A主机的内容(退出按n):");            String sendMessage = null;            while((sendMessage=sc.next())!=null) {                if(sendMessage.equals("n")) {                    System.out.println("结束聊天!");                    break;                }                //把字符串转化为byte类型                byte[] buf = sendMessage.getBytes();                //创建发送包对象                DatagramPacket sendDP = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), A.PORT);                sendDS.send(sendDP);            }        } catch (SocketException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }}    /*     * 创建子线程,负责读取数据     * */    public class ReceiveThread extends Thread{        private DatagramSocket socket;        public ReceiveThread(DatagramSocket socket) {            this.socket = socket;        }        @Override        public void run() {            while(true) {                //定义一个字节数组接收数据                byte[] buf = new byte[128];                //创建数据报,用于接收数据                DatagramPacket packet = new DatagramPacket(buf, buf.length);                //进行接收                try {                    socket.receive(packet);                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                //把接收的字节数据转换为字符串                String str = new String(packet.getData(),0,packet.getLength());                System.out.println("接收A主机发过来的数据:"+str);            }        }}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tcpip网络编程是一本介绍TCP/IP网络编程的专业技术书籍,作者为尹圣雨。书中主要讲解了TCP/IP的基础知识及其在网络编程中的应用,涉及到Linux下网络编程开发的方方面面,注重理论知识的讲解,同时提供了大量实例代码,适合初学者和进阶开发者学习和参考。 书中的内容覆盖了网络编程中常用的协议,如TCP、UDP、ICMP、IGMP等,讲解了网络编程中的套接字编程、多线程编程、并发编程、网络协议分析、网络安全等重要知识点。书中还提供了许多实用的实例代码,并附有详细的注释,方便读者学习和理解。此外,书中还讨论了网络编程中的一些实际应用场景,如网络文件传输、Socket编程、HTTP/HTTPS协议等。 尹圣雨的这本书对于学习和使用网络编程技术的人来说是一本非常重要的参考资料。从基础到实践,从理论到实战,这本书可以帮助读者全面掌握网络编程的核心知识和技能,同时也可以为开发者提供实用的经验和技巧。无论你是初学者还是专业开发人员,这本书都是值得一读的好书。 ### 回答2: TCP/IP网络编程是现代计算机科学中关键的技能之一。尹圣雨在其出版的《TCP/IP网络编程》一书中,详细讲解了如何使用C语言编写网络应用程序。此外,书中还提供了完整的源代码,方便读者进行实践操作。 尹圣雨的源代码非常详细,对每一个函数、每一段代码都进行了详尽的解释。读者只需要通过跟着书中的示例,逐步理解TCP/IP网络编程的基本概念和知识点,便可以轻松地编写属于自己的网络应用程序。 在源代码中,尹圣雨提供了多个示例程序,如TCP客户端、TCP服务端、UDP客户端、UDP服务端等。这些程序都非常实用,可以直接应用到实际项目中。此外,尹圣雨还介绍了网络编程中常用的一些技术,如Socket编程、Multicast编程、HTTP协议等,为读者打下了扎实的网络编程基础。 总之,尹圣雨的TCP/IP网络编程源码提供了非常有价值的实践操作,对于想要学习网络编程的读者来说是一个非常好的学习资料。只要阅读《TCP/IP网络编程》这本书,并参考其中的源代码,读者便可以轻松地掌握网络编程技术,为自己的职业生涯做好充分准备。 ### 回答3: TCP/IP网络编程是现在网络编程中必须要掌握的技能之一,而尹圣雨源码则是一份非常好的学习资料。尹圣雨的代码项目包含了许多网络编程的核心技术,例如基于TCP协议的socket编程、多线程编程、分布式编程等等。 尹圣雨源码项目有丰富的注释,代码清晰易懂,格式规范,非常适合初学者学习。在源码中,尹圣雨编写了多个案例,包括聊天室、文件传输、邮件发送等等,这些案例不仅涉及到了网络编程的方方面面,而且还非常实用,可以自己在本地进行模拟测试。 此外,尹圣雨源码还包括了网络编程的安全机制、精炼的错误处理、异常处理机制等等。这些技术在网络编程中非常重要,能够提高程序的稳定性和安全性。 总的来说,尹圣雨源码是一份非常实用的学习资料,对于想要学习网络编程的开发者,尤其是初学者而言,非常值得一看。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值