【计算机网络】网络编程UDP和TCP的Socket api


下面我们将要介绍一下网络编程,网络编程是指在应用层和传输层之间的编程。
操作系统内核(传输层)提供了一套api,也叫做socket api。
通过这个api就可以进行传输层和应用层之间的通信了。
这个api主要分为两种, 一个是TCP,一个是UDP

TCP和UDP区别

tcp和UDP都是关于网络的传输层中的相关协议。
下面我们就具体的来看一下这两个具体的差别

TCPUDP解释
有连接无连接有连接先接通,然后才可以传输
eg:打电话
无连接是在不接通的情况下就可以传输 eg:微信消息
可靠传输不可靠传输可靠传输是可以知道对方有没有接收到消息 eg:钉钉的已读
不可靠传输时**不知道对方有没有收到消息 **eg:QQ,微信
面向字节流面向数据报面向字节流传输的时候可以传输任意大小的数据
面向数据报只可以传输完整的报文
全双工全双工全双工:一条链路,双向通信
半双工:一条链路,单向通信

UDP的Socket

UDP的socket比TCP简单
UDP的Socket编程主要涉及到一下两个类:
DatagramSocket:一个用作工具的类
DatagramPacket: 一个具体的数据报类,UDP传输的最小单位

DatagramSocket

这个类主要是操作类,负责关于网络编程的一系列的操作动作
DatagramSocket就是数据报
一个这样的DataSocket对象,就对应着一个socket文件。
这个socket文件不是别的,其实就是网卡(操作系统中将网卡视为文件)
从socket文件中读取数据,就是读网卡
从socket文件中写数据,就是写网卡
这里客户端和服务器的socket都使用的是DatagramSocket
如果指定了端口号,表示自己的设备的端口号
如果没有端口号,表示系统会自动为本设备匹配端口号

DatagramPacket

这个类的对象就是代表着一个具体的数据报,是UDP传输的基本单位。
我们最后传输的就一定是数据报也就是DatagramPacket的方式。

应用:EchoServer

这个就是写一个回显服务,就是传入什么信息,就传出什么信息。
基本上不涉及什么具体的业务逻辑,只是使用socket进行转发而已

服务器代码

服务器的构造函数:
import java.net.DatagramSocket;
import java.net.SocketException;

public class EchoServer {
    //首先这个服务器类必须有一个Socket对象
    private DatagramSocket datagramSocket=null;//先设为null,用到的时候再赋值
    public EchoServer(int port) throws SocketException {
        //为socket初始化,注意这个socket要知道它的端口号才行
        datagramSocket=new DatagramSocket(port);
    }
}
  1. 对于我们这个服务器来说,必须需要一个DatagramSocket来帮助我们进行操作Scoket网卡
  2. 这个**DatagramSocket是必须需要一个端口号的,用于定位,**相当于一个电话号码,通过电话号码(端口号)来定位
  3. 这个端口号可以自己指定,上面的这个就是自己指定的,也可以让系统自动分配
  4. 因为自己指定的端口号可能会出现和原有的应用程序的端口号相同的情况,所以声明一个异常SocketException,另外一个进程打开多个文件也会出现这样的异常,如果已经打开了很多的文件,那么这个socket文件就有可能打不开

服务器的工作函数start()

服务器的工作的主要内容

  1. 接收客户端的请求
  2. 根据请求做出相应
  3. 将相应返回给客户端

下面是具体的操作:

    public void start() throws IOException {
        System.out.println("start the server");
        //因为UDP不需要进行全连接,所以直接开始工作:
        while(true){
            //1. 接收客户端的请求
            //a. 先创建一个空盘子,之后好往里面输入数据
            DatagramPacket receivePacket=new DatagramPacket(new byte[100],100);
            //b. 将接收到的数据保存到数据报中
            datagramSocket.receive(receivePacket);
            //c. 将datagramPacket中的内容转化成一个字符串,一般都是转为字符串来进行交流
            //注意:这里的datagramPacket就是将byte[]数组进行了简单封装,所以这里的getData就是原来的数组,getlength是接收到的数组的长度
            String request=new String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");
            //2. 根据请求做出相应
            //因为这是一个回显服务器,所以直接返回相同的内容
            String respond=process(request);
            //3. 将相应返回给客户端
            //a. 先构造出一个packet,因为里面使用String,到了外层还是使用packet的
            DatagramPacket respondPacket=new DatagramPacket(respond.getBytes(),respond.getBytes().length,
                    receivePacket.getSocketAddress());//必须要回传地址且传回的地址必须和传入的地址一样! ip和端口号
            //b. 返回Packet
            datagramSocket.send(respondPacket);
        }
    }

主要的流程就是:

receive(Packet receive)---------->Packet receive-------->String receive 传入
String receive--------->process()--------->String respond 处理
String respond-------Packet respond---------->send(Packet respond) 传出

主要的细节都在代码的注释里面
还有一个特别容易弄混的一点就是:

  1. 从Packet到String
 String request=new String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");

getData–直接获取数组
0 起始的坐标
getLength 获取的长度
utf-8 编码方式

  1. 从String到Packet
DatagramPacket respondPacket=new DatagramPacket(respond.getBytes(),
                                                respond.getBytes().length,
                                                receivePacket.getSocketAddress());
                                //必须要回传地址且传回的地址必须和传入的地址一样! ip和端口号

getByte 将字符转为byte[]数组
getByte().length 等到字节数组的长度
getSocketAddress() 等到ip地址和port端口号

客户端代码

客户端的构造函数
import java.net.DatagramSocket;
import java.net.SocketException;

public class EchoClient {
    private DatagramSocket datagramSocket=null;
    //客户端需要指明服务器的地址,这样才知道向谁发送请求
    private String ServerIp;
    private int ServerPort;
    public EchoClient(String ip,int port) throws SocketException {
        //将Socket初始化,
        //这个客户端的socket对象是不用手动指定端口号的,而是让系统自动分配
        datagramSocket=new DatagramSocket();
        this.ServerIp=ip;
        this.ServerPort=port;
    }
}

这里我们需要和服务器的构造函数进行一下是否有无端口号的对比:

首先我们再来复习一下子什么是端口号.
端口号是对应我们计算机中的应用程序来说的,每一个程序/进程都会被系统分配一个端口号,这个端口号都是对应唯一一个程序的,一个进程不可以匹配同一个端口号.

上面的服务器有手动分配端口号,但是这个客户端不是手动分配端口号,这是为什么呢?

因为服务器需要让所有的客户端都知道它的位置,所以它需要人为的确定一个我们知道的端口号,好让客户端发送请求的时候知道位置.
但是,对于客户端来说,客户端是客户电脑上面的程序,客户的电脑上面可能会有多个程序,这样的情况下,我们再手动的进行端口号的输入的话,很可能就会和别的程序的端口号冲突,所以我们对于客户端来说就不需要自己手动的输入端口号了

构造请求数据报

接着我们就可以开始正式的业务请求了,先是输入字符串,然后将字符串包装成数据报的形式,让socket转发给服务器

            //1.从控制台中读取一个字符串
            String s=scanner.nextLine();
            //2.将字符串转化为一个数字报的形式
            DatagramPacket requestPocket=new DatagramPacket(
                s.getBytes(),
                s.getBytes().length,
                InetAddress.getByName("127.0.0.1"),9090);
            //上面的数据报的构造函数是一共4个参数的
            datagramSocket.send(requestPocket);

全部代码
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class EchoClient {
    private DatagramSocket datagramSocket=null;
    //客户端需要指明服务器的地址,这样才知道向谁发送请求
    private String ServerIp;
    private int ServerPort;
    public EchoClient(String ip,int port) throws SocketException {
        //将Socket初始化,
        //这个客户端的socket对象是不用手动指定端口号的,而是让系统自动分配
        datagramSocket=new DatagramSocket();
        //这里的是服务器的地址和端口
        this.ServerIp=ip;
        this.ServerPort=port;
    }
    public void start() throws IOException {
        Scanner scanner=new Scanner(System.in);
        while(true){
            //1.从控制台中读取一个字符串
            String s=scanner.nextLine();
            //2.将字符串转化为一个数字报的形式
            DatagramPacket requestPocket=new DatagramPacket(s.getBytes(),s.getBytes().length,
                    InetAddress.getByName("127.0.0.1"),9090);
            datagramSocket.send(requestPocket);
            //3.接收到response数据报
            //先准备好一个数据报好用来接收
            DatagramPacket receivePocket=new DatagramPacket(new byte[1024],1024);
            datagramSocket.receive(receivePocket);
            //4.将数据报解析为字符串
            String response=new String(receivePocket.getData(),
                        0,receivePocket.getLength(),
                        "UTF-8");
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
        EchoClient echoClient=new EchoClient("127.0.0.1",9090);
        echoClient.start();
    }
}

运行结果

我们可以开多个客户端和服务器进行交互
image.png

五元组

服务器客户端
源IP服务器自身ip客户端的自身ip
源端口号服务器自身的端口号客户端的自身的端口号
目标ip收到的数据报的ip服务器的ip
目标端口号收到的数据报的端口号服务器的端口号
协议类型UDPUDP

TCP的socket

TCp的socket的api主要是包括,
serverSocket负责接收来自于客户端传来的消息
socket是我们传输字节流的的基本单位,如服务器接收到的就是socket对象
客户端发给服务器的也是socket对象


应用:EchoServer

服务器的代码

服务器的构造函数
  1. 首先我们得需要一个ServerSocket来进行整个服务器的接收工作
  2. 在构造函数中我们要手动的为serverSocket指定一个服务器的端口号
    //TCP也是需要有一个Socket来帮助我们来进行操控
    private ServerSocket serverSocket=null;
    //这个端口号是我们为当前的服务器指定的
    public TCPEchoServer(int port) throws IOException {
        serverSocket=new ServerSocket(port);
    }

服务器的工作函数start()
  1. 先是建立连接

因为TCP协议是有连接的,所以我们这里就不能像UDP一样直接就工作了,我们要先是等待客户端连上了以后,我们才可以进行以后的操作

就是类比一下:
服务器就是像客户端进行打电话的一位,
如果客户端一直不接听,它们之间就不会连接,不会有之后的工作
如果客户端接听了,它们才算是连接了,可以进行工作了

多线程处理

注意:
为了实现一个服务器对应多个客户端我们就可以使用多线程的方式:

在while循环中,只要是接收到了客户端的消息,我们就创建一个线程来对这个消息进行单独的处理,这样就可以达到一对多的效果了

    public void start() throws IOException {
        while(true){
            System.out.println("TCP服务器启动");
            //1.TCP协议需要先建立连接才可以,
            // 所以这里的socket要等到客户端和服务器接通才可以正常工作
            //2.返回一个Socket对象----clientSocket,将接收到的客户端的请求,
            // 以后的客户端和服务器之间的工作都通过clientSocket来进行
            Socket clientSocket=serverSocket.accept();
            //[注意]为了实现一个服务器对应多个客户端,我们使用多线程的方式.
            //对每一个新接收到的socket都创建一个新的线程来进行处理
            Thread thread=new Thread(()->{
                try {
                    connection(clientSocket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
            thread.start();
        }
    }

线程池处理

比上面的多线程更加高效的是,我们还可以使用线程池来更好的进行处理

创建一个线程池
在线程池中提交一个又一个的线程

 public void start() throws IOException {
        ExecutorService pool= Executors.newCachedThreadPool();
        while(true){
            System.out.println("TCP服务器启动");
            //1.TCP协议需要先建立连接才可以,
            // 所以这里的socket要等到客户端和服务器接通才可以正常工作
            //2.返回一个Socket对象----clientSocket,将接收到的客户端的请求,
            // 以后的客户端和服务器之间的工作都通过clientSocket来进行
            Socket clientSocket=serverSocket.accept();
            //[注意]为了实现一个服务器对应多个客户端,我们使用线程池的方式.
            //对每一个新接收到的socket都放到线程池中进行处理
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        connection(clientSocket);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
        }
    }
  1. 接下来是真正的开始处理服务器和客户端的消息的接收和回应

这里TCP的传输方式是面向字节流和UDP的数据报的方式不一样,直接像文件的读写一样进行消息的接收和回传就可以
过程:

  1. 打开socket的输入流和输出流
  2. 用Scanner来读取输入流
  3. 进行possess处理
  4. 使用PrintWriter来写入输出流
  5. 如果没有请求了,就断开和服务器的连接
private void connection(Socket clientSocket) throws IOException {
        System.out.printf("服务器和客户端[%s %d]建立了连接\n",
                clientSocket.getInetAddress().toString(),clientSocket.getPort());
        //这里和文件的读和写一样,只不过这个输入流和输出流都是socket中的客户端的输入和服务器的输出
        try(InputStream inputStream=clientSocket.getInputStream()) {
            try(OutputStream outputStream=clientSocket.getOutputStream()){
                while(true){
                    //1.读取客户端的请求
                    //使用Scanner来代替inputStream进行读取 方便
                    Scanner scanner=new Scanner(inputStream);
                    //如果没有读取内容了,就没有请求了,就可以断开连接了
                    if(!scanner.hasNext()){
                        System.out.println("服务器和客户端断开连接");
                        break;
                    }
                    //读取到的字符串请求
                    String request=scanner.next();
                    //2.做出响应
                    String response=possess(request);
                    //3.写回客户端
                    // 将outputStream包装成PrintWriter,方便
                    PrintWriter printWriter=new PrintWriter(outputStream);
                    // 写操作,不要看它是println,不是打印操作,而是写操作
                    printWriter.println(response);
                    // 及时的刷新到客户端中,使客户端可以及时的收到
                    printWriter.flush();
                    System.out.printf("服务器对客户端[%s %d]的request:%s的response是%s\n",
                            clientSocket.getInetAddress().toString(),
                            clientSocket.getPort(),
                            request,response);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            clientSocket.close();
        }
    }

    private String possess(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        TCPEchoServer tcpEchoServer=new TCPEchoServer(9090);
        tcpEchoServer.start();
    }

客户端的代码

客户端的构造函数

客户端的构造函数就只有有Socket对象就可以了.
另外,这个socket的构造函数的端口号和ip指的是服务器的端口号和IP地址

    //这里的客户端使用的是这样的socket
    Socket socket=null;
    public TCPEchoClient(String ip,int port) throws IOException {
        //这里的ip和port是指服务器的ip和port,为了找到服务器的位置
        socket=new Socket(ip,port);
    }

客户端的工作函数start()

这个客户端的工作流程和服务器的很像:

  1. 先打开socket的inputStream和outputStream
  2. 先从键盘中读取请求
  3. 将请求用printWriter写到outputStream中,
  4. 用scanner读取inputStream中的响应
 public void start(){
        System.out.println("和服务器建立连接");
        Scanner scanner=new Scanner(System.in);
        try(InputStream inputStream=socket.getInputStream()){
            try(OutputStream outputStream=socket.getOutputStream()){
                while(true){
                    //1.从键盘读取请求
                    System.out.println("->");
                    String request=scanner.next();
                    //2.将请求发送给服务器
                    // 为了方便,还是使用printWriter对outputStream包装
                    PrintWriter printWriter=new PrintWriter(outputStream);
                    // 写操作
                    printWriter.println(request);
                    // 刷新缓冲区,防止服务器接收不到
                    printWriter.flush();
                    //3.从服务器接收请求
                    Scanner responseScanner=new Scanner(inputStream);
                    String response=responseScanner.next();
                    //4.打印接收到的请求
                    System.out.printf("req:%s resp:%s\n",request,response);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws IOException {
        TCPEchoClient tcpEchoClient=new TCPEchoClient("127.0.0.1",9090);
        tcpEchoClient.start();
    }
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
目 录 一、目录…………………………………………………………………1 二、题目……………………………………………………………2 三、设计任务…………………………………………………2 四、WinSocket简介及特点原理…………………………………2 五、TCP简介及特点原理………………………………………3 六、Visual C++简介………………………………………………7 七、设计方案…………………………………………………8 八、系统的原理框图和程序流程图………………………10 九、实验中的问题…………………………………………………14 十、实验结果及分析………………………………………………14 十一、课程设计的总结体会………………………………………16 十二、参考文献……………………………………………………16 利用Socket实现双机通信 一、设计任务 1.利用WinSock来实现双机通信,理解TCP状态机图。 2.要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。 二、WinSocket简介及特点原理 2.1、什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应 用程序通常通过"套接字"向网络发出请求或者应答网络请求。 Socket接口是TCP/IP网络APISocket接口定义了许多函数或例程,程序员可以用 它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解So cket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和 输出的话,就很容易了解Socket了。网络Socket数据传输是一种特殊的I/O,Socket也 是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现 的。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_D GRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Soc ket是一种无连接的Socket,对应于无连接的UDP服务应用。   最重要的是,socket 是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket 系统调用。客户随机申请一个socket (相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个so cket号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫 方知道的电话号码)。 socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器so cket 半相关为全局所公认非常重要。不妨考虑一下,两个完全随机的用户进程之间如何建立 通信?假如通信双方没有任何一方的socket 固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。 2.2、WinSocket的通信原理 WinSock是一个基于Socket模型的 API。WinSock在 Windows98,Window NT中使用。WinSock一般由两部分组成:开发组件和运行组件。开发组件是供程序员在w indows环境下开发网络应用程序使用的,它包括应用程序接口库函数、头文件和实现的 文档,其中最主要的是WINSOCK.H运行组件是以动态链接库(DlL)来实现socket接口的。 文件名为WINSOCK.DLL应用程序在执行时装入它就能实现网络通信功能 三、TCP简介及特点原理 1.什么是TCP TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能 。   在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常 需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包 交换。   应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分 割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU )的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层 。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实 体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK)
本书详细介绍了利用Visual C# 2005进行网络编程的方法和技巧。全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和工程实践性,书中提供的通用模块和典型实例稍加修改就可以为读者所用。   本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学参考书。 第1章 C#.NET网络编程概述  1.1 网络通信概述   1.1.1 网络通信模型概述   1.1.2 网络通信协议、接口和服务概述   1.1.3 TCP/IP网络架构概述   1.1.4 IP地址与端口  1.2 C#.NET网络编程相关类   1.2.1 IPAddress类   1.2.2 DNS类   1.2.3 IPHostEntry类   1.2.4 IPEndPoint类   1.2.5 Socket类  1.3 套接字概述   1.3.1 套接字的类型和常用属性   1.3.2 建立面向连接的套接字   1.3.3 建立面向无连接的套接字  1.4 使用套接字的简单示例   1.4.1 C/S与B/S架构通信模式概述   1.4.2 编写客户端代码   1.4.3 编写服务器端代码 .  1.4.4 无阻塞套接字  1.5 本章小结 第2章 C#.NET高级网络编程技术概述  2.1 线程与网络通信   2.1.1 基于线程的网络通信概述   2.1.2 在网络编程中使用多线程   2.1.3 线程基础   2.1.4 多线程在网络编程中的应用  2.2 网络通信的常见问题   2.2.1 让网络通信代码更强壮   2.2.2 数据缓冲区处理方法  2.3 TCP无保护消息边界   2.3.1 发送固定长度的消息   2.3.2 采用变长的消息   2.3.3 使用特殊标记处理消息  2.4 本章小结 第3章 开发基于TCP协议的应用程序  3.1 套接字与TCP协议   3.1.1 使用套接字传输数据   3.1.2 NetworkStream对象同数据发送与接收   3.1.3 TcpClient与TcpListener类   3.1.4 使用TCP/IP协议编写应用层的通信代码  3.2 开发异步的TCP应用编程   3.2.1 TCP的异步通信流程   3.2.2 线程阻塞与异步中的同步问题  3.3 开发异步的TCP聊天程序   3.3.1 客户端界面设计   3.3.2 客户端业务逻辑设计   3.3.3 服务器端界面设计   3.3.4 服务器端业务逻辑设计   3.3.5 运行界面  3.4 本章小结 第4章 开发基于UDP的应用程序  4.1 UDP通信协议概述   4.1.1 UDP协议与TCP协议的差别   4.1.2 UDP协议的使用场合  4.2 在C#下UDP协议的相关类   4.2.1 IPAddress类   4.2.2 UdpClient类的构造函数   4.2.3 UdpClient类的常用方法与实例  4.3 UDP协议使用示例   4.3.1 UDP模块功能概述   4.3.2 设计通信流程   4.3.3 开发服务器端程序   4.3.4 开发客户端程序   4.3.5 使用多线程开发UDP协议   4.3.6 使用校验保证信息完整性   4.3.7 效果演示  4.4 本章小结 第5章 开发基于SNMP协议的应用程序  5.1 SNMP协议概述   5.1.1 了解SNMP协议   5.1.2 SNMP的常用命令   5.1.3 设计SNMP包  5.2 SNMP协议使用示例   5.2.1 需求分析与设计   5.2.2 设计程序流程   5.2.3 程序窗口界面设计   5.2.4 SNMP类编写   5.2.5 SNMP程序窗口类编写  5.3 运行效果演示  5.4 使用供货商提供的MIB库  5.5 本章小结 第6章 使用.NET发送邮件  6.1 邮件发送与接收协议概述   6.1.1 SMTP协议与邮件发送   6.1.2 POP3协议与邮件接收   6.1.3 .NET下支持SMTP和POP3的类  6.2 邮件发送与接收模块   6.2.1 需求分析与设计   6.2.2 设计邮件发送和接收的流程   6.2.3 界面设计   6.2.4 编写主窗口的业务逻辑   6.2.5 编写发送邮件的业务逻辑   6.2.6 编写接收邮件的业务逻辑   6.2.7 使用多线程发送与接收邮件  6.3 运行效果演示  6.4 本章小结 第7章 FTP下载与文件传输  7.1 FTP协议概述   7.1.1 使用FTP协议下载文件的流程   7.1.2 相关类库说明  7.2 FTP客户端设计   7.2.1 需求分析   7.2.2 界面设计   7.2.3 业务逻辑设计  7.3 FTP服务器端设计   7.3.1 需求分析   7.3.2 FTP响应码   7.3.3 业务逻辑设计  7.4 运行界面  7.5 本章小结 第8章 基于C#.NET的网络管理模块  8.1 ICMP协议概述   8.1.1 ping命令   8.1.2 tracert命令  8.2 ICMP包  8.3 编写网络管理模块   8.3.1 需求分析   8.3.2 界面设计   8.3.3 编写核心icmp类的业务逻辑   8.3.4 编写具有ping功能的业务逻辑   8.3.5 编写具有tracert功能的业务逻辑   8.3.6 编写findmask功能的业务逻辑   8.3.7 编写时间戳功能的业务逻辑  8.4 运行界面  8.5 本章小结 第9章 编写基于.NET的Web Service  9.1 Web Service概述   9.1.1 Web服务基本概念   9.1.2 Web服务的优势   9.1.3 Web服务的架构  9.2 需求分析与设计   9.2.1 需求分析   9.2.2 文件功能设计   9.2.3 数据库设计  9.3 编写Web Service服务系统   9.3.1 构建Web Service   9.3.2 编写Web服务代码   9.3.3 主页面与登录相关的WebService数据访问模块   9.3.4 发表主题相关的Web Service访问模块   9.3.5 投票相关的Web Service访问模块   9.3.6 管理相关的Web Service访问模块  9.4 主页面与登录模块   9.4.1 界面设计   9.4.2 编写业务逻辑  9.5 发表主题模块   9.5.1 界面设计   9.5.2 编写业务逻辑  9.6 投票模块   9.6.1 界面设计   9.6.2 编写业务逻辑  9.7 管理模块   9.7.1 界面设计   9.7.2 编写业务逻辑  9.8 本章小结 第10章 基于.NET的远程技术  10.1 远程技术概述   10.1.1 远程技术开发结构   10.1.2 远程技术使用  10.2 远程控制开发客户端的设计   10.2.1 界面设计与控件使用   10.2.2 客户端的代码设计  10.3 远程控制开发服务器端的设计   10.3.1 界面设计与控件使用   10.3.2 服务器端的代码设计  10.4 运行效果演示  10.5 本章小结 第11章 流媒体在线播放  11.1 需求分析与设计   11.1.1 需求分析   11.1.2 模块设计   11.1.3 数据库设计  11.2 DirectShow接口   11.2.1 滤波图模型   11.2.2 如何使用DirectShow接口   11.2.3 流媒体在线播放相关接口  11.3 流媒体协议   11.3.1 实时传输协议(RTP)   11.3.2 实时传输控制协议(RTCP)   11.3.3 实时流传输协议(RTSP)   11.3.4 流媒体服务过程  11.4 建立.NET的窗体项目   11.4.1 主窗口界面设计   11.4.2 收藏夹数据库相关业务逻辑设计   11.4.3 流媒体在线播放器业务逻辑设计  11.5 运行效果演示  11.6 本章小结 第12章 在线五子棋系统模块  12.1 需求分析与设计   12.1.1 需求分析   12.1.2 模块设计  12.2 五子棋规则类设计   12.2.1 胜负判定类   12.2.2 行棋规则类  12.3 基于TCP协议的通信类   12.4 网络配置模块   12.4.1 网络配置模块的界面设计   12.4.2 网络配置模块的代码设计  12.5 扫描主机模块   12.5.1 扫描主机模块的界面设计   12.5.2 扫描主机模块的代码设计  12.6 主界面模块   12.6.1 主界面模块的界面设计   12.6.2 主界面模块的代码设计  12.7 运行界面  12.8 本章小结 第13章 基于HTTP协议的下载工具  13.1 HTTP协议   13.1.1 HTTP下载理论   13.1.2 .NET的几个支持HTTP协议的类  13.2 异步机制   13.2.1 异步机制的原理   13.2.2 异步类  13.3 下载工具的设计   13.3.1 需求设计   13.3.2 模块设计   13.3.3 界面设计   13.3.4 业务逻辑设计  13.4 运行效果演示  13.5 本章小结 Microsoft Visual C# 2005是一种新的编程环境,它是为生成在.NET Framework上运行的多种应用程序而设计的。C#简单,功能强大,类型安全,而且是面向对象的。C#凭借它的许多创新实现了对应用程序的快速开发。. Visual Studio支持Visual C#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过.NET Framework类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发周期。 本书大量地使用了.NET Framework提供的类库中的函数来协同开发,通过使用这些已经被封装的类来协助开发确实提高了不少效率,为开发工作带来了诸多的便利。 本书共分13章,第1章介绍了利用Visual C# 2005提供的网络命名空间下的诸多API进行套接字的开发,并对网络编程的原理进行了详细的阐述,为后续的章节奠定了基础。 第2章介绍了具有多线程能力的网络应用程序,这使得用户开发的程序能够适应更加复杂的情况。 第3章~第8章是本书的重要部分,主要介绍基于各种不同协议的网络编程应用模块。第3章介绍了基于TCP协议的聊天程序;第4章介绍了基于UDP的通信程序;第5章介绍了使用SNMP协议的网络管理程序;第6章介绍了使用SMTP以及POP3协议的E-mail系统;第7章介绍了基于FTP的文件传输模块;第8章介绍了使用ICMP协议的网络探测程序。 第9章介绍了基于Web Service的电子公告板系统,并结合采用了SQL Server 2005数据库;第10章介绍了使用远程控制技术的应用程序;第11章则介绍了流媒体在线播放系统。.. 第12章介绍了基于TCP通信协议的在线五子棋系统;第13章主要介绍了基于HTTP协议的下载工具,该工具具有多线程下载、断点续传的功能。 本书注重理论指导性和工程实践性,书中提供的各个网络应用程序只要稍加修改就可以为读者所用。本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学、参考用书。 本书主要由梅晓冬、颜烨青执笔,在编写本书程序的过程中,得到了陈璧元的大力支持,在此表示衷心的感谢。此外,还要感谢杨文军、程伟、袁远、刘武、彭澜、李通、李杰、卢茂琼、张燕生、胡燕生、邓湘成、卢下知、王周浩、邱岳、刘流、代本、刘明星、孙靖华等人,他们在本书编写过程中给予了我鼓励和支持。 由于时间仓促,加之水平有限,书中不足之处在所难免,敬请读者批评指正。... 编者 2008年1月

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值