socket通信范文
时间:2023-03-30 03:41:55
导语:如何才能写好一篇socket通信,这就需要搜集整理更多的资料和文献,欢迎阅读由公务员之家整理的十篇范文,供你借鉴。
篇1
计算机网络时代的到来推动了很多产业的发展升级,将计算机网络技术应用到各行各业中是当前的发展潮流。计算机的网络具有灵活性、开放性,网络本身不受企业或厂商的控制,所以在许多行业都能够发挥其价值。网络编程是应用网络发挥其价值的一个重要方式,而掌握SOCKET网络编程技术能够实现网络通信的效能。本文就BSD Unix网络版在套接字接口之上的网络通信过程展开了分析讨论。
一、TCP/IP协议在分层以及应用程序编程接口
基于TCP/IP的网络能够为应用程序供应两个常规编程接口,分别为套接字接口和传输层接口,套接字接口便是本文所重点讨论的SOCKET,SOCKET是在BSD Unix系统的基础上开发并普及开的,传输层接口(TLI)是AT&T公司开发出的,SOCKET API具有普遍的通用性,能够基于多种传输协议运行,当前已经发展成了网络编程的既定事实标准,所以本文就通用性只讨论套接字接口编程。
二、TCP/IP提供的服务以及编程模式
套接字实际上是IP地址在附上端口编号后,IP地址的标识网络中单一主机,端口编号的标识能够在主机之上展开工作的一个进程,能够系统化展开网间通信则需要建立在两个进程中,达成这一条件还需要共用相同的高层协议。
OSI术语里把网络层下面的各分层视为通信子网,为实现网间的进程通信,在此基A上还要做到控制差错、控制流量、管理各项连接、排序组合数据等功能,这就需要准备两种服务方式,分别为无连接的服务和面向连接(虚电路)。
TCP/IP网络应用中,进行通信工作的两个进程之间会互相产生作用和联系,为用户供应所需求的服务,然后将数据回复到客户的结果。
三、BSD Unix套接字接口网间进程的通信过程
SOCKET在TCP/IP基础上所能够提供的套接字类型主要有一下三种:
3.1流式套接字(SOCK STREAM)
流式套接字所提供的服务在连接上的应用比较多,能够为用户提供准确可靠的数据传输服务,并且保证了数据避免出错,同时还也能够避免多次重复发送,数据在传输过程中仍保持着队列顺序,对于数据还有准确的流量控制,防止了数据流超出限制值的出现。
3.2数据报式套接字(SOCK DGRAM)
数据报式套接字能够为用户提供无连接服务,独立的服务包传送出,对于错误没有保证,数据在传输的过程中可能会丢失或出现重复发送的现象,另一端接受到的数据也是杂乱无序的,数据长度有限制:最大为64KB,网络文件系统中(NFS)使用的便是数据报式套接字。
3.3原始式套接字(SOCK RAW)
原始式套接字的接口要求能够实现对底层协议间的信息传输,比如IP、ICMP的直接访问,这种访问常常用在对新的协议实现情况以及访问服务配置中的新设备的检验工作中,通常是不会为普通用户提供的,所以本文并未展开深入研究。
四、总结
本文针对以SOCKET在编程上的应用展开的了分析讨论,并对其在网络通信功能的应用进行了研究。网络编程是应用网络发挥其价值的一个重要方式,而掌握SOCKET网络编程技术能够实现网络通信的效能。本文就BSD Unix网络版在套接字接口之上的网络通信过程展开的研究仍不全面,需要更多的计算机网络技术人员投入,深入的研究并将其应用于网络通信领域。
参 考 文 献
[1]欧军,吴清秀,裴云,张洪. 基于socket的网络通信技术研究[J]. 网络安全技术与应用,2011,07:19-21.
[2]王远洋,周渊平,郭焕丽. Linux下基于socket多线程并发通信的实现[J]. 微计算机信息,2009,15:70-72.
[3]王志伟,沈杰峰,郭启峰,唐俊. 基于Socket的GPRS远程数据采集方法[J]. 西华大学学报(自然科学版),2006,01:37-39+93+3.
篇2
关键词:套接字;嵌入式Linux;网络通信;TCP/IP协议
中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2017)30-0274-02
一、引言
随着数字信息技术和网络技术的高速发展,嵌入式技术已经广泛应用到各个领域、各类产业以及人们的日常生活等各方面,成为引人瞩目的热点。为适应嵌入式和网络应用需求,标准的一种或多种网络通信接口成为嵌入式系统的必备需求,需要TCP/IP协议支持。而socket是TCP/IP网络最为通用的API,计算机可以通过这个端口与任何具有socket接口的设备通信。
二、socket简介
TCP/IP是一组支持网络通信的协议系统,其协议参考模型分4层:网络接口层、互联网层、传输层和应用层。网络通信中一个非常重要的概念就是套接字(socket),它是介于网络应用层和传输层之间的编程接口,在Linux网络层次模型中的位置如图1所示。套结字利用IP地址与端口号与Internet中的网络进程一一对应,进而实现网络通信。最常使用的socket有两种:(1)数据流式socket(SOCK-STREAM),使用TCP协议,提供面向连接的可靠通信流;(2)数据报式socket(SOCK-DGRAM),使用UDP协议,提供无连接的服务,并且不保证可靠、无差错。本文所使用的是流式套接字。
三、socket通信的设计与实现
1.socket通信过程。网络程序具备Client/Server结构。下面分TCP Client端及TCP Server端为说明TCP网络程序的流程,如图2所示。
Server端启动后,先调用socket()函数建立socket,其次通过bind()函数绑定socket和本地IP地址,然后调用listen()函数做好侦听准备,再调用accept()函数进行接收。Client端建立socket后,通过connect()函数和Server端建立连接。之后即可调用send()和recv()来实现发送和接收。关闭socket通过调用close()来实现。
2.socket通信的实现。本实验PC机上安装的是Redhat 9.0版本的Linux操作系统,嵌入式实验平台采用三星S3C2410微处理器,嵌入式操作系统内核版本为2.4.18。分别编写服务器端应用程序server.c和客户端应用程序client.c,实现网络通信,程序流程图如图3、图4所示。
四、结果分析
设置PC机和目标平台的IP地址分别为:192.168.1.20和192.168.1.22。PC机Linux终端和目标平台分别运行Server和client程序,通过超级终端观察到运行结果如图5所示,可见PC机与目标平台成功建立连接,实现通信,达到了预期目标。
五、结语
研究socket通信对开发具有网络功能的嵌入式产品有着非常重要的作用。本文的实现对于嵌入式产品的网络应用是一个很好的探索,对于同类系统的设计具有实际的参考和推广价值。嵌入式系统与网络的结合,必然使其具有更加广阔的应用空间。
参考文献:
[1]刘峥嵘.嵌入式Linux应用开发详解[M].北京:机械工业出版社,2004:394-433.
篇3
(吉林大学物理学院,吉林长春130012)
摘要:为了适应在复杂实验条件下对多个电源单元的管理控制,设计基于Socket网络通信的多电源单元管理系统。为了对多电源单元的高效管理,Socket网络通信采用的是异步通信连接,同步通信的通信模式,同时存储电源数据(电压、电流)到excel文件,方便查阅与记录。实验证明这种方式比单独异步或者单独同步通信方式都高效、准确。
关键字:C#;Socket;异步通信;同步通信;数据保存
中图分类号:TN86?34 文献标识码:A 文章编号:1004?373X(2015)20?0137?03
收稿日期:2015?05?12
Multi?power management system based on Socket communicationXI Yongguang,FU Chengwei
(School of Physics,Jilin University,Changchun 130012,China)
Abstract:To suit the management and control of multi?power units under the complex experiment condition,a multi?powerunit management system based on the Socket network communication was designed. For the efficient management foe multi?powerunit,the asynchronous communication connection and synchronous communication are adopted in Socket network communica?tion,and the power data(voltage,current)are stored in Excel file. It is convenient to check and record. The experimental re?sults show that this method is more efficient and accurate than only asynchronous communication mode or synchronous communi?cation mode.
Keywords:C #;Socket;asynchronous communication;synchronous communication;data preservation
为了适应在复杂实验条件下对多个电源单元的有效管理,运用C#语言编写了基于Socket 网络通信的多电源管理系统,并且能把每台电源单元的数据保存到Excel 表格中,方便查阅与记录。Socket 通信的同步通信方式是在客户端在发送请求之后必须等到服务器回应之后才可以发送下一条请求,是阻塞通信方式。这样的方式对于电源单元的管理比较准确。但对于多个电源单元同时管理时,就会出现连接长时间通信不上的问题。而异步连接就能很好的解决多个单元的连接问题,但是异步通信的缺点是对多电源单元管理时会出现数据错乱的问题。本系统使用面向对象C#编程,采用了Socket 异步连接电源,同步通信收/发数据方式进行设计,很好地满足了多电源管理系统的要求。
1 系统设计
1.1 Socket通信原理
1.1.1 服务器端的步骤
(1)在实用Socket之前,要首先初始化Socket,就是实用Socket初始化函数;
(2) 在初始化完成以后,就可以建立服务端的Socket,然后实用该Sokcet开始侦听整个网络中的连接请求;
(3)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端的连接;
(4)在通信的过程中,服务器端产生的Socket会通过一个消息响应函数OnReceive来接收到达的数据,数据的发送可以使用Send()来完成;
(5)当完成通信后,服务器关闭与客户端的Socket连接。
1.1.2 客户端的步骤
(1)同样的,初始化Socket,并建立客户端的Socket,确定要连接的服务器的主机名和端口;
(2)发送连接请求到服务器,并等待服务器的回馈信息;
(3)连接成功后,与服务器进行数据的交互;
(4) 数据的读取同服务端一样,也是通过OnRe?ceive函数来完成的,数据的发送通过Send函数即可;
(5)数据处理完毕后,关闭自身的Socket连接。
1.2 Socket异步通信与同步通信
(1)异步通信方式
程序执行到发送、接收和监听语句的时候,不论工作是否完成,都会继续往下执行。并且在服务端不存时,仍然能继续进行后继工作的。
(2)同步通信方式
Socket 通信用TCP 协议进行编程时程序执行到发送、接收和监听语句时,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句。并且服务端不存、从而在抛出异常之前,是无法继续进行后继工作的。
1.3 主要设计思路
1.3.1 采用同步通信方式
同步通信方式如图1所示。
1.3.2 采用异步通信方式
异步通信方式如图2所示。
1.3.3 采用异步连接,同步通信的方式
电源管理系统界面,根据每个电源的IP 地址,端口,通过网口进行异步通信的连接,然后在界面上输入需要的电源电压电流数据,通过同步通信方式进行收/发数据,进而完成对电源的控制。管理界面还能保存电源的电压电流变化的数据,方便以后查验。
(1)Socket异步连接电源部分程序
2 实际测试
2.1 采用同步通信方式
测试过程中出现,在一个电源单元数据通信完成后,才能和下一个电源单元进行通信的情况。这样的管理系统只能每次处理一个电源单体,不能实现对多电源管理的问题。
2.2 采用异步通信方式
在实验测试过程中,能够同时和多个电源单元进行通信,但是在通信过程中出现数据错乱和数据发送延迟的问题。
2.3 采用异步连接,同步通信的方式
实验测试,对电源单元和多电源单元进行多批次长时间的测试,系统是高效、准确的,数据保存也是实时准确的,如图4所示。
3 结语
多电源单体管理系统能对多台电源进行高效准确地管理,优点有:
(1)在复杂的实验条件下,能实时高效准确地管理多个电源单元,能极大地简化实验过程,让实验更加高效精确。
(2)能在远距离条件下,方便实验人员操作复杂的电路实验。
(3) 能实时精确地保存数据,方便数据的记录和计算。
参考文献
[1] 周晟,金瓯,贺建飚,等.基于Socket的异构形平台的网络通信研究[J].计算机与数字工程,2006(5):4?8.
[2] STEVENS W R.TCP?IP 详解卷一:协议[M].北京:机械工业出版社,2000.
[3] 张文,赵子铭.P2P网络技术原理与C++开发案例[M].北京:人民邮电出版社,2008.
[4] 马骏.C#程序设计及应用教程[M].北京:人民邮电出版社,2009.
[5] JONES A,OHLUND J.Windows网络编程[M].北京:清华大学出版社,2002.
[6] 任柯.ZigBee多媒体教室电源管理系统设计与实现[J].西南民族大学学报:自然科学版,2012(4):669?673.
[7] 赵勇,黄东,张天开,等.基于μIP和Socket的远程机房电源控制系统设计[J].电子设计工程,2015(4):40?43.
篇4
关键词:嵌入式;Socket;串口通信;网络通信
本文的背景是研究通过对摄像头的远程控制从而对运动图像加以采集和处理。该系统的音视频编解码部分,是基于Windows系统用VC进行的开发,实现对图像视频的编解码处理,摄像头的远程控制系统主要是通过Linux系统设计。统通过串口和网络进行传输和控制。系统采用C/S模型,PC机作为client端,根据采集到的数据进行编解码后,发送出对摄像头的控制命令,通过网络传输到ARM9平台上,ARM平台作为server端在接收到client端发送的命令后,通过串口发送命令来控制摄像头。
1 串口通信
1.1 Linux下串口通信基本原理
Linux系统将设备和文件的操作都作为对文件的处理,所以对设备的操作,内核会返回一个文件描述符,需要将其作为参数传给相对应的函数。Linux中所有的设备文件都放在“/dev”目录下,通过“ttyS+编号”命名相应的串口资源,所以对应路径是“/devttyS*”。因而可以相对文件读写那样访问一个串口设备。
1.2 Linux下的串口设置
首先要对串口进行设置,在termios.h完成对波特率等的设置。
struct termios
{tcflag t c iflag;
tcflag t c oflag;
tcflag t c cflag;
tcflag t c lflag;
cc t c cc [NCCS];
};
open()函数:int fd = open ("/dev/ttyS *", O RDWR|O NOCTTY|O NDELA Y);
然后调用read()和write()函数读写端口,返回实际读写的字节数,如果有错误发生则返回-1。
读取串口结束后,首先恢复串口原始属性,然后才可以关闭串口并退出程序。
1.3 串口控制应用程序
下面给出本系统中一个通过串口控制摄像头的函数的一部分结构:
void sendMsg(int pan,int tilt)
{struct timeval timeout;
static char *driver = "/dev/ttyS1";
timeout.tv_sec = 0;
timeout.tv_usec = 0;
formCmd(buf,pan,tilt);
fd = uart_open(driver,B9600);
write(fd,buf,16);
close(fd);
}
2 网络通信
2.1 Socket基本原理介绍
Socket是一种通信机制,客户/服务器系统既可以在本地单机上运行,也可以在网络中运行。
首先需要了解socket中的一些重要函数:
1) 创建Socket:int socket( intdomain, inttype, intprotocol);
2) 配置Socket:bind函数指定本地信息int bind( intsocket, const structsockaddr* address, size_taddress_len);
3) 使用listen( )和accept( )函数获取远端信息:
Int listen(int socket, int backlog);
Int accept(int socket, struct sockaddr* address, size_t* address_len);
4) 通信处理:send( ),write( ),recv( ),read( )。
5) 通信结束:使用closesocket( )。
2.2 Windows和Linux下socket应用程序
客户端程序:创建一个未命名的套接字,然后把它连接到服务器套接字server_socket上,向服务器写一个字符,再读回经服务器处理后的一个字符。
服务器端程序:首先创建一个服务器套接字,绑定到一个名字,然后创建一个监听队列,接收来自客户程序的连接。
下面我们分别在Windows和Linux下进行socket编程,实现二者之间的通信,具体函数实现的主要部分如下:
Windows下作为client端:
{
SocketClient=socket(AF_INET,SOCK_STREAM,0);
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.10");
while(1)
send(SocketClient,sendBuffer,16,0);
closesocket(SocketClient);
WSACleanup();
}
Linux下作为server端:
{
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_addr.s_addr = inet_addr("192.168.1.10");
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
while(1)
read(client_sockfd, str,16);
close(client_sockfd);
}
3 结束语
本文设计了基于嵌入式平台上可移动摄像头远程控制,对串口通信和网络通信的原理和机制加以阐述,对串口驱动和网络驱动的编写提出了具体的方法,并且在实际的操作应用中给出了具体函数的编写。本文所提供的处理方法已在实际的项目中的得到应用,对于其他的通过串口通信和网络通信控制的设备,具有参考意义,今后我们还将展开进一步的相关研究。
参考文献:
[1] 刘智国,张海春.基于S3C2410的嵌入式串口通信设计[J].微计算机信息(嵌入式与SOC),2009,25(4-2).
篇5
关键词:网络控制器;通信协议;Rabbit2000单片机;套接字;串口通信
中图分类号:TN91 文献标识码:B
文章编号:1004373X(2008)0105403オ
Communication Technology of Jia-xiao-tong Network Controller
WEI Zi,YANG Qingjiang,ZHANG Guanglu
(Heilongjiang Institute of Science and Technology,Harbin,150027,China)
オ
Abstract:For the function demand of the network controller in Jia-xiao-tong system,the paper proposes a communication technology of combining serial-port with network.Firstly,it describes the network controller′s hardware platform and the application-layer protocol based on TCP/IP protocol stack.Then,it mainly discusses the communication network technology and the communication serial technology.The polling scheme is applied to improve data transfer effectiveness and reduce data collision.Finally,it explains and analyzes the communication technology′s feasibility and stability through filed test data.
Keywords:network controller;communication protocol;Rabbit2000 single chip;socket;serial communication
オ
1 引 言
随着TCP/IP等网络通信的出现,将串口通信与网络通信相结合的趋势越来越明显,这是保护使用者既往投资和整体利益的一种有效办法。本文所讨论的通信技术就是将串口与网络通信相结合并在实际应用中取得良好效果的一种通信解决方案。
“家校通”是利用现代信息技术实现家庭与学校实时沟通的教育网络平台,其组成部分为:家校互联卡、读卡器、无线网关、网络控制器、短信发射接收机。网络控制器的主要功能是通过无线网关从读卡器获取信息,并与互联网服务平台进行网络通信,是家校通系统的核心。
2 网络控制器的硬件平台
根据网络控制器的功能要求,考虑整体的性能、价格方面,CPU采用Rabbit2000单片机,他是Z-World公司特别为中小型控制器而设计的高性能8位微处理器。编译环境为Dynamic C,提供Socket级TCP/IP编程。网络控制器的硬件结构如图1所示。
3 应用层通信协议
3.1 网络控制器与读卡器的串口通信协议
网络控制器与读卡器的通信主要通过异步串行RS 485接口,基于通用串行通信RS 485数据传输单元(字节格式)有不带校验位的10 b和带奇偶校验位的11 b两种数据格式。为了提高数据传送的效率和可靠性,采用无奇偶校验位的10 b数据格式,并由BBC校验生成校验码与数据一起发送。
开始标志读卡器地址信息长度命令和参数校验
2 B1 B2 B14 B1 B
(3)命令字:
A1:从读卡器读取一条记录。
A2:控制器正确接收记录信息后,返回更新记录的读地址命令,使地址指针指向下一条记录。
A4:设置校正读卡器时间。
A6:测试控制器与读卡是否正常通信。
3.2 网络控制器与服务平台的网络通信协议
网络协议通常分不同的层次进行开发,每一层分别负责不同的通信功能。TCP/IP通常是一个4层协议,包括数据链路层、网络层(含IP协议)、传输层(含TCP协议)和应用层。本网络协议就是基于TCP/IP协议之上的应用层协议,采用请求应答的通信模式。考虑到协议的可靠性和实现的方便性,数据采用ASCII码表示。
(1)报文组成
4 通信技术
控制器建立socket连接后,向服务器发送连接请求和数据传输,并实时判断连接的有效性,在有效连接的状态下,实现控制器、服务器、读卡器三者的正常通讯,程序流程如图2所示。
4.1 网络通信技术的实现
socket初始化: 首先要对RTL8019AS的控制寄存器进行初始化配置,Dynamic C已将这部分配置封装成函数放入REALTEK.LIB库中,应用时只需调用相关函数。之后再调用函数库dcrtcp.lib中的几个简单函数可完成socket的初始化,以下是程序的主体框架。
#define TCPCONFIG1
#memmapxmem
#usedcrtcp.lib
main()
{
sock[CD#*2]init( );
while(ifpending(IF[CD#*2]DEFAULT)==IP[CD#*2]COMING[CD#*2]UP)
tcp[CD#*2]tick(NULL);
tcp[CD#*2]open(&socket,0,destIP,sockport,null);
…… ……
}
在建立TCP的连接中,Dynamic C有两种方法打开TCP socket:一种是被动的方式,调用函数tcp[CD#*2]listen(),等待客户端进行连接;一种是主动的方式,调用函数tcp[CD#*2]open(),根据相应的参数(IP地址和端口号)主动连接到服务器端。本通信技术采用的就是主动方式(作为客户端)。
Socket数据的发送与接收:数据发送调用sock[CD#*2]write(&socket,str[CD#*2]send,str[CD#*2]send[CD#*2]len)。在读取socket缓冲区数时,先判断缓冲区中是否有数据,有数据再进行读操用,同时有超时设置。
start[CD#*2]time=SEC[CD#*2]TIMER;
/*SEC[CD#*2]TIMER为秒级系统时间*/
end[CD#*2]time=start[CD#*2]time;
while((end[CD#*2]time
!recv[CD#*2]count)/*READ[CD#*2]TIME为设定的等待时间*/
{
str[CD#*2]recvbuf[CD#*2]len=sock[CD#*2]bytesready(&socket);
/*判断socket读缓冲区是否有数据*/
if(str[CD#*2]recvbuf[CD#*2]len>0)
recv[CD#*2]count=sock[CD#*2]read(&socket,str[CD#*2]recvbuf,
str[CD#*2]recvbuf[CD#*2]len); /*读socket*/
}
if(revc[CD#*2]count)
{…… ……}
/*拆分接收到的命令字,读取有效信息*/
else
break;
4.2 串口通信技术的实现
主要包含3个步骤:命令字的组合,设置串口D,通过设置Rabbit2000的PE3来控制数据的发送与接收。以A6命令为例,程序主体框架如下:
command[0]=0xA6;/*A6命令*/
create[CD#*2]command(addr,command,pack);
/*组合命令字*/
serDopen(9600);/*9600为波特率*/
send[CD#*2]command(command,returnlen);/*发送数据*/
read[CD#*2]command(readbuf,sizeof(readbuf),10);
/*接收数据*/
void send[CD#*2]command(char *pack,int len)
{
int i;
WrPortI(PEDR,& PEDRShadow,0x08);
WrPortI(PEB3R,NULL,0);
for(i=0;i
serDputc(pack[i]);
}
int read[CD#*2]command(char *buf,int len,int time)
{
int i[CD#*2]return;
WrPortI(PEB3R,NULL,1
i[CD#*2]return=serDread(buf,len,time);
return i[CD#*2]return;
}
5 数据采集与分析
网络控制器联网正常运行时,向服务器发送的一包测试记录数据为:
对数据包进行分析:0244为数据包的总长度,01为协议版本号,02为命令字,000003为序列号,21000102*****为设备号,09为数据包中的刷卡记录总数,0080D122为测试卡号,07070414152715为刷卡时间(顺序为年周月日时分秒),03为状态。
采集从服务器返回的命令:001501020000031,其中
列号,1为正确接收。返回命令格式符合协议要求,内容正确。
网络控制器向读卡器发送的命令(以A6为例): aa ff 01 00 03 a6 41 41 f1,其中aa ff表示本命令为控制器发给读卡器,01为读卡器地址,00 03为数据长度,a6为命令字,41 41为测试数据,f1为校验位。
采集从读卡器返回的命令:bb ff 01 00 02 41 41 47 d1 22 07 07 04 14 15 42 17 1 6b 00 00 00,其中bb ff表示本命令为读卡器发给控制器,01为读卡器地址,00 02为数据长度,41 41为测试数据,47为校验位,之后的为无效数据。
6 结 语
基于Rabbit2000实现串口与网络结合的通信技术可以实时、准确地对数据进行处理、发送与接收。由采集到的数据表明数据收发的正确性,证明了本通信技术的可行性与可靠性。本通信技术已在家校通系统中取得了良好的通信效果,并可应用于其他数据传输系统中,具有广泛的发展前景。
参 考 文 献
[1]Z-World Inc.Rabbit2000 Microprocessor Designer′s Hand-book,2003.
[2]Z-WorldInc.Dynamic C TCP/IP User′s Manual,2003.
[3]林丽,朱宏.基于Rabbit2000的网络通信技术[J].福建电脑,2005(4):45-46.
篇6
关键词 JAVA,网络,SOCKET,APPLET
网络上的系统结构多为客户/服务器模式,服务器端负责数据和图像等的存储、维护、管理以及传递,客户端则负责人机界面的操作、送出需求及显示收回的数据。
下面介绍一下如何使用JAVA来进行网络编程:
1) 由于客户端通过IE同服务器建立联系,所以客户端使用Applet,服务器端使用Application;
2) 服务器应设置成多线程,应答多个客户的请求;
3) 两端通信使用SOCKET机制。
1 Java中输入/输出流概念:
过滤流DataInputStream 和DataOutputStream 除了分别作为FilterInputStream 和FilterOutputStream的子类外,还分别实现了接口DataInput 和DataOutput。接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数,如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定义的方法主要是向流中写入基本类型的数据或者写入一定长度的字节数组,如writeChar()、writeDouble() DataInputStream可以从所连接的输入流中读取与机器无关的基本类型数据,用以实现一种独立于具体平台的输入方式;DataInputStream 可以向所连接的输出流写入基本类型的数据。
2 Socket 机制
Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。 Socket通常用来实现客户方和服务方的连接。客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。
Socket通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下,通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全在这一对进程之间进行,通信完毕关闭此联接过程。使用无联接方式时其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在不同的主机和进程之间转发进行。
3 Java语言
Java语言的优点主要表现在:简单、面向对象、多线程、分布性、体系结构中立、安全性等方面。
(1) 简单性
Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。 Java实现了自动的垃圾收集,简化了内存管理的工作。这使程序设计更加简便,同时减少了出错的可能。
(2) 面向对象
Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。
Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。
Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。
(3) 多线程
多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。
Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高的执行效率。
(4) 分布性
Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。
(5) 体系结构中立
Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。
为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。
java.lang: 一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包
java.util: 实用工具包。其中包括哈希表、堆栈、时间和日期等
java.io: 基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等
java.net: 网络包。该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口
java.awt: 抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等
java.applet: 支持applet程序设计的基本包
(6) 安全性
用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
4 JAVA工具
(1) JDK
1) Java编译器
Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为 .java,Java编译器把这种扩展名的文件编译成扩展名为.class的文件。源文件中的每个类在编译后都将产生一个class文件,这意味一个Java源代码文件可能编译生成多个class文件。
2) Java解释器
Java解释器对编译生成的字节码格式的可执行程序的运行提供支持,它是运行非图形Java程序的命令行工具。
3) Appletviewer
它是Java Applet的简单测试工具,可使用它来测试Java Applet程序,而不需要WWW浏览器的支持。
(2) Visual J++
Visual J++ 集成了可视化界面设计、交互式调试、代码编辑、联机帮助信息和介绍如何快速掌握该开发环境的实用向导等多项功能,同时具有能充分利用Active X和COM新技术的优势。利用Visual J++可创建交互性很强的Internet应用程序,是难得的Java 开发系统。
5 客户机/服务器通信的实现:
(1) Application 同 Applet 的通信
两端通过Socket机制进行连接:
1) 客户端的编程流程:
? 打开Socket,新建一个套接字;
? 为套接字建立一个输入和输出流;
? 根据服务器协议从套接字读入或向套接字写入;
? 清除套接字和输入/输出流;
2)服务器端的编程流程:
? 打开Server Socket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指定端口为客户端请求的Socket 服务;
? 使用ServerSocket类的accept()方法使服务器型套接字处于监听状态并把监听结果返回给普通套接字;
? 为该普通套接字创建输入和输出流;
? 从输入和输出流中读入或写入字节流,进行相应的处理,并将结果返回给客户端;
? 在客户端和服务器工作结束后关闭所有的对象,如服务器型的套接字,普通套接字,输入和输出流。
正是由于Java系统具有基于Socket的灵活通信机制,因而其应用程序能自由地打开和访问网络上的对象,就象在本地文件系统中一样。
(2) Applet之间的通信:
Applet之间的通信使用Applet Context类的getApplet()方法。
只要在程序中加入
Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name为first的Applet中的方法了。
在该课题中大量使用了该种通信方法,因为专门同服务器端通信的 Applet中包含接收信息方法和发送信息方法,所有客户端的Applet都要使用负责通信的Applet中的方法,所以客户端的Applet同负责通信的Applet必须进行通信。
6 程序
//服务器端程序S.java 负责与客户端通信
import java.io.*;
import java.net.*;
import java.lang.*;
import T2;
class ThreadEchoHandler extends Thread //创建线程
{
T2 theT2=new T2();
Socket incoming;
int counter;
ThreadEchoHandler(Socket i,int c)
{ incoming=i;
counter=c; }
public void run()
{
try
{
DataInputStream in=new DataInputStream(incoming.getInputStream());
DataOutputStream out=new DataOutputStream(incoming.getOutputStream());
System.out.println ("hello");
boolean done=false;
while(!done)
{ String aa="";
String str=in.readUTF(); //从客户端得到字符串
//在此加入各自的服务程序
System.out.println (str);
theT2.pass(str); //解码
theT2.tongji(); //修改监控库中的信息
aa=theT2.guan(); //操纵数据库
System.out.println ("string z is:"+aa);
if(aa.compareTo("null")!=0 )
//若是查询数据库,返回查询后的结果
{ //若不是查询数据库,不向客户端输出信息
out.writeUTF(aa);
out.flush(); }
}//while
incoming.close(); //线程关闭
}//try
catch(IOException e)
{System.out.println(e);}
}//end run
}
//----------------------------------------
class S
{
public static void main(String[] args)
{
int i=1;
try
{
ServerSocket s=new ServerSocket(1111);
for(;;)
{
Socket incoming=s.accept();
System.out.println("connect: "+i);
new ThreadEchoHandler(incoming,i).start();
i++;
}
}
catch(Exception e)
{ System.out.println(e); }
}
}
//客户端通信小应用程序 Echo.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.applet.*;
public class Echo extends Applet
{
TextArea ta;
Socket echoSocket;
DataOutputStream os;
DataInputStream is;
String Line;
public void init()
{
setBackground(Color.white);
ta=new TextArea(5,80);
ta.setEditable(false);
add(ta);
try
{echoSocket=new Socket("10.102.4.41",1111);} //与服务器建立连接
catch(IOException e)
{System.out.println("error");}
}
public void st(String stri) //发送字符串的方法
{
try
{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
os.writeUTF(""+ stri ); //向服务器输送string
os.flush();
}
catch(IOException e)
{System.out.println(" error:"+e); }
}
public String st1() //接收字符串的方法
{
String Line="";
try
{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
Line=is.readUTF(); //从服务器读来的信息
ta.appendText(""+Line); //在文本域中输出信息
}
catch(IOException e)
{System.out.println(" error:"+e); }
return Line;
}
}
7 程序调试心得:
1) 在建立Socket连接时,两端的端口号必须设为一致,否则建立不了连接。服务器端必须有主机IP地址或主机名参数。
2) 连接建立好之后应确定输入和输出流。起初程序中用的是DataInputStream和PrintStream,结果只能传输英文,传输中文时产生乱码,将PrintStream改为DataOutputStream,使用readUTF()和writeUTF()方法后,中文传输问题得到解决。
3) 如果一个使用某端口的程序没有关闭,另一个程序就不能使用这个端口。
4) 开始进行通信的程序均为 Application,因不符合客户机/服务器机制,应将客户端的Application改为Applet。其转化的主要步骤如下:
? 创建一个包含APPLET标签的HTML文件;
? 去掉应用程序中的main()方法;
? 类名应继承Applet类,而不是Frame类,并在程序开头加入
import java.applet.*;语句;
? 用init()方法代替Application程序中的构造方法,当浏览器创建Applet类对象的时候,它自动执行init()方法;
? 如Application中缺省使用了BorderLayout布局管理器,应在Applet的init()方法中重新设定;
? 如果Application中有setTitle()方法,必须将其去掉,如Application中使用了菜单,在Applet 中用按钮来替换。
5) 懂得了在一程序中如何引用自定义的类中的方法和变量,在程序开头加入import 类名;在程序中加入 类名 实例=new 类名(); 然后使用
实例.方法(),实例.变量即可。
参考文献
[1] 廖雷等,Java程序设计教程,中国电力出版社,2003
篇7
下面我将对LINUX平台下网络通信设计的工作流程、数据发送、数据接收三个模块进行详细的介绍。
1工作流程
首先调用SOCKET函数创建一个用于通信的套接字,然后给已经创建的套接字(SOCKET)绑定本地地址/端口号(Bind()),成功之后就在相应的SOCKET上监听(Listen())。当Accept()函数捕捉到一个连接服务(Connect())请求时,接受并生成一个新的SOCKET,并通过这个新的SOCKET与客户端连接,用Read()/Write()或相关函数读取和发送数据,传输完毕时,用Close()关闭所有进程,结束这次通信。客户端程序设计流程:客户端也先要创建一个SOCKET,将该SOCKET与本地地址/端口号绑定,还需要指定服务器端的地址与端口号,随后向服务器端发出连接(Connect())请求,请求被服务器端接受后,用函数进行了数据的接收与发送,传输完毕后,用Close()关闭套接口,通信结束。
2数据发送模块
从应用层到物理层发送数据时,函数调用顺序如下:send>sys—send>sys—sendto>sock—sendmsg>inet—sendmsg>tcp—sendmsg>tcp—send—skb>tcp_transmit>ip—queue—xmit>ip—queue—xmit2>ip—output>ip—finish—output>ip—finish—output2>neigh_resolve_output>dev_queue_xmit>ei—start_xmit网络连接创建好以后,就可以进行发送数据了。
3数据接收模块
当网络上的数据到达接收计算机时,网卡控制器产生中断,调用该中断的中断处理程序ei—interrupt()。在这个函数中主要通过判断中断状态寄存器(ISR)的内容,调用相应的处理程序来接收数据。如果中断状态寄存器显示接收到数据或者接收到有错误的数据时,就调用ei—receive()函数进行数据的接收。在ei—receive()函数中要正确设定边界指针寄存器(BNRY)和当前页寄存器(CPR)的内容,当BNRY或者CPR等于页停止寄存器(PSTOP)时,把它们的内容设置成页开始寄存器(PSTART).当CPR=BNRY时,表示缓冲区全部被存满,数据没有被用户读走,这时网卡将停止往内存写数据,新收到的数据包将被丢弃不要,而不覆盖旧的数据;当CPR=BNRY+1时,表示网卡的接收缓冲区里没有数据,用户通过这个判断知道没有包可以读,当CPR!=BNRY+1时,表示接收到新的数据包。
结束语
篇8
关键词:网络教学;远程控制;Socket技术;输入/输出
中图分类号:TP399
随着信息技术的发展,目前社会已经进入信息时代。在信息时代,信息量呈爆炸式增长,知识的更新速度越来越快,人才竞争越来越激烈,人们的教育也开始从“学校教育”朝“全民教育”、“终生教育”方向发展。目前网络已经成为了社会上最为有效的信息获取工具之一,网络教学的信息传递便捷、信息量大,因此网络远程教学已经成为了目前最为有效地终身教育和全民教育方式。在网络教学中,可以采用视频、音频、动画等丰富的多媒体教学手段来进行多媒体教学,但是由于教育者和受教育者受到空间的限制,导致网络教学的交互性较弱。而远程控制技术可以在一定程度上增强网络教学的交互性,因此在网络教学中广泛应用。
1 远程控制需求分析
处理器、存储器和输入/输出时在计算机模型中的主要组成部分,其中输入/输出模块式计算机系统与用户进行交互的主要方式。因此,为了提高网络教学的交互性,远程控制的基本需求就是能够通过教学端和学习端的输入/输出共享。而针对目前计算机系统以键盘、鼠标输入和屏幕图像输出的主流方式,远程控制需要实现如下的功能:(1)可以记录提取远端计算机的键盘、鼠标输入事件;(2)可以在本地计算机上响应远端的键盘、鼠标事件;(3)能够获取目标计算机的屏幕图像,并且在本地计算机上显示。
2 远程控制接口设计
通过对远程控制需求的分析,远程控制的实现需要如下的接口来实现远端计算机和本地计算机之间的信息通信。
3 基于Socket的远程控制通信
为了方便鼠标事件、键盘事件和屏幕截屏数据在因特网上的传输,在网络教学的远程控制中可以采用基于TCP/IP通信协议的Socket通信技术实现鼠标事件、键盘事件和屏幕截屏数据的传输。在远程控制技术中,师生端Socket的通信实现流程如下所示:
3.1 建立Socket服务端。在需要接受远程控制的学生端建立服务器套接字,准备接受教师端的鼠标、键盘事件,并且将截屏图像信息通过该套接字进行传输。在Java技术中,建立Socket服务器端的代码表示如下:
//建立Socket服务端,并且监听7088端口
ServerSocket ss=new ServerSocket(7088);
通过如上的方式可以非常便捷的建立Socket服务端,同时也可以使用其他接口来限制连接该Socket服务器的客户端数量,或者绑定到某个具体的服务器IP地址。
3.2 等待客户端连接。在建立Socket服务端,并且监听了本地计算机某个具体的通信端口之后,就可以使用accept()接口来监听客户端的连接。accept()接口是一种阻塞I/O操作,会持续监听通信端口,直到接收到某个来自客户端的连接,在远程控制技术中,可以使用多线程循环监听端口,以实现持续的远程操作。
3.3 接收客户端请求。在建立Socket服务器端,并且与客户端建立连接之后,教师端和学生端就可以通过建立的Socket连接进行鼠标/键盘事件和屏幕图像的网络传输。一个完整的远程控制通信实现如下所示:
4 结束语
远程控制技术的发展增加了网络教学的“真实”性,可以更加方便的实现师生的交互。因此,远程技术的发展可以更好的促进网络教育教学的发展。
参考文献:
[1]蒋方剑,周鹏,刘福启.适合中小型院校的多媒体全自动控制系统的研究[J].中国现代教育装备,2011(13):18-19.
[2]MillerK,Pegah M.Virtualization,Virtually at the Desktop[Z].The Special Interest Group on University andCollege Computing Services,2007:255-260.
[3]Niraj Tolia,David G,Andersen,M.Satyanarayan.Quantifying Interactive User Experience on Thin Clients[J].IEEE Computer,2006.
篇9
关键词JAVA,网络,SOCKET,APPLET
网络上的系统结构多为客户/服务器模式,服务器端负责数据和图像等的存储、维护、管理以及传递,客户端则负责人机界面的操作、送出需求及显示收回的数据。
下面介绍一下如何使用JAVA来进行网络编程:
1)由于客户端通过IE同服务器建立联系,所以客户端使用Applet,服务器端使用Application;
2)服务器应设置成多线程,应答多个客户的请求;
3)两端通信使用SOCKET机制。
1Java中输入/输出流概念:
过滤流DataInputStream和DataOutputStream除了分别作为FilterInputStream和FilterOutputStream的子类外,还分别实现了接口DataInput和DataOutput。接口DataInput中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数,如readBoolean()readInt()、readLine()、readFully()等。接口DataOutput中定义的方法主要是向流中写入基本类型的数据或者写入一定长度的字节数组,如writeChar()、writeDouble()DataInputStream可以从所连接的输入流中读取与机器无关的基本类型数据,用以实现一种独立于具体平台的输入方式;DataInputStream可以向所连接的输出流写入基本类型的数据。
2Socket机制
Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。
Socket通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下,通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全在这一对进程之间进行,通信完毕关闭此联接过程。使用无联接方式时其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在不同的主机和进程之间转发进行。
3Java语言
Java语言的优点主要表现在:简单、面向对象、多线程、分布性、体系结构中立、安全性等方面。
(1)简单性
Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。Java实现了自动的垃圾收集,简化了内存管理的工作。这使程序设计更加简便,同时减少了出错的可能。
(2)面向对象
Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。
Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。
Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。
Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。
(3)多线程
多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。
Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高的执行效率。
(4)分布性
Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。
(5)体系结构中立
Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。
为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。
java.lang:一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包
java.util:实用工具包。其中包括哈希表、堆栈、时间和日期等
java.io:基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等
:网络包。该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口
java.awt:抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等
java.applet:支持applet程序设计的基本包
(6)安全性
用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。
4JAVA工具
(1)JDK
1)Java编译器
Java编译器将Java源代码文件编译成可执行的Java字节码。Java源代码文件的扩展名为.java,Java编译器把这种扩展名的文件编译成扩展名为.class的文件。源文件中的每个类在编译后都将产生一个class文件,这意味一个Java源代码文件可能编译生成多个class文件。
2)Java解释器
Java解释器对编译生成的字节码格式的可执行程序的运行提供支持,它是运行非图形Java程序的命令行工具。
3)Appletviewer
它是JavaApplet的简单测试工具,可使用它来测试JavaApplet程序,而不需要WWW浏览器的支持。
(2)VisualJ++
VisualJ++集成了可视化界面设计、交互式调试、代码编辑、联机帮助信息和介绍如何快速掌握该开发环境的实用向导等多项功能,同时具有能充分利用ActiveX和COM新技术的优势。利用VisualJ++可创建交互性很强的Internet应用程序,是难得的Java开发系统。
5客户机/服务器通信的实现:
(1)Application同Applet的通信
两端通过Socket机制进行连接:
1)客户端的编程流程:
?打开Socket,新建一个套接字;
?为套接字建立一个输入和输出流;
?根据服务器协议从套接字读入或向套接字写入;
?清除套接字和输入/输出流;
2)服务器端的编程流程:
?打开ServerSocket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指定端口为客户端请求的Socket服务;
?使用ServerSocket类的accept()方法使服务器型套接字处于监听状态并把监听结果返回给普通套接字;
?为该普通套接字创建输入和输出流;
?从输入和输出流中读入或写入字节流,进行相应的处理,并将结果返回给客户端;
?在客户端和服务器工作结束后关闭所有的对象,如服务器型的套接字,普通套接字,输入和输出流。
正是由于Java系统具有基于Socket的灵活通信机制,因而其应用程序能自由地打开和访问网络上的对象,就象在本地文件系统中一样。
(2)Applet之间的通信:
Applet之间的通信使用AppletContext类的getApplet()方法。
<appletcode=applet1.classwidth=200height=200name=first>
只要在程序中加入
Appletoneapplet=getAppletContext().getApplet(“first”);便可使用name为first的Applet中的方法了。
在该课题中大量使用了该种通信方法,因为专门同服务器端通信的Applet中包含接收信息方法和发送信息方法,所有客户端的Applet都要使用负责通信的Applet中的方法,所以客户端的Applet同负责通信的Applet必须进行通信。
6程序
//服务器端程序S.java负责与客户端通信
importjava.io.*;
.*;
importjava.lang.*;
importT2;
classThreadEchoHandlerextendsThread//创建线程
{
T2theT2=newT2();
Socketincoming;
intcounter;
ThreadEchoHandler(Socketi,intc)
{incoming=i;
counter=c;}
publicvoidrun()
{
try
{
DataInputStreamin=newDataInputStream(incoming.getInputStream());
DataOutputStreamout=newDataOutputStream(incoming.getOutputStream());
System.out.println("hello");
booleandone=false;
while(!done)
{Stringaa="";
Stringstr=in.readUTF();//从客户端得到字符串
//在此加入各自的服务程序
System.out.println(str);
theT2.pass(str);//解码
theT2.tongji();//修改监控库中的信息
aa=theT2.guan();//操纵数据库
System.out.println("stringzis:"+aa);
if(pareTo("null")!=0)
//若是查询数据库,返回查询后的结果
{//若不是查询数据库,不向客户端输出信息
out.writeUTF(aa);
out.flush();}
}//while
incoming.close();//线程关闭
}//try
catch(IOExceptione)
{System.out.println(e);}
}//endrun
}
//----------------------------------------
classS
{
publicstaticvoidmain(String[]args)
{
inti=1;
try
{
ServerSockets=newServerSocket(1111);
for(;;)
{
Socketincoming=s.accept();
System.out.println("connect:"+i);
newThreadEchoHandler(incoming,i).start();
i++;
}
}
catch(Exceptione)
{System.out.println(e);}
}
}
//客户端通信小应用程序Echo.java
importjava.io.*;
.*;
importjava.awt.*;
importjava.applet.*;
publicclassEchoextendsApplet
{
TextAreata;
SocketechoSocket;
DataOutputStreamos;
DataInputStreamis;
StringLine;
publicvoidinit()
{
setBackground(Color.white);
ta=newTextArea(5,80);
ta.setEditable(false);
add(ta);
try
{echoSocket=newSocket("10.102.4.41",1111);}//与服务器建立连接
catch(IOExceptione)
{System.out.println("error");}
}
publicvoidst(Stringstri)//发送字符串的方法
{
try
{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());
DataInputStreamis=newDataInputStream(echoSocket.getInputStream());
os.writeUTF(""+stri);//向服务器输送string
os.flush();
}
catch(IOExceptione)
{System.out.println("error:"+e);}
}
publicStringst1()//接收字符串的方法
{
StringLine="";
try
{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());
DataInputStreamis=newDataInputStream(echoSocket.getInputStream());
Line=is.readUTF();//从服务器读来的信息
ta.appendText(""+Line);//在文本域中输出信息
}
catch(IOExceptione)
{System.out.println("error:"+e);}
returnLine;
}
}
7程序调试心得:
1)在建立Socket连接时,两端的端口号必须设为一致,否则建立不了连接。服务器端必须有主机IP地址或主机名参数。
2)连接建立好之后应确定输入和输出流。起初程序中用的是DataInputStream和PrintStream,结果只能传输英文,传输中文时产生乱码,将PrintStream改为DataOutputStream,使用readUTF()和writeUTF()方法后,中文传输问题得到解决。
3)如果一个使用某端口的程序没有关闭,另一个程序就不能使用这个端口。
4)开始进行通信的程序均为Application,因不符合客户机/服务器机制,应将客户端的Application改为Applet。其转化的主要步骤如下:
?创建一个包含APPLET标签的HTML文件;
?去掉应用程序中的main()方法;
?类名应继承Applet类,而不是Frame类,并在程序开头加入
importjava.applet.*;语句;
?用init()方法代替Application程序中的构造方法,当浏览器创建Applet类对象的时候,它自动执行init()方法;
?如Application中缺省使用了BorderLayout布局管理器,应在Applet的init()方法中重新设定;
?如果Application中有setTitle()方法,必须将其去掉,如Application中使用了菜单,在Applet中用按钮来替换。
5)懂得了在一程序中如何引用自定义的类中的方法和变量,在程序开头加入import类名;在程序中加入类名实例=new类名();然后使用
实例.方法(),实例.变量即可。
参考文献:
[1]廖雷等,Java程序设计教程,中国电力出版社,2003
篇10
关键词:智能电器;无线通信;WiFi模块;单片机
物联网技术是当代信息技术的一个重要标志,改变了人们的生产生活方式,使传统电器变得更加便捷而智能。智能电器是将微处理器、传感器技术、网络通信技术引入家电设备后形成的新型产品[1]。通信接口是智能电器的重要组成部分,用来实现通信节点之间信息的发送和接收。稳定的通信接口为智能电器系统的正常运行提供了有力保障。电器的控制方式分为有线控制和无线控制。有线控制是将控制器放置于强电箱内,开关和中控主机分别通过弱电控制线路进行控制。有线控制的优点:安全、稳定、不受干扰;有线控制的缺点:方案设计要求高、线路架设要求高、后期拓展改动困难。随着物联网和智能电器的发展,有线通信逐渐被无线通信所替代。当前普遍使用的无线通信技术主要有RFID技术、蓝牙技术、ZigBee通信技术、Z-Wave技术和WiFi技术[2,3]。WiFi通信技术是智能手机终端接入Internet的主流模式,其他类型的通信设备要接入Internet需要网关进行转换[4]。局域网络中的无线路由多采用WiFi技术与各节点进行无线通信,不用另设网关和网络改造便可实现系统搭建。智能手机可以通过局域网和广域网控制设备的工作状态。
1智能电器系统构成
智能家电系统由无线路由、智能终端、智能电器三大主要部分构成,如图1所示。无线路由为系统提供WiFi无线网络,是局域网络通信的基础部件,若要实现远程控制,需要与Internet连接进行广域网3G通信[5]。智能手机和平板电脑等智能终端可以在无线网络下,对处于网络中的智能电器节点进行控制操作。智能家电内需要集成WiFi无线通信模块接收控制指令,实现电器的非接触型智能控制。系统的操作流程:首先,配置模块要连接的路由器的名称(SSID)、密钥和服务器的IP地址;然后,手机等控制终端连接服务器下达操作命令;最后,控制系统根据指令完成相应的动作或查询等操作。智能手机和智能电器通常以STA站点形式入网,即作为无线网络的终端使用,形成客户端-客户端方式通信。也可以设置电器为AP,即作为无线接入点形成自组网络。无线WiFi模块在使用之前需要通过串口写入智能电器的MAC地址、网络名称、密码和IP等配置信息。图2为智能电器的系统框图。
2通信接口设计
2.1通信接口构成在由路由器构建的WLAN无线网络中,智能手机可以和电器中的WiFi模块进行通信。通信串口WiFi模块内嵌TCP/IP协议,通信接口如图3所示。硬件构成主要是由内嵌的一个单片机和WiFi模块构成,单片机主要实现裸机驱动程序和TCP/IP协议;WiFi模块则必须完成数据的无线接收和发送。模块内部集成了TCP/IP协议栈和WiFi模块,用户可以实现串口设备的无线网络功能。嵌入式WiFi模块对外提供UART串口或者SPI接口,其通信标准为IEEE802.11b/g,支持WPA/WPA2PSK加密,支持AES和TKIP加密算法。智能终端和WiFi模块的通信格式常用的通信协议有HTTP、TCP/IP和Socket,HTTP是应用层协议;TPC/IP协议是传输层协议;Socket是应用层与TCP/IP协议的中间软件,是对TCP/IP协议的封装和应用抽象层[6]。面向嵌入式系统的通信协议多采用Socket协议。2.2Socket通信协议软件实现采用Socket通信协议客户端的通信过程:①建立通信;②查询连接;③发送数据;④接收数据;⑤关闭连接。Android手机建立连接指令为newSocket(HOST,PORT),关闭连接指令为socket.close(),发送数据调用getOutputStream()方法,接收数据调用getInputStream()方法。服务器的通信过程可概述为:1)建立服务器端的Socket,侦听网络中的连接请求;2)当检测到连接请求时,向客户端发送收到连接请求的信息并建立连接;3)完成通信后关闭Socket连接。图4为客户端和服务器的通信流程,图中的bind()和listen()方法用来绑定并监听Socket和端口号,accept()用来接收来自客户端的连接请求。当点击智能手机界面上的功能按键,后台会将数据以Socket格式发送给WiFi模块,发送指令被电器控制系统接收后,便会执行检测、开启、关断、调节等响应动作,并可根据需要将执行结果返回给智能手机。2.3单片机通信接口设计1)硬件设计通信接口和执行机构的硬件设计以单片机为核心,包括单片机最小系统及其电路设计,把单片机、无线模块、继电器等模块有机的结合在一起。WiFi模块的TX和RX与其串口相连,负责信息指令的接收和发送;WiFi模块和单片机的通信采用串口模式(UART),串口波特率可达115200bps,执行命令由普通I/O口输出,可控制执行部件响应动作指令;配以光照、温度等传感器装置送入单片机自带ADC模拟数字转换接口,可以检测环境状态并作出相应动作,使电器更加智能。图5是单片机控制继电器的硬件连接示意图,WiFi模块的UART_TX和UART_RX与单片机串口的RXD和TXD相连,完成UART口双向通讯功能;继电器K与普通I/O口相连,通过继电器电路可以实现对智能电器的开关控制。当模块收到合上指令时,输出高电平,继电器的线圈有电流流过,继电器的触点吸合,给负载供电;当模块收到断开指令时,端口输出低电平,执行断电操作。设计了传感器的AD转换接口,实现了可以根据环境状态的检测结果控制继电器的动作。2)软件设计单片机系统上电复位后,首先进行硬件初始化,WiFi模块的初始化在函数Config()中完成,在函数中完成波特率、初始化接收、发送数据的中断类型等设置。模块开启后,寻找并连接网络,建立数据连接,由单片机封装数据后通过WiFi模块发送给智能手机。接收数据时,单片机程序不断地对WiFi模块进行扫描查询,查询数据缓冲区BUF中是否有数据,当查询到模块接收到手机用户发送操作或者查询指令时,根据Socket协议格式提取相关信息,对指令进行处理并执行相关动作,并通过UART串口返回数据到手机端。接收手机端数据需要使用外部中断来完成,能够确保数据传输的同步性和实时性,接收8位为一帧有效数据。单片机主程序流程如图6所示。单片机设置了监测环境光照功能,由光敏传感器经过ADC芯片转化后送到单片机,数据与阈值电压比较,当超过阈值时关断电器设备。
3结论
该智能电器通信系统在无线网络的平台下,在传统电器上接入无线WiFi模块,实现了智能终端对智能家电的远程监测与控制功能,单片机能够实时的对接收到的指令进行处理和响应,满足了设计要求。该系统安全、可靠、性能稳定。为大规模智能电器远程的监管与控制提供了可能。
参考文献
[1]刘远聪.物联网智能家居远程控制技术的研究[D].兰州:兰州交通大学,2015.
[2]曹方.物联网与短距离无线通信[J].上海信息化,2013(5):32-35.
[3]郑先海,吕海华,杨弘平.基于AndroidPN技术的Zig-bee无线网络的物联网数据采集[J].沈阳工程学院学报:自然科学版,2014,10(4):370-372,381.
[4]吴吉义,李文娟,黄剑平,等.移动互联网研究综述[J].中国科学:信息科学,2015,45(1):45-69.
[5]罗军舟,吴文甲,杨明.移动互联网:终端、网络与服务[J].计算机学报,2011,34(11):2029-2051.