第10章 网络编程_补充案例
网络编程实用教程第二版_第10章

10.2 简单邮件传送协议SMTP
(4)客户端和服务器分别向对方发送数据。 (5)客户端或服务器分别读取自己缓冲区中的数据。 (6)以上两步是SMTP会话的主要部分,要按照SMTP协议
的规定,按照一定顺序,客户向服务器发送命令,服务器向
客户发送应答,以上两步要多次重复。
(7)会话完毕,关闭客户端和服务器之间的连接。
10.2 简单邮件传送协议SMTP
10.2.6 使用Winsock来实现电子邮件客户与服务器的会话 (1)启动SMTP服务器,在指定的传输层端口监听客户端的 连接请求,为SMTP服务器保留的端口是25。 (2)客户端设臵 Winsock 连接的IP地址或域名,指定端口号, 主动发出连接请求 ,连接到 SMTP 服务器。 比如,网易的 SMTP服务器的域名是,监听端口是25。 (3)服务器接收客户端的连接请求,并发回响应。客户端应 收到类似220 BigFox ESMTP service ready这样的信息, 这就 说明客户端已经与服务器建立 TCP/IP连接,成功地实现了第 一步。
客户与SMTP服务器这两个相互通信的进程之间应如何交换信 息。即规定了SMTP的会话过程。用户直接使用的是用于编写
和发送的客户端软件,而通常的SMTP服务器运行在远程站点
上。客户/服务器之间的通信是通过TCP/IP协议进行的。
10.2 简单邮件传送协议SMTP
10.2.2 SMTP客户与SMTP服务器之间的会话 1.SMTP会话 如图所示,说明了SMTP客户与SMTP服务器之间的会话
第10章 MFC WinSock类的编程
10.1 电子邮件系统的工作原理 10.2 简单邮件传送协议SMTP 10.3 电子邮件信件结构详述 10.4 MIME编码解码与发送 10.5 POP3与接收电子邮件 10.6 接受电子邮件的程序实例 10.7 发送电子邮件的程序实例
自考Java程序设计一(第10章网络与数据库编程基础)

