socket通信.docx

上传人:b****6 文档编号:4604925 上传时间:2022-12-07 格式:DOCX 页数:13 大小:22.58KB
下载 相关 举报
socket通信.docx_第1页
第1页 / 共13页
socket通信.docx_第2页
第2页 / 共13页
socket通信.docx_第3页
第3页 / 共13页
socket通信.docx_第4页
第4页 / 共13页
socket通信.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

socket通信.docx

《socket通信.docx》由会员分享,可在线阅读,更多相关《socket通信.docx(13页珍藏版)》请在冰豆网上搜索。

socket通信.docx

socket通信

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。

应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

Socket和ServerSocket类库位于包中。

ServerSocket用于服务器端,Socket是建立网络连接时使用的。

在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。

不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

服务器端:

ServerDemo.java

packagecom.lanber.socket;

importjava.io.DataInputStream;

importjava.io.DataOutputStream;

importjava.io.IOException;

import.ServerSocket;

import.Socket;

publicclassServerDemo{

/**

*注意:

Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,

*而后才可以向客户端发送信息,否则将会有运行时出错。

*@paramargs

*/

publicstaticvoidmain(String[]args){

ServerSocketss=null;

try{

ss=newServerSocket(8888);

//服务器接收到客户端的数据后,创建与此客户端对话的Socket

Socketsocket=ss.accept();

//用于向客户端发送数据的输出流

DataOutputStreamdos=newDataOutputStream(socket.getOutputStream());

//用于接收客户端发来的数据的输入流

DataInputStreamdis=newDataInputStream(socket.getInputStream());

System.out.println("服务器接收到客户端的连接请求:

"+dis.readUTF());

//服务器向客户端发送连接成功确认信息

dos.writeUTF("接受连接请求,连接成功!

");

//不需要继续使用此连接时,关闭连接

socket.close();

ss.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

}

客户端:

ClientDemo.java

packagecom.lanber.socket;

importjava.io.DataInputStream;

importjava.io.DataOutputStream;

importjava.io.IOException;

importjava.io.OutputStream;

import.Socket;

import.UnknownHostException;

publicclassClientDemo{

/**

*@paramargs

*/

publicstaticvoidmain(String[]args){

Socketsocket=null;

try{

socket=newSocket("localhost",8888);

//获取输出流,用于客户端向服务器端发送数据

DataOutputStreamdos=newDataOutputStream(socket.getOutputStream());

//获取输入流,用于接收服务器端发送来的数据

DataInputStreamdis=newDataInputStream(socket.getInputStream());

//客户端向服务器端发送数据

dos.writeUTF("我是客户端,请求连接!

");

//打印出从服务器端接收到的数据

System.out.println(dis.readUTF());

//不需要继续使用此连接时,记得关闭哦

socket.close();

}catch(UnknownHostExceptione){

e.printStackTrace();

}catch(IOExceptione){

e.printStackTrace();

}

}

}

 

RMI(RemoteMethodInvocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。

使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。

RMI是EnterpriseJavaBeans的支柱,是建立分布式Java应用程序的方便途径。

在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(RemoteProcedureCall)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。

针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的革命,为远程通信开辟新的里程碑。

RMI的开发步骤

1先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote

2开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject

3通过javac命令编译文件,通过java-server命令注册服务,启动远程对象

4最后客户端查找远程对象,并调用远程方法

简单实例

首先为服务建立一个Model层,注意因为此对象需要现实进行远程传输,所以必须继承Serializable

[c-sharp]viewplaincopy

5packagermi.model;

6importjava.io.Serializable;

7//注意对象必须继承Serializable

8publicclassPersonEntityimplementsSerializable{

9privateintid;

10privateStringname;

11privateintage;

12publicvoidsetId(intid){

13this.id=id;

14}

15publicintgetId(){

16returnid;

17}

18publicvoidsetName(Stringname){

19this.name=name;

20}

21publicStringgetName(){

22returnname;

23}

24publicvoidsetAge(intage){

25this.age=age;

26}

27publicintgetAge(){

28returnage;

29}

30}

 

创建远程接口PersonService,注意远程接口需要继承Remote

[java]viewplaincopy

31packagermi.service;

32importjava.rmi.Remote;

33importjava.rmi.RemoteException;

34importjava.util.List;

35importrmi.model.*;

36//此为远程对象调用的接口,必须继承Remote类

37publicinterfacePersonServiceextendsRemote{

38publicListGetList()throwsRemoteException;

39}

 

建立PersonServiceImpl实现远程接口,注意此为远程对象实现类,需要继承UnicastRemoteObject

[java]viewplaincopy

40packagermi.serviceImpl;

41importjava.rmi.RemoteException;

42importjava.rmi.server.UnicastRemoteObject;

43importjava.util.LinkedList;

44importjava.util.List;

45importrmi.model.PersonEntity;

46importrmi.service.*;

47//此为远程对象的实现类,须继承UnicastRemoteObject

48publicclassPersonServiceImplextendsUnicastRemoteObjectimplementsPersonService{

49publicPersonServiceImpl()throwsRemoteException{

50super();

51//TODOAuto-generatedconstructorstub

52}

53@Override

54publicListGetList()throwsRemoteException{

55//TODOAuto-generatedmethodstub

56System.out.println("GetPersonStart!

");

57ListpersonList=newLinkedList();

58

59PersonEntityperson1=newPersonEntity();

60person1.setAge(25);

61person1.setId(0);

62person1.setName("Leslie");

63personList.add(person1);

64

65PersonEntityperson2=newPersonEntity();

66person2.setAge(25);

67person2.setId

(1);

68person2.setName("Rose");

69personList.add(person2);

70

71returnpersonList;

72}

73

74}

建立服务器端,在服务器端注册RMI通讯端口与通讯路径,然后通讯javac命令编译文件,通过java-server命令注册服务。

以下面代码为例,如果阁下将项目建立于D:

//RMI/RemotingService文件夹上时,则先输入D:

//RMI/RemotingService/src>javacrmi/remotingservice/Program.java获取Program.class(如何阁下使用的MyEclipse等开发工具,可跳过此步,直接在*/bin文件夹中直接调用已经生成的Program.class),然后输入D:

//RMI/RemotingService/src>javarmi/remotingservice/Program启动服务。

[java]viewplaincopy

 

75packagermi.remotingservice;

76importjava.rmi.Naming;

77importjava.rmi.registry.LocateRegistry;

78

79importrmi.service.*;

80importrmi.serviceImpl.*;

81publicclassProgram{

82publicstaticvoidmain(String[]args){

83//TODOAuto-generatedmethodstub

84try{

85PersonServicepersonService=newPersonServiceImpl();

86//注册通讯端口

87LocateRegistry.createRegistry(6600);

88//注册通讯路径

89Naming.rebind("rmi:

//127.0.0.1:

6600/PersonService",personService);

90System.out.println("ServiceStart!

");

91}catch(Exceptione){

92//TODOAuto-generatedcatchblock

93e.printStackTrace();

94}

95}

96}

最后建立客户端进行测试,注意客户调用的RMI路径必须服务器配置一致

[java]viewplaincopy

97packagermi.remotingclient;

98importjava.rmi.Naming;

99importjava.util.List;

100importrmi.model.PersonEntity;

101importrmi.service.*;

102publicclassProgram{

103publicstaticvoidmain(String[]args){

104try{

105//调用远程对象,注意RMI路径与接口必须与服务器配置一致

106PersonServicepersonService=(PersonService)Naming.lookup("rmi:

//127.0.0.1:

6600/PersonService");

107ListpersonList=personService.GetList();

108for(PersonEntityperson:

personList){

109System.out.println("ID:

"+person.getId()+"Age:

"+person.getAge()+"Name:

"+person.getName());

110}

111}catch(Exceptionex){

112ex.printStackTrace();

113}

114}

115}

 

Java&CORBA编程实例

JavaIDL技术在Java平台上添加了CORBA(CommonObjectRequestBrokerArchitecture)功能,提供了基于标准的互操作能力和连接性。

JavaIDL技术使得分布式的JavaWeb应用能够通过使用工业标准的IDL和IIOP(InternetInter-ORBProtocol)来透明地调用远程网络服务的操作。

运行时组件(RuntimeComponents)包括了一个用于分布式计算且使用IIOP通信的JavaORB.

可移植对象适配器(PortableObjectAdapter,POA)

CORBA对象的负责分隔服务器端远程调用句柄(handler)到远程对象和它的服务者(servant)。

对象由远程调用所暴露,而服务者包含实际处理这些请求的方法。

每个对象都可以选择服务者为静态的(一次)或动态的(每个远程调用),在这两种情况下,都允许调用转移到另一台服务器。

在服务器端,POA形成了类似树状的结构,每个POA都负责一到多个服务的对象。

树的分支可以是独立活动的、或钝化的,服务者调用有不同的代码和不同的请求处理策略。

API规范

*org.omg.CORBA包-提供了OMGCORBAAPIs到Java编程语言的映射

*org.omg.CosNaming包-为JavaIDL提供命名服务

*org.omg.PortableServer包-为建立服务器端的可移植的、跨越多ORB的应用程序提供类和接口

*org.omg.PortableInterceptor包-提供了注册ORB钩子的机制,此钩子通过ORB服务能截取正常的ORB执行流

*org.omg.DynamicAny包-提供了使得任何值都能被动态解释(或遍历)和通过DynAny对象构造出来的类和接口

*org.omg.CORBA.ORB-为CORBAORB功能的API

分布式对象之间的关系有两方面:

客户端和服务器。

服务器提供远程接口,客户端调用远程接口。

在客户端,应用程序包括远程对象的引用。

该对象引用有stub方法,它是独立的远程方法。

stub方法实际连接到ORB,因此调用它实际上转发调用到服务器。

在服务器端,ORB使用skeleton代码翻译远程调用为本地对象的方法调用。

Skeleton把调用转换成指定实现的格式,并在方法中调用。

当方法返回时,Skeleton代码转换方法调用的结果或错误,经ORB送回客户端。

JavaIDL开发过程

1)定义远程接口

使用IDL语言为远程对象定义接口。

【Billing.idl源代码】如下:

116//声明CORBAIDL模块

117moduleBillingApp{

118//声明接口

119interfaceBilling{

120stringsuccessBilling();

121onewayvoidshutdown();

122};

123};

2)编译远程接口

使用idlj编译器生成Java语言的stub和skeleton源文件。

idlj编译器缺省只生成客户端的binding代码。

如果同时需要客户端的bindings和服务器端的skeletons,必须加上-fall选项。

使用POA(PortableObjectAdaptor)的优点:

·允许编程者构建对象在不同ORB产品之间的可移植实现

·支持带持久化标识的对象

·对对象的透明活动提供支持

·允许单个servant支持多种对象同时标识

注意:

确定jdk/bin目录下有:

idlj、java、javac、orbd

命令:

idlj-fallBilling.idl

在当前目录下生成BillingApp目录,包含如下六个文件:

·Billing.java————>此接口包含IDL接口的Java版本。

它继承自org.omg.CORBA.Object,提供标准的CORBA对象功能。

·BillingHelper.java————>此类提供辅助功能,Helper类负责读写数据类型到CORBA流,以及插入和提取数据类型。

·BillingHolder.java————>ThisfinalclassholdsapublicinstancememberoftypeBilling.

·BillingOperations.java————>此接口包含successBilling()和shutdown()方法。

·BillingPOA.java————>此抽象类是基于流的服务器Skeleton,为服务器提供基本的CORBA功能。

它继承org.omg.PortableServer.Servant,实现了InvokeHandler接口和BillingOperations接口。

服务器类BillingServant继承BillingPOA。

·_BillingStub.java————>此类是客户端stub,为客户端提供CORBA功能。

它继承org.omg.CORBA.Object,提供标准CORBA对象功能。

还扩展了BillingOperations接口和org.omg.CORBA.portable.IDLEntity接口。

3)实现服务器端

一旦使用idlj编译器后,就可以使用它产生的Skeleton装配服务器应用程序了。

另外要实现远程接口方法,服务器代码应包含启动ORB和等待远程客户端调用的机制。

服务器端由两个类组成,一个是servant,另一个是Server。

servant是BillingImpl类,是BillingIDL接口的实现,每个Billing实例均由BillingImpl实例实现。

servant是BillingPOA的子类。

servant包含了IDL定义的所有方法,与通常的Java方法类似。

server类含服务器的main()方法,它:

·创建和初始化ORB实例

·获得根POA的引用并激活POAManager

·创建一个Servant实例(CORBA的Billing对象的实现)并通知ORB

·获得根命名上下文

·在命名上下文用“Billing”名注册新对象

·等待客户端调用此新对象

 

【BillingImpl.java源码】:

124importorg.omg.CORBA.ORB;

125importBillingApp.*;

126classBillingImplextendsBillingPOA{

127privateORBorb;

128publicvoidsetORB(ORBorb_val){

129this.orb=orb_val;

130}

131

132publicStringsuccessBilling(){

133return"\nBillingsuccess!

!

\n";

134}

135

136publicvoidshutdown(){

137orb.shutdown(false);

138}

139}

 

【BillingServer.java源码】:

140importorg.omg.CORBA.ORB;

141importorg.omg.CosNaming.NameComponent;

142importorg.omg.CosNaming.Nam

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1