第10章 网络编程补充案例
- 格式:doc
- 大小:207.00 KB
- 文档页数:14
C语言网络编程基础及其应用实例网络编程是计算机科学中的一个重要领域,它涉及到计算机之间的通信和数据传输。
而C语言作为一种高效且广泛使用的编程语言,也被广泛应用于网络编程领域。
本文将介绍C语言网络编程的基础知识,并通过实例来展示其应用。
一、网络编程基础在进行网络编程之前,我们首先需要了解一些基础概念。
网络编程主要涉及两个重要的概念:IP地址和端口号。
IP地址是用来唯一标识网络中的主机的地址。
它由四个十进制数组成,每个数的取值范围是0到255。
例如,192.168.0.1是一个常见的IP地址。
端口号用于标识网络中的应用程序。
一个主机可以同时运行多个应用程序,每个应用程序都会监听一个特定的端口号。
端口号的取值范围是0到65535,其中0到1023是系统保留端口号,一般用于一些常见的服务,如HTTP服务的端口号是80。
在C语言中,我们可以使用socket库进行网络编程。
socket库提供了一组函数,用于创建网络连接、发送和接收数据等操作。
下面我们通过一个简单的实例来演示如何使用C语言进行网络编程。
二、应用实例:简单的服务器和客户端我们将创建一个简单的服务器和客户端程序,通过服务器向客户端发送一条消息。
首先,我们需要创建服务器程序。
以下是服务器程序的代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#define PORT 8080int main() {int server_fd, new_socket, valread;struct sockaddr_in address;int addrlen = sizeof(address);char *message = "Hello from server";// 创建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定地址和端口号if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed");exit(EXIT_FAILURE);}// 监听连接请求if (listen(server_fd, 3) < 0) {perror("listen failed");exit(EXIT_FAILURE);}// 接受客户端连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept failed");exit(EXIT_FAILURE);}// 发送消息给客户端send(new_socket, message, strlen(message), 0);printf("Message sent to client\n");return 0;}```接下来,我们创建客户端程序。
C#网络通讯开发实战第1 章:套接字编程编写网络运用程序是程序设计中最风趣的范畴之一。
眼看着自个编写的程序成功地经过网络完成了通讯,这是格外令人振奋的。
在这一章里,咱们将运用TCP/IP树立一个类似于Windows LiveMessenger(或ICQ)的谈天程序。
经过这个谈天程序,你将学会如安在.NET中进行网络编程,并晓得树立多用户谈天程序时会遇到的种种应战。
第2 章:串行通讯串行通讯是设备之间彼此通讯最陈旧的机制之一。
从IBM PC及其兼容机开端,简直一切的核算机都装备了一个或多个串行端口和一个并行端口。
望文生义,串行端口(serial port )每次1位地接连收发数据,而并行端口(parallel port)则运用8条独立的数据线每次收发8位数据。
虽然串行端口传输速度相对低于并行端口,但串行通讯仍然是设备衔接的盛行选项,因为它简略并且本钱较低。
虽然当今的消耗商品正在运用USB衔接替代串行衔接,可是仍有很多的设备把串行端口作为它们与外部国际衔接的仅有方法。
这一章将介绍怎么运用.NET Framework 2.0和.NET Compact Framework 2.0里新的SerialPort类完成与其他串行设备的通讯。
咱们将树立3个项目,用实例阐明怎么运用串行通讯。
第一个项目是一个谈天程序,它答应(运用串行数据线或许蓝牙相互衔接的)两台核算机进行通讯。
你能够以此程序为根底,对其进行扩大来完成与手机之类的其他外部串行设备的通讯。
你将学会怎么经过一个串行的蓝牙衔接运用A T指令经过程序来操控你的移动电话。
第二个项目是一个Pocket PC谈天程序,与前一个项目十分类似。
第三个项目展现了怎么与GPS接纳器通讯,并从中获取有用的数据用于在地图上显现当时方位。
第3 章:将指纹辨认归入.NET 程序生物特征辨认是承认个别身份最牢靠的方法之一。
如今,大概有很多人现已晓得了微软指纹阅读器(Microsoft Fingerprint Reader)。
第1章Visual C++网络编程概述Visual C++(后面简写为VC)网络编程是指用户使用MFC类库(微软基础类库)在VC编译器中编写程序,以实现网络应用。
用户通过VC编程实现的网络软件可以在网络中不同的计算机之间互传文件、图像等信息。
本章将向用户介绍基于Windows操作系统的网络编程基础知识,其开发环境是VC。
在VC编译器中,使用Windows Socket进行网络程序开发是网络编程中非常重要的一部分。
1.1 网络基础知识如果用户要进行VC网络编程,则必须首先了解计算机网络通信的基本框架和工作原理。
在两台或多台计算机之间进行网络通信时,其通信的双方还必须遵循相同的通信原则和数据格式。
本节将向用户介绍OSI七层网络模型、TCP/IP协议以及C/S编程模型。
1.1.1 OSI七层网络模型OSI网络模型是一个开放式系统互联的参考模型。
通过这个参考模型,用户可以非常直观地了解网络通信的基本过程和原理。
OSI参考模型如图1.1所示。
图1.1 OSI七层网络模型用户从OSI网络模型可以很直观地看到,网络数据从发送方到达接收方的过程中,数据的流向以及经过的通信层和相应的通信协议。
事实上在网络通信的发送端,其通信数据每到一个通信层,都会被该层协议在数据中添加一个包头数据。
而在接收方恰好相反,数据通过每一层时都会被该层协议剥去相应的包头数据。
用户也可以这样理解,即网络模型中的各层都是对等通信。
在OSI七层网络模型中,各个网络层都具有各自的功能,如表1.1所示。
表1.1 各网络层的功能协议层名功能概述物理硬件层表示计算机网络中的物理设备。
常见的有计算机网卡等数据链路层将传输数据进行压缩与加压缩网络层将传输数据进行网络传输数据传输层进行信息的网络传输会话层建立物理网络的连接表示层将传输数据以某种格式进行表示应用层应用程序接口注意:在表1.1中列出了OSI七层网络模型中各层的基本功能概述。
用户根据这些基本的功能概述会对该网络模型有一个比较全面的认识。
第十章补充案例案例10-1使用InetAddress类获取与IP信息一、案例描述1、考核知识点编号:00110004名称:InetAddress类2、练习目标➢掌握InetAddress类的相关API➢掌握如何使用InetAddress类中的方法获取计算机的主机名和IP地址等信息。
3、需求分析InetAddress类中提供了一系列与IP地址相关的方法,利用这些方法可以获取到指定计算机的主机名、IP地址以及连接状态等信息。
为了让初学者掌握InetAddress类中常用方法的使用,本案例将针对如何通过InetAddress类中的方法获取计算机的IP地址、主机名等功能进行演示。
4、设计思路(实现原理)1)编写Example01类。
2)在main()方法中,通过InetAddress类的静态方法getLocalHost()创建实例对象,并通过该对象完成获取计算机主机名和计算机IP地址的操作。
3)分别将获取到的主机名和IP地址输出。
二、案例实现import .InetAddress;import .UnknownHostException;public class Example01 {public static void main(String[] args) throws UnknownHostException {//获取本机的IP地址InetAddress address = InetAddress.getLocalHost();//以字符串形式返回IP地址String ip = address.getHostAddress();//获取此IP地址的主机名String name = address.getHostName();System.out.println("本机的ip地址是:"+ip);System.out.println("本机的hostName是:"+name);}}运行结果如图10-1所示。
《网络编程技术》实验指导书董黎刚信息与电子工程学院浙江工商大学2013-4-28 14:41:00ContentContent (1)课内实验1. Linux平台简单套接字编程 (2)课内实验2. Windows平台简单套接字编程 (4)课内实验3. html网页编程 (5)课内实验4. 客户端Web编程 (6)课内实验5. WinInet编程 (7)课内实验6. 并发套接字编程 (8)课外实验1. MFC编程 (9)课外实验2. MFC WinSock类的编程 (10)课外实验3.服务器端Web编程 (11)课外实验4. HTTP协议应用编程 (12)课外实验5. 电子邮件协议应用编程 (13)课外实验6. 网络综合程序设计 (14)附录1. 程序评分标准 (15)附录2. Linux shell commands (16)附录3. 编程类实验报告参考格式 (18)课内实验1. Linux平台简单套接字编程实验类型:设计性一、实验环境操作系统:Linux编程工具及集成开发环境:gcc, vi或anjuta二、实验目的和要求实验目的:掌握Linux平台上简单的客户机端和服务器端的套接字编程。
实验要求:(1)在Linux上,编写、编译1个客户机端程序和1个服务器端程序。
要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。
(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。
可选内容:(1)编写聊天程序,即客户机端程序和服务器端程序之间都能够多次发送消息给对方,也能够多次接收对方发送的消息。
(2)编写TCP和UDP两种程序。
三、实验提示(1)从/dlg/HomeTeaching_files/download/source_code/socket/v3.linux.dist.tar.Z可以下载可供参考的程序。
解压采用“zcat v3.linux.dist.tar.Z | tar xvf –”。
第十章补充案例案例10-1使用InetAddress类获取与IP信息一、案例描述1、考核知识点编号:4名称:InetAddress类2、练习目标➢掌握InetAddress类的相关API➢掌握如何使用InetAddress类中的方法获取计算机的主机名和IP地址等信息。
3、需求分析InetAddress类中提供了一系列与IP地址相关的方法,利用这些方法可以获取到指定计算机的主机名、IP地址以及连接状态等信息。
为了让初学者掌握InetAddress类中常用方法的使用,本案例将针对如何通过InetAddress类中的方法获取计算机的IP地址、主机名等功能进行演示。
4、设计思路(实现原理)1)编写Example01类。
2)在main()方法中,通过InetAddress类的静态方法getLocalHost()创建实例对象,并通过该对象完成获取计算机主机名和计算机IP地址的操作。
3)分别将获取到的主机名和IP地址输出。
二、案例实现import .InetAddress;import .UnknownHostException;public class Example01 {public static void main(String[] args) throws UnknownHostException {//获取本机的IP地址InetAddress address = InetAddress.getLocalHost();//以字符串形式返回IP地址String ip = address.getHostAddress();//获取此IP地址的主机名String name = address.getHostName();System.out.println("本机的ip地址是:"+ip);System.out.println("本机的hostName是:"+name);}}运行结果如图10-1所示。
图10-1运行结果三、案例总结1、InetAddress类用于封装一个IP地址,并提供了一系列与IP地址相关的方法,其中,getByName(String host)方法表示获取指定主机的IP地址,常用于获取远程计算机的IP信息,isReachable(int timeout)方法表示判断指定的时间内IP地址是否可以到达,常用于测试网络是否通畅。
2、InetAddress类的getHostName()方法是用来获取IP地址的主机名,而为什么有的时候获取到的不是主机名而是域名?案例10-2UDP网络程序一、案例描述1、考核知识点编号:名称:DatagramPacket类和DatagramSocket类2、练习目标➢掌握DatagramPacket类和DatagramSocket类的作用➢掌握如何使用DatagramPacket类和DatagramSocket类通过编写简单的UDP程序。
3、需求分析DatagramPacket用于封装UDP通信中发送或者接收的数据,DatagramSocket类用于发送和接收DatagramPacket数据包。
为了让初学者掌握这两个类的作用,本案例将通过DatagramPacket 类和DatagramSocket类实现简单的数据通信,并通过观察两个命令行窗口中数据输出的先后顺序,从而掌握UDP网络程序中接收端和发送端的执行原理。
4、设计思路(实现原理)1)编写数据接收类ReceiveDemo,在ReceiveDemo类中创建接收端的Socket服务对象,并依次编写创建数据包、调用接收方法、解析数据包并向命令行输出内容,释放资源等操作。
2)编写数据发送类SendDemo,在SendDemo类中创建发送端的Socket服务对象,并依次编写创建数据包,打包数据、发送数据、释放资源等操作。
3)依次执行ReceiveDemo和SendDemo类,观察命令行输出变化。
二、案例实现UDP网络程序中接受数据端,代码如下:import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;public class ReceiveDemo {public static void main(String[] args) throws IOException {// 创建接收端Socket服务对象DatagramSocket ds = new DatagramSocket(12306);// 创建数据包(接收容器)byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);System.out.println("接受数据服务已打开,等待接受数据");// 调用接收方法ds.receive(dp);// 解析数据包,把数据显示在控制台InetAddress address = dp.getAddress();String ip = address.getHostAddress();byte[] bys2 = dp.getData();int length = dp.getLength();String s = new String(bys2, 0, length);System.out.println(ip + "***" + s);System.out.println("接受数据完毕,接受数据服务关闭");// 释放资源ds.close();}}UDP网络程序中发送数据端,代码如下:import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;public class SendDemo {public static void main(String[] args) throws IOException {// 创建发送端Socket服务对象DatagramSocket ds = new DatagramSocket();// 创建数据,并把数据打包String str = "hello,udp,我来了";byte[] bys = str.getBytes();int length = bys.length;InetAddress address = InetAddress.getByName("127.0.0.1");int port = 12306;DatagramPacket dp = new DatagramPacket(bys, length, address, port);System.out.println("发送数据服务已打开");System.out.println("发送数据是:"+str);// 发送数据ds.send(dp);System.out.println("发送完毕,关闭服务");// 释放资源ds.close();}}运行接受端程序,运行结果如图10-2所示。
图10-2运行结果运行发送端程序,运行结果如图10-3所示。
图10-3运行结果观察接受端控制台的输出,运行结果如图10-4所示。
图10-4运行结果从图10-2中可以看出,当运行ReceiveDemo类时,程序会在receive()方法处停顿,并一直处于停滞状态。
当运行SendDemo类时,ReceiveDemo类中的receive()方法接受到了数据,并向下执行直到程序结束。
三、案例总结1、在创建发送端的DatagramSocket对象时,可以不指定端口号,而案例中指定端口号目的就是,为了每次运行时接收端的getPort()方法返回值都是一致的,否则发送端的端口号由系统自动分配,接收端的getPort()方法的返回值每次都不同。
2、运行例程ReceiveDemo,有时会出现如图10-5所示的异常。
图10-5运行结果出现图中所示的情况,是因为在一台计算机中,一个端口号上只能运行一个程序,而我们编写的UDP 程序所使用的端口号已经被其它的程序占用。
遇到这种情况,可以在命令行窗口输入"netstat -anb"命令来查看当前计算机端口占用情况,具体如图10-6所示。
图10-6端口占用情况案例10-3多线程的UDP网络程序一、案例描述1、考核知识点编号:00110007名称:UDP案例2、练习目标➢通过编写多线程的UDP网络程序,掌握如何在单个窗口中实现接收与发送数据。
3、需求分析在上一个案例中,通过两个命令行窗口输出数据让我们初步了解了单线程的UDP网络程序,为了让初学者更加直观和深入的掌握网络编程,本案例将整合多线程技术,在同一个命令行窗口中同时实现接收和发送数据的功能。
4、设计思路(实现原理)1)编写数据接收类ReceiveThread,该类实现了Runnable接口,重写run()方法实现不断接受客户端发送数据的功能。
2)编写数据发送类SendThread,该类同样实现了SendThread接口,重写run()方法实现通过键盘录入数据,将数据向接收端发送的功能。
3)编写测试类Example02,在main()方法中,同时启动接收端和发送端程序。
二、案例实现UDP网络程序中接受数据端,代码如下:import java.io.IOException;import .DatagramPacket;import .DatagramSocket;public class ReceiveThread implements Runnable {public void run() {try {// 创建接收端Socket对象DatagramSocket ds = new DatagramSocket(10086);// 创建数据包while (true) {byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);//接收数据ds.receive(dp);// 解析数据String ip = dp.getAddress().getHostAddress();String s = new String(dp.getData(), 0, dp.getLength());System.out.println("接收端:从" + ip + " 主机接收到的数据是: " + s);if ("bye".equals(s)) {System.out.println("******聊天室关闭******");ds.close();break;}}} catch (IOException e) {e.printStackTrace();}}}UDP网络程序中发送数据端,代码如下:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;public class SendThread implements Runnable {public void run() {try {// 创建发送端Socket对象DatagramSocket ds = new DatagramSocket();// 封装键盘录入BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 创建数据,并打包String line = null;while ((line = br.readLine()) != null) {byte[] bys = line.getBytes();DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("172.16.26.21"), 10086);ds.send(dp);if ("bye".equals(line)) {// 释放资源br.close();ds.close();break;}}// 释放资源br.close();ds.close();} catch (IOException e) {e.printStackTrace();}}}编写测试类Example02,代码如下:public class Example02 {public static void main(String[] args) {SendThread st = new SendThread();ReceiveThread rt = new ReceiveThread();Thread t1 = new Thread(st);Thread t2 = new Thread(rt);t1.start();t2.start();}}运行Example02,依次键入“hello itcast”和“bye”后,结果如图10-7所示。