3
1、网络基础知识
Ø Ø Ø Ø
TCP(传输控制协议)是面向连接的、可靠的点对点的传输协议。 UDP(用户数据报协议)是无连接的不可可靠的传输协议。 IP是网络层协议,实现按IP地址的网络路由的功能。 IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中 间以小数点分隔。如:166.111.136.3, 166.111.52.80 主机名(hostname):网络地址的助记名,按照域名进行分级管理。如 服务类型(service):网络的各种服务。 如:web服务, ftp服务, smtp服务, Telnet 服务等
8
Java网络程序设计支持机制
Java网络应用系统
支持URL的类 支持Socket通信的类
•利用URL访问网络资源 •利用Socket通信
网 络
Java网络程序设计支持机制
• Ø Ø
支持网络通信的类在包中。 URL, URLConnection, Socket, ServerSocket ,使用TCP实现网络通信。 DatagramPacket, DatagramSocket, MulticastSocket 支持 UDP 通信方式。
Ø
网络进程:就是网点机(连入网络的计算机)上运行的程序。 网络进程在通信协议中用端口(port)标识,而它驻留的网点机则用其IP地址或域 名来标识。
Ø Ø
通信协议指网络进程之间的通信必须遵循预定的规则。 TCP/IP是一组在Internet网络上的不同计算机之间进行通信的协议的总称,它由 应用层的HTTP、FTP、SMTP和传输层的TCP及网络层的IP等一系列协议组成。
第10章
网络与数据库编程
本章重点
Ø支持JAVA程序访问网上资源的类及其方法 Ø网络编程应用 Ø支持Java程序与数据库连接的类及其方法 Ø支持Java程序的数据表查询、数据记录修改 和插入的类及其方法 46389) 欢迎❤加入...欢迎❤交流...止不住的惊喜等 着你.........
C语言网络编程基础及其应用实例

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;}```接下来,我们创建客户端程序。
第10章 网络编程基础-Linux系统应用及编程-耿朝阳-清华大学出版社

UDP(User Datagram Protocol)用户数据报协议, 同TCP协议一样建立在IP协议的基础上的传输层 协议。与TCP协议不同的是,UDP不能确保数据 的成功发送和接收顺序,提供的是一种不可靠 的传送服务。
HTTP(HYperText Transfer Protocol)超文本传输协 议是现在互联网上最为广泛使用的网络协议, 提供一种发布和接受HTML页面的方法。
指定socket类型 指协议,常用的协议有IPPROTO_TCP、IPPROTO_UDP、 IPPROTO_SCTP、IPPROTO_TIPC等
(2) bind函数:给套接口设定地址
函数声明: int bind(int sockfd, struct sockaddr *addr,int addrlen);
(1) socket函数:创建套接字描述符
函数声明: int socket(int domain,int type,int protocol)
参数含义:
参数
domain type
protocal
含义
协议域,又称为协议族(family)。协议族决定了socket 的地址类型,在通信中必须采用对应的地址
第章 网络编程基础
本章主要内容: 了解计算机网络基本知识。 掌握socket的概念与通信流程。 掌握不同传输协议下的编程方法。
10.1 计算机网络概述
因特网作为最大的计算机网络,接入数十亿的 用户,几乎已经成为互联网的代名词。
因特网起源于美国军方的计划ARPANET,开始 仅仅只有四个节点,分别是洛杉矶的加利福尼亚州 大学洛杉矶分校、加州大学圣巴巴拉分校、斯坦福 大学、犹他州大学四所大学的大型计算机。
函数声明: int listen(int sockfd,int backlog);
网络编程案例

是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵。
一起来:诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦:1)系统启动服务器执行。
服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求。
2)在网络的某台机器上,用户执行客户机程序3)客户机进行与服务器进程建立一条连接4)连接建立后,客户机通过网路向服务器发出请求,请求某种服务。
5)服务器接收到客户机的请求后,根据客户机请求的内容进行相应的处理,然后将处理结果返回。
6)服务器断开与客户机的连接,继续睡眠,等待其他客户机的请求。
现在介绍一个实例功能:实现简单的服务器-客户机编程,客户机发送连接请求后接受到连接成功信息。
代码包括两部分,服务器部分(service.c)和客户机部分(client.c)1/*service.c*/2 #include <stdio.h>3 #include <stdlib.h>4 #include <errno.h>5 #include <string.h>6 #include <sys/types.h>7 #include <netinet/in.h>8 #include <sys/socket.h>9 #include <sys/wait.h>10#define MYPORT 3490 /*开放的端口号*/11#define BACKLOG 5 /*指定套接字可以接受的最大未接受客户机请求的数目*/12 main()13 {14int sockfd,new_fd;15struct sockaddr_in srvaddr;16struct sockaddr_in cliaddr;17int sin_size;18/*创建套接字描述符*/19if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)20 {21 perror("socket error");22 exit(1);23 }24 bzero(&srvaddr,sizeof(srvaddr));25/*用自己的ip地址和端口信息填充一个internet套接字地址结构*/26 srvaddr.sin_family=AF_INET;27 srvaddr.sin_port=htons(MYPORT);28/*函数bind将服务器的地址和套接字帮定在一起*/29if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1)30 {31 perror("bind error");32 exit(1);33 }34/*listen函数告诉内核,这个套接字可以接受来自客户机的请求*/ 35if(listen(sockfd,BACKLOG)==-1)36 {37 perror("listen error");38 exit(1);39 }40/*处理客户机的请求,调用函数accept来获得一个客户机的连接*/ 41for(;;)42 {43 sin_size=sizeof(struct sockaddr_in);44if((new_fd=accept(sockfd,(struct sockaddr*)&cliaddr,&sin_size))==-1)45 {46 perror("accept error");47continue;48 }49 printf("server: got connection from %s\n",inet_ntoa(cliaddr.sin_addr));50/*向客户起写数据*/51if(write(new_fd,"Hello,Network!\n",14)==-1)52 perror("write error!");53 close(new_fd);54 }55 close(sockfd);56 }下面为client:1/*client.c*/2 #include <stdio.h>3 #include <stdlib.h>4 #include <errno.h>5 #include <string.h>6 #include <netdb.h>7 #include <sys/types.h>8 #include <netinet/in.h>9 #include <sys/socket.h>10#define PORT 349011#define MAXDATASIZE 500012int main(int argc,char **argv)13 {14int sockfd,nbytes;15char buf[1024];16struct hostent *he;17struct sockaddr_in srvaddr;18if(argc!=2)19 {20 perror("Usage:client hostname\n");21 exit(1);22 }23/*函数gethostbyname获得指定域名地址所对应的ip地址*/24if((he=gethostbyname(argv[1]))==NULL)25 {26 perror("gethostbyname");27 exit(1);28 }29/*创建套接字,返回套接字描述符*/30if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)31 {32 perror("create socket error");33 exit(1);34 }35 bzero(&srvaddr,sizeof(srvaddr));36/*用获得的远程服务器进程的ip地址和端口号来填充一个internet套接字地址结构*/37 srvaddr.sin_family=AF_INET;38 srvaddr.sin_port=htons(PORT);39 srvaddr.sin_addr=*((struct in_addr *)he->h_addr);40/*用connect于这个远程服务器建立一个internet连接*/41if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-1)42 {43 perror("connect error");44 exit(1);45 }46/*调用read函数读取服务器write过来的信息*/47if((nbytes=read(sockfd,buf,MAXDATASIZE))==-1)48 {49 perror("read error");50 exit(1);51 }52 buf[nbytes]='\0';53 printf("read: %s",buf);54 close(sockfd);55 }下面我们来编译执行看看效果哦编译:#gcc -o service service.c#gcc -o client client.c修改执行权限#chmod 770 service#chmod 770 client执行现执行服务器端哦#./service另开一个命令行窗口,连接服务器的3490端口#./client localhost呵呵,看到效果了吧服务器端:: got connection from 127.0.0.1客户端Hello,Network!。
《网络编程》课件

案例二:社交网络平台的架构与实现
总结词
社交网络平台的架构与实现需要关注可扩展性、可用性和可靠性等方面。
详细描述
社交网络平台需要支持数百万甚至数十亿的用户,因此其架构必须具备高度的可扩展性,能够随着用户数量的增 长而平滑地扩展。同时,为了提供不间断的服务,需要保证系统的可用性和可靠性,采取各种容错和备份措施。 此外,还需要考虑数据的安全性和隐私保护问题。
HTTP协议
01
HTTP协议是用于从服务器请求和发 送网页内容的协议。
02
HTTP协议是无状态的,这意味着服 务器不会为每个请求保持状态。
03
HTTP协议是请求/响应模型,客户端 发送请求,服务器返回响应。
HTML/CSS/JavaScript
HTML是用于创建网页结构的标记 语言。
CSS是用于描述网页样式和布局 的语言。
THANKS FOR
感谢您的观看
WATCHING
网络编程的历史与发展
起源
1
网络编程起源于20世纪60年代,随着ARPANET等 早期网络的兴起,人们开始研究如何实现不同计
算机之间的通信。
发展历程
2
随着互联网的普及和发展,网络编程语言和技术 不断涌现和发展,如Socket编程、HTTP协议等。
未来趋势
3
随着云计算、物联网等技术的兴起,网络编程将 更加注重安全性、隐私保护和异构网络的互联互
案例四:网络安全攻防实践
总结词
网络安全攻防实践涉及网络攻击和防御的策 略和技术,是保障网络安全的重要手段。
详细描述
网络安全攻防实践包括对各种网络攻击手段 的深入了解,如黑客攻击、病毒传播、拒绝 服务攻击等,同时也需要掌握相应的防御策 略和技术,如防火墙配置、入侵检测系统部 署、数据加密等。此外,还需要关注安全漏 洞的发现和修补,以及应急响应和灾难恢复 等方面的实践经验。
编程语言中的网络编程实例

编程语言中的网络编程实例在当今数字化时代,网络编程已经成为了计算机科学中不可或缺的一部分。
无论是网页浏览、社交媒体、在线游戏还是云计算,网络编程都扮演着重要的角色。
本文将介绍一些编程语言中的网络编程实例,展示它们在实际应用中的重要性和用途。
1. Python中的网络编程实例Python是一种简单易学、功能强大的编程语言,它在网络编程领域有着广泛的应用。
Python的"socket"库提供了一种方便的方式来实现网络编程。
通过使用socket库,开发人员可以轻松地创建TCP/IP服务器和客户端,实现网络通信。
一个典型的Python网络编程实例是创建一个简单的聊天程序。
通过使用socket 库,我们可以创建一个服务器和多个客户端,使它们能够实时通信。
服务器监听来自客户端的连接请求,并将接收到的消息广播给所有连接的客户端。
这个简单的聊天程序可以帮助我们理解网络编程的基本概念和原理。
2. Java中的网络编程实例Java是一种广泛应用于企业级应用开发的编程语言,它也有着强大的网络编程能力。
Java的""包提供了一系列类和接口,用于实现网络编程。
通过使用这些类和接口,开发人员可以创建TCP/IP服务器和客户端,进行网络通信。
一个常见的Java网络编程实例是创建一个简单的文件传输程序。
通过使用Socket类和ServerSocket类,我们可以实现一个服务器,允许客户端上传和下载文件。
服务器接收来自客户端的文件请求,并将文件传输给客户端。
这个实例展示了Java在网络编程中的强大功能,同时也帮助我们了解如何处理文件传输和网络通信。
3. C++中的网络编程实例C++是一种高效的编程语言,也被广泛用于网络编程。
C++的"socket"库提供了一组函数和数据结构,用于实现网络编程。
通过使用这些函数和数据结构,开发人员可以创建TCP/IP服务器和客户端,实现网络通信。
第10章 网络编程PPT课件

10.1.7 客户/服务器模式
网络通信实质上是一对套接字之间的通信,其中一个套接字 运行在客户端,而另一个套接字运行在服务器端,这种模 式称为客户/服务器模式,简称C/S模式。大部分网络应用 程序都采用这种模式,服务器为客户提供一些特定的服务 ,这种服务主要分为循环型和并发型等2类。
10.2 网络编程相关函数
10.1.4 开放互连参考模型
国际标准组织(ISO)制定了OSI七层参考模型,即开放互 连参考模型,英文全称是Open System Interconnection, 这个模型按照功能的不同将网络通信分为7层,如图所示 。
10.1.5 TCP/IP模型
TCP/IP协议是一个4层协议体系结构,如图所示。
int send( SOCKET s, const char FAR * buf, int len, int flags
);
10.2.4 套接字监听
对于TCP服务器端在套接字绑定成功后,需要将该套接字上 设置为监听模式,等候客户端连接的到来。可以通过调用 函数listen来将套接字设置为监听模式,该函数的原型如 下:
int listen( SOCKET s, int backlog
);
10.2.5 建立连接
对于TCP客户端在套接字创建成功之后,为了与服务器端进 行通信,需要连接服务器端。可以通过调用函数connect 来与服务器端建立连接,该函数的原型如下:
int tup( WORD wVersionRequested, LPWSADATA lpWSAData );
10.2.2 创建套接字
套接字库加载成功后,就可以创建套接字了。可以通过调用 函数socket或者WSASocket来创建套接字,这两个函数分 别属于不同版本套接字库,分别是Winsock 1和Winsock 2 。一般属于Winsock 2的函数前缀为WSA。socket是属于 Winsock 1的API函数,该函数的原型如下:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十章补充案例案例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所示。
图10-1运行结果三、案例总结1、InetAddress类用于封装一个IP地址,并提供了一系列与IP地址相关的方法,其中,getByName(String host)方法表示获取指定主机的IP地址,常用于获取远程计算机的IP信息,isReachable(int timeout)方法表示判断指定的时间内IP地址是否可以到达,常用于测试网络是否通畅。
2、InetAddress类的getHostName()方法是用来获取IP地址的主机名,而为什么有的时候获取到的不是主机名而是域名?案例10-2UDP网络程序一、案例描述1、考核知识点编号:00110006名称: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所示。