前言:中文期刊网精心挑选了socket通信范文供你参考和学习,希望我们的参考范文能激发你的文章创作灵感,欢迎阅读。
socket通信范文1
关键词:套接字;会话层;数据报;TCP套接字;UDP套接字
中图分类号:TP393 文献标识码:A文章编号:1009-3044(2010)02-334-03
On the socket Communication is Implemented in PowerBuilder
LU Lu, WANG Yan-ping
(Zhengzhou Railway Vocational and Technical College, Zhengzhou 450052, China)
Abstract: With the computer technology and network communication technology, Socket technology has become the basis of network programming, SocketAPI provide a process of communication between. PowerBuilder as a program development language in the development of information management systems and a variety of cross-platform database has a wide range of applications. Article a brief introduction of the Socket communication theory and the use of methods, and to chat program as an example to explain how to use Winsock control in PowerBuilder to enhance network capabilities to achieve Socket Communications.
Key words: socket; session layer; datagrams; TCP socket; UDP socket
Socket编程接口由4BSD UNIX首先提出,目的是解决不同网络间通信问题。Socket接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程之间的通信,而且支持网络通信功能。要想弄清楚Socket的工作原理,必须对网络通讯技术有所了解。在计算机界,为了保证各种网络、各种机器、各种操作系统之间能进行互联,进行数据交换,采取了开放式互联模型,即OSI模型,它将网络通讯划分为7个层次。
1 OSI七层模型概述
OSI模型成为计算机之间,以及网络间进行通信的主要的结构模型。从上到下,各层名称及其描述依次为:
1) 第七层:应用层(Application Layer):定义了用于在网络中进行通信和数据传输的接口 ―用户程式;提供标准服务,比如虚拟终端、文件以及任务的传输和处理。
2) 第六层:表示层(Presentation Layer):掩盖不同系统间的数据格式的不同性;指定独立结构的数据传输格式;进行数据的编码和解码、加密和解密、压缩和解压缩。
3) 第五层:会话层(Session Layer):管理用户会话和对话;控制用户间逻辑连接的建立和挂断;报告上一层发生的错误。
4) 第四层:传输层(Transport Layer):管理网络中端到端的信息传送;通过错误纠正和流控制机制提供可靠且有序的数据包传送;提供面向无连接的数据包的传送。
5) 第三层:网络层(Network Layer):定义网络设备间如何传输数据;根据唯一的网络设备地址路由数据包;提供流和拥塞控制以防止网络资源的损耗。
6) 第二层:数据链路层(Data Link Layer):定义操作通信连接的程序;封装数据包为数据帧;监测和纠正数据包传输错误。
7) 第一层:物理层(Physical Layer):定义通过网络设备发送数据的物理方式;作为网络媒介和设备间的接口;定义光学、电气以及机械特性。
通过OSI模型,信息可以从一台计算机的软件应用程序传输到另一台的应用程序上。比如,要实现计算机A与计算机B之间通信,实际上,通信过程是计算机A上的应用程序要将信息发送到计算机B的应用程序。中间过程如下:
计算机A中的应用程序需要将信息先发送到其应用层(第七层),然后此层将信息发送到表示层(第六层),表示层将数据转送到会话层(第五层),如此继续,直至物理层(第一层)。在物理层,数据被放置在物理网络媒介中并被发送至计算机B。计算机B的物理层接收来自物理媒介的数据,然后将信息向上发送至数据链路层(第二层),数据链路层再转送给网络层,依次继续直到信息到达计算机B的应用层。最后,计算机B的应用层再将信息传送给应用程序接收端,从而完成通信过程。
2 Socket概述
2.1 套接字(Socket)所处位置
套接字大致位于OSI模型的会话层。会话层为两台计算机之间的数据流提供管理和控制服务。作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。
2.2 套接字的类型
套接字一般有两种类型:TCP套接字和UDP套接字。两者都接收传输协议数据包并将其内容向前传送到表示层。
TCP 把消息分解成数据包(数据报,Datagrams),并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。
UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。
2.3 Socket的使用方法
下面,我们一一给出重要的Socket系统调用的使用方法。
1) 创建 Socket。调用格式为:sockid = socket (af, type, protocol)其参数意义如下:
af:地址族,指本socket所用地址类型。
type:类型,指创建socket的应用程序所希望的通信服务器类型。
protocol:协议,指该socket请求的协议。
2) 指定本地地址―bind()调用。
bind()将本地socket地址与所创建的socket联系起来,即将本socket地址赋予socket,以指定本地半相关。bind()的作用相当于给socket命名,调用格式为bind(sockid,localaddr,addrlen)
其参数意义如下:
sockid:socket号。
localaddr:本地socket地址。
addrlen:地址长度。
3) 建立socket连接―connect()与 accept()调用。
这两个系统调用用于完成整个相关的建立。其中connect用于建立连接。调用格为
connect(sockid,destaddr,addrlen),其中destaddr为指向对方socket地址(信宿地址)结构的指针。
accept()用于面向连接的服务器,其调用格式为:
newsock =accept(sockid,clientaddr,paddrlen),其中clientaddr为指向客户socket地址指针,paddrlen为客户socket地址长度。
4) listen()调用
此调用用于面向连接服务器,表明它愿意接收连接,listen()在accept()之前调用,格式为
listen (sockid,quelen),其中quelen 为请求队列长度。
5) 发送数据―write(),writev(),send()与sendto(),sendmsg()
用于socket数据发送的系统调用一共有五个,其中三个,write(),writev()和send()用于面向连接传输,其余两个用于无连接传输。面向连接的调用可以不指定信宿地址,而无连接的调用必须指定。假如无连接socket的双方均调用过connect(),可以认为是建立有连接的socket,也可以面向连接调用发送数据。
6) 接收数据―read(),readv(),recv()与recvfrom(),recvmsg()
接收数据与发送数据系统调用是一一对应的,两者参数的最大区别是,前者buffer是一个指针,其所指单元初值为欲读数据长度,调用后的值是实际读出的值。
2.4 Socket控件
针对Socket API存在的使用复杂、同步阻塞等问题,Microsoft公司对其进行了封装,开发了WinSock控件。该控件具体使用简单、可靠性强、支持事件等特性,对于开发人员而言,就是一个典型的对象,有属性、方法和事件,因此可以极高地提高软件的开发效率。
Winsock控件对用户是不可视的,可以很容易地访问TCP和UDP网络服务。其可以被Microsoft Access, Visual Basic,Visual C++或Visual FoxPro开发人员使用。要编写客户和服务器应用程序,不需要了解TCP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。
如果创建客户应用程序,就必须知道服务器计算机名或者IP地址(RemoteHost属性),还要知道进行“侦听”的端口(RemotePort属性),然后调用Connect方法。
如果创建服务器应用程序,就应设置一个收听端口(LocalPort属性)并调用Listen方法。当客户计算机需要连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest事件内的Accept方法。
建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用SendData方法。当接收数据时会发生DataArrival事件。调用DataArrival 事件内的GetData方法就可获取数据。
3 在PB中使用Socket控件的方法
3.1 注册控件
Winsock控件是微软件公司提供的处理网络通信的控件,用它可以进行局域网或则INTERNET的编程开发。该控件并不是默认随Windows 操作系统自带的。有两种方法可以获得它,一是通过安装Visual Studio开发环境; 另外一个方法是下载MsWinsck.ocx文件,然后使用“regsvr32 mswinsck.ocx”命令行进行注册。下面以聊天程序为例演示具体用法。
3.1.1 创建服务器端程序
打开PowerBuilder,然后创建WorkSpace和application对象;创建主窗口w_server对象,并放置控件,如图1所示。
接下来为控件的事件写入以下代码:
Cb_listen控件的clicked事件:
ole_socket.object.localport = 1500;
ole_socket.object.listen();
lb_msg.additem ("开始监听");
ole_socket控件的ConnectionRequest事件
if this.object.state 0 then
this.object.close();
end if
this.object.accept( requestid);
lb_msg.additem ("己经和客户端建立连接!");
ole_socket控件的DataArrival事件
string buf;
this.object.getdata ( ref buf);
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客户机端说:"+buf );
cb_send控件的Clicked事件
string buf ;
buf = sle_text.text;
ole_socket.object.senddata ( buf);
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服务器端说:"+ buf);
3.1.2 创建客户端程序。
创建过程与创建服务器端相似,这里就不再重复。客户端程序的窗口界面如图2所示。
接下来为控件的事件写入以下代码:
Cb_connect事件的clicked事件
ole_socket.object.remotehost = em_host.text;
ole_socket.object.remoteport = integer ( em_port.text);
ole_socket.object.connect();
lb_msg.additem ( "己经和服务器端建立连接!" ) ;
Ole_socket控件的DataArriavl事件
string buf;
ole_socket.object.getdata ( ref buf ) ;
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服务器端说:"+ buf);
cb_send控件的clicked事件
string buf;
buf = sle_text.text;
ole_socket.object.sendData ( buf) ;
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客户机端说:"+buf ) ;
4 结论
PB是开发大型MIS及各类数据库跨平台应用的首选。从数据库前端工具来讲甚至远远超过了Oracle的Develop系列等专门的工具,从通用语言角度来讲功能也与VB等不相上下。但是多媒体和网络功能与其他工具相比较弱,该文针对这种情况,结合实际工作中的经验,讨论了如何在PB中通过使用Winsock控件增强网络功能,不足之处,敬请指正。
参考文献:
[1] Donahoo M J.TCP/IP Sockets编程(C语言实现)[M].陈宗斌,译.北京:清华大学出版社,2009.
[2] Iseminger D.网络连接服务开发人员参考库Windows Sockets和QOS[M].北京:机械工业出版社,2001(1).
[3] 蒋东兴.Windows Sockets 网络程序设计大全[M].北京:清华大学出版社,1999.
[4] 蒋东兴,林鄂华.Windows Sockets网络程序设计指南[M].北京:清华大学出版社,1995.
[5] 彭建.基于Sockets的桌面视频会议系统研究[D].长沙:中南大学,2002.
[6] Hatfield B.PowerBuilder 5 应用程序开发指南[M].史森,译.4版.北京:清华大学出版社,1997.
socket通信范文2
摘 要:针对当前大多数信息系统不稳定性、安全性不高等缺点,提出了一种基于Struts2架构与FCKeditor编辑
>> 基于Struts2学生信息管理系统的设计与实现 基于Struts2框架的学生助理管理系统的设计与实现 基于Struts2结构的在线考试系统设计与实现 基于Struts2、Hibernate和Ajax的办公自动化系统的设计与实现 基于Struts2 + Spring + JPA的生物信息数据库的设计 基于Struts2的随书光盘管理系统文件上传模块设计 基于Struts2框架的高校教务新闻管理系统的研究与实现 基于Struts2和iBATIS的JSP开发框架设计与实现 基于Struts2和AJAX的网上汽车配件商城的设计与实现 基于Struts2的MVC模式在高校科研管理系统中的应用 基于Struts2框架的FTP访问服务的Web平台设计 基于Struts2的Web应用开发 基于Struts2的参数传递方法研究 基于Struts2框架的输入校验功能的实现与应用 基于Hibernate与Struts的信息系统的研究与实现 基于Struts的J2EE构架的OA系统设计与实现 基于Struts2+Spring+Hibernate框架的网上评教系统的设计与实现 Struts2中的OGNL应用案例 基于Struts与Ajax的信息技术课程考试系统设计与实现 基于Struts与Hibernate企业信息系统的设计与实现 常见问题解答 当前所在位置:,2012.
[4] 杨志勇.基于 Struts2 框架的网站信息内容管理平台的设计与实现[J].计算机与现代化,2012(8):98-100.
[5] 任小林,桂仕伟,吴祈宗.基于XML 的Web 信息系统及其J2EE实现[J].计算机应用,2003,23(10):134-137.
[6] 萨师煊.数据库系统概论[M].北京:高等教育出版社,2000.
socket通信范文3
【关键词】TCP/IP;socket ;C/S模式;C#
0 引言
当前网络通信日益应用广泛,以民航汕头空管站为例,单业务网就超过5个,而信息化集中程度越来越多的同时,分布式系统之间的信息传输也成为一个研究课题。而对于传统的TCP/IP协议来说,TCP能提供一种可靠的、有连接的数据流服务,IP协议则能通过识别IP地址实现网络个体的互相通信,相关文献也将两者称为底层网络通信。而对比之下,已经成熟应用的Socket中间件便可以以应用程序的方式存在于各大网络分布式系统,应用日趋广泛。因此,探讨Socket的运行机制及应用对相关网络编程和技术维护有一定意义。本文将从实际出发,介绍其在C#程序编写中的相关技术及特点。
1 Socket运行机制
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket作为一个门面模式把复杂的TCP/IP协议族隐藏在Socket接口后面,对开发人员来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。它主要由IP地址和端口号组成。在TCP/IP网络协议中,基于服务器客户端模式的通信上,建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。对于ServerSocket来说主要用于服务器监听,服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。一旦有请求或者相关命令信息,立即响应。而对于ClientSocket来说将主动向服务器端套接字发出连接请求。因此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
2 Socket在C#编程中的机制
2.1 C#中的Socket类
C# Socket 类为网络通信提供了一套丰富的方法和属性。Socket 类允许开发人员使用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输。如果应用程序在执行期间只需要一个线程。对于面向连接的协议的 TCP协议通信,服务器可以使用 Listen 方法侦听连接。Accept 方法则处理任何传入的连接请求,并返回可用于与远程主机进行数据通信的 Socket。同时可以使用此返回的 Socket 来调用 Send 或 Receive 方法。调用Bind方法后便可以要指定本地 IP 地址和端口号。连接侦听主机,则可以调用 Connect 方法。在数据通信上,主要用 Send 或 Receive 方法。
对于TCP/IP的通信在C#中可使用 Socket、BeginConnect 和 EndConnect 方法来连接侦听主机。通过使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以进行异步数据通信。与此同时,使用 BeginAccept 和 EndAccept 处理传入的连接请求。
而在实际应用中,C#的Socket经常需要与多线程配合以解决异步传输问题。C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。
2.2 实际应用
作为典型的C/S模式结构设计,一般情况下包括服务器端软件设计和客户端软件设计,因此服务器端软件与客户端软件不可避免需要对其进行网络通信编程。以客户端软件设计为例,Socket在C#中则可以通过以下实现:
private IPEndPoint ServerInfo;
private Socket ClientSocket;
private Byte[] MsgBuffer;//信息接收缓存
private Byte[] MsgSend; //信息发送存储
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MsgBuffer = new Byte[65535];
MsgSend = new Byte[65535];
this.UserName.Text =Environment.MachineName;
ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));
ClientSocket.Connect(ServerInfo);
ClientSocket.Send(Encoding.Unicode.GetBytes("用户: " + this.UserName.Text + " 进入系统!\n"));
ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);
3 结束语
本文讨论了Socket的运行机制以及其在C#编程中的设计以及相关技术功能,Socket作为一种应用程序接口其在实际应用中将底层的相关通信协议等各种技术封装在程序背后,为开发人员提供了快速、高效的开发方式。讨论其运行机制,对开发和技术维护有实际意义。
【参考文献】
[1]胡晶晶,鲁漫红.基于Java Socket的聊天室系统设计与实现[J].微处理机,2010,5:66-70.
socket通信范文4
本文介绍了Socket通信机制,采用C/S模式,使用Java语言SocketAPI(套接字接口)以及多线程技术实现多客户端远程监控服务器的功能,实现了上传、下载、截图、远程关机、远程输入dos命令等功能。
【关键词】Java 远程监控 Socket通信
1 引言
Java语言具有跨平台性,是一门丰富的面向对象的程序设计语言,同时具有强大的网络编程接口,这使得Java在网络通信方面游刃有余,网络上的计算机如果进行通信,一方面要准确定位计算机在网络中的位置,另一方面则是要进行数据的传输。而这些功能的实现则要依靠Java强大的网络编程接口,如Socket类、ServerSocket类等。
2 Socket通信
在数据传输过程中按照传输的协议我们分为TCP和UDP两种,其中TCP是面向连接的传输控制协议,传输信息过程中确保数据的有序性、可靠性,为流式Socket通信。UDP是用户数据报协议,不保证数据的可靠性,为数据报式Socket通信。
在java中为实现TCP,Socket提供了两个基础的类(Socket和ServerSocket),Socket类有两个作用:1、作为客户端向服务器发出请求。2、在服务器端生成一个与客户端对等的通信实体,实现一对一的通信。ServerSocket主要用于在TCP传输的服务器端建立一个监听端口,监听本地服务器是否接受到客户机端的连接请求(当接收到请求的时候,采用accept方法确认连接,并在本地返回一个Socket对象,利用该Socket对象与客户端的Socket实现建立通信)。
3 软件设计开发
在实际应用中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要利用多线程实现多客户机制。用一个实现了runnable的severworker类来实现多线程。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。
4 程序实现
4.1 服务器端程序编写
ServerSocket server=null;
Socket theSocket=null;
server=new ServerSocket(PORT_NUMBER);//监听端口
ServerWorker worker;
Thread thread;
while(true){ //循环监听客户端的请求
theSocket=server.accept();
worker=new ServerWorker(theSocket);//将请求交给worker线程处理
thread=new Thread(worker);
thread.start();}//运行worker里面相应的操作
线程类的实现:
public void run ()
String message;
try{
FileWriter client=new FileWriter("client.txt",true);
theReader=new DataInputStream(theSocket.getInputStream());
//获得客户端输入的相关信息
theWriter=new DataOutputStream(theSocket.getOutputStream());
//获得服务器端的输出信息
String inputStr,outputStr;
theWriter.writeUTF("欢迎进入网络远程监控系统");
theWriter.flush();//清空缓冲区,保证客户端接收到相关信息
do{
inputStr=theReader.readUTF();
System.out.println(inputStr);
if (inputStr.equals("bye"))
break;
String[] Array=inputStr.split("#");
client=new FileWriter(Array[0]+".txt",true);
//建立相关文件,将客户端执行的操作写入相关日志文件中
if(Array[1].equals("upload")){}//你想进行的上传操作}}}
4.2 客户端的程序实现
String str=JOptionPane.showInputDialog("1.输入你想连接到服务器端的IP地址");
String sr=JOptionPane.showInputDialog("输入你想连接到服务器端的端口号");
try{
theSocket=new Socket(str,a);//将服务器ip地址和端口号传进
theReader=new DataInputStream(theSocket.getInputStream());
theWriter=new DataOutputStream(theSocket.getOutputStream());
}catch(Exception e){System.out.println("can not access to port "+sr); }
5 程序运行结果
主程序显示界面:通过选择相应的数字来实现不同的功能
6 注意事项
应注意到:(1)当传一个较大的文件时,需要分段传,因为tcp包最大为64kb,往往我们需要传的是一个很大的文件。还有注意输入输出流的正确关闭,以及套接字socket的正常关闭。(2)总是先启动服务器程序,在启动客户端程序,因本测试服务器和客户端为一台机器,所以Ip地址选择为127.0.0.1。
参考文献
[1]author.(美)Kenneth L.Calvert Michael J.Donahoo.Java TCP/IP Socket编程.
socket通信范文5
关键词:socket 通信 交易
1.交易系统介绍
交易就是用户对商品的买与卖。交易系统是通过计算机系统来进行交易,也就是说,商品的买与卖都是通过计算机的网络及后台进程配对完成,交易核心采用基于内存的方式设计开发以达到最大的交易及查询响应速度。它的设计思路是:交易系统的所有数据存放在关系数据库中,但交易核心在启动后与硬盘数据不直接通信,而只是在启动时将交易所需数据一次性读入共享内存。这之后的所有交易撮合、生成委托单、交易结果都是在内存中实现的。当交易结束后,再将交易结果从内存装回硬盘数据库中,在数据库中实现交易结算、整理,产生各种帐目及统计报表,同时,再一次完成各种信息的录入与修改。
交易核心与外界的通信经由消息队列(message queue),交易核心用于交易所使用的数据存放共享内存(shared memory)中,利用socket接口编程来实现.
2.socket的设计原理及进行通信连接的过程框图
socket设计在操作系统的核心中,提供一些系统调用以支持多种通信协议(如tcp,udp等等)。当要支持一种新的通信协议时,则需要把核心做一些改变。为了免除改变核心太多而造成不便,可以采用流的模块方式来添加新的功能,但这种方式并无法完全免除更动核心的操作。实际上,核心的设计把网络系统分成三个不同的层,如下图。
socket支持3种访问传输系统的接口:其中一种就是同步阻塞方式:使用同步阻塞方式时,socket库函数暂停程序的运行,等待传输系统完成请求的操作,操作一旦完成,应用程序重新获得控制权。如下右图。
3.重要的socket系统调用
(1)创建socket- sockets()系统调用
应用程序在使用sockets之前,首先必须拥有一个sockets,系统调用sockets()向应用程序提供创建sockets的手段,其调用格式如下:
sockid = socket (int af, int type, int protocol);
(2)指定本地地址-bind()系统调用
在创建了一个新的socket号后,还要用bind()将本地socket地址(包括主机地址和本地端口号)与所创建的socket号联系起来,其调用格式如下:
bind (socket sockid, const struct sockaddr far* name, int namelen);
(3)listen()系统调用
该调用用于面向连接的流socket,表明它愿意接收连接请求。当服务器可能同时收到几个连接请求时,便将连接请求放入请求队列。listen()在accept()之前调用,其格式为:
listen(socket sockid, int backlog);
(4)建立socket 连接connect()与accept()系统调用
用于完成整个关联的建立。connect()的调用格式如下:
connect (socket sockid, const struct sickaddr far*name, int namelen);
(5)发送数据send()和sendto()系统调用
建立了socket连接后,便可利用上述函数通过该socket发送数据。其中send()用于面向连接的传输,sendto()用于无连接传输,调用格式如下:
send (socket sockid, char faar* buf, intbuflen, int flags);
sendto(socket sockid, const char far* buf, int len, int flags, const struct sockaddr far* to, int tolen);
(6)接收数据—recv()和recvfrom()系统调用接收数据系统调用与发送数据系统调用是一对应的,其调用格式也是一一对应。
(7)关闭socket—closesocket()系统调用
在完成数据传输任务后,需要调用closesocket()来关闭连接和释放socket,其调用格式如下:
socket通信范文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