在受创过程中也能用街霸3.3 blockingg吗?

3746人阅读
JAVA基础(17)
转自:http://blog.csdn.net/wolfdrake/article/details/
SocketChannel类(用于阻塞或非阻塞式传输数据)
创建SocketChannel要使用SocketChannel类的静态工厂方法。
SocketChannel open():创建未连接的SocketChannel.
SocketChannel open(SocketAddress remote):创建连接到remote端口的SocketChannel.
新创建的SocketChannel为阻塞式的。
SelectableChannel configureBlocking(boolean block):将本SocketChannel设置为阻塞或非阻塞式并返回。
boolean isBlocking():返回本SocketChannel是否处于阻塞模式。
boolean connect(SocketAddress remote):连接到remote端口,是否是阻塞式连接取决于SocketChannel的设置。函数返回时,若已连接成功则返回true.
boolean finishConnect(SocketAddress);非阻塞connect返回false之后,可以调用这个函数完成连接,这个函数是否阻塞取决于SocketChannel的设置。函数返回时,若已连接成功则返回true.如果在调用函数之前就已经成功连接了,则函数什么都不做,直接返回true.
boolean isConnected():SocketChannel已连接时返回true.
boolean isConnectionPending():如果SocketChannel正在尝试连接,则返回true.
Socket socket():返回此SocketChannel的socket.
int read(ByteBuffer dst):将dst从position填充至limit,读到流末尾会停下来,非阻塞读时一旦没得可读也会停下来,是否阻塞取决于SocketChannel的设置。返回实际读到的字节数n,同时dst的position会加n.如果读之前socket的输入流就位于流末尾,则返回-1.如果函数调用时已经有一个线程正在从输入流里读,则本线程会等到它读完之后才开始读。
int write(ByteBuffer src):将src从position到limit的数据写入socket的输出流,非阻塞写时一旦底层的输出缓冲区满了就会停下来,是否阻塞取决于SocketChannel的设置。返回实际写入的字节数n,同时src的position会加n.如果函数调用时已经有一个线程正在往输出流里写,则本线程会等到它写完之后才开始写。
int validOps():返回SocketChannel可能产生的事件,即SelectionKey.OP_CONNECT|SelectionKey.OP_READ|SelectionKey.OP_WRITE(连接成功、可读、可写)。
SelectionKey register(Selector sel, int ops, Object att):要求侦听者sel帮忙侦听ops事件,返回这个契约。契约可以带一个附件att,若att为null则不带附件。
SelectionKey register(Selector sel, int ops):同上,相当于att等于null,不带附件。
SelectionKey keyFor(Selector sel):返回与侦听者sel定下的契约。如果尚未定下契约,则返回null.
boolean isRegistered():如果本SocketChannel现在正和某侦听者有契约,则返回true.尚未和任何侦听者定下过契约,或全部契约都已经解除,这两种情况都返回false.
void close():关闭本SocketChannel,并解除其一切契约。
boolean&isOpen():如果本SocketChannel处于打开状态,则返回true.
ServerSocketChannel类(用于阻塞或非阻塞式侦听连接)
创建ServerSocketChannel要使用ServerSocketChannel类的静态工厂方法。
ServerSocketChannel open():创建未绑定的ServerSocketChannel.
新创建的ServerSocketChannel是阻塞式的。
ServerSocket socket():返回此ServerSocketChannel的serversocket.
SocketChannel accept():侦听连接请求,阻塞模式下会一直等待直到出现请求,非阻塞模式下如果没有请求就直接返回null.
int validOps():返回ServerSocketChannel可能产生的事件,即SelectionKey.OP_ACCEPT(有连接请求)。
SelectableChannel configureBlocking(boolean block),boolean isBlocking(),SelectionKey register(Selector sel, int ops, Object att),SelectionKey register(Selector sel, int ops),SelectionKey keyFor(Selector sel),boolean isRegistered(),void close(),boolean&isOpen():参见SocketChannel类的相应函数。
Selector类(侦听器类)
1.&侦听者维护三个契约集合:all-keys,selected-keys,cancelled-keys.
侦听者创建时,三个集合都是空的。每缔结一个契约,就把它添加到all-keys中。调用select或selectNow函数时会把all-keys中发生了事件的契约也添加到selected-keys中。一个契约被解除时,会被添加到cancelled-keys中,下次调用select或selectNow函数时就会从全部三个集合中被删去。可见,后两个集合始终是all-keys的子集。
2. 创建侦听器要采用Selector类的静态工厂方法。
Selector open():创建侦听器。侦听器被创建后直接就是开着的。
boolean isOpen():如果侦听器是开着的,则返回true.
Set&SelectionKey& keys():返回all-keys契约集。不得对这个集合进行修改。
Set&SelectionKey& selectedKeys():返回selected-keys契约集。对这个集合只能删除契约,不得做其它修改。
Selector&wakeup():给侦听器吃“提神药”(见select函数)并返回。
int select(long timeout):将all-keys中发生了事件的契约也添加到selected-keys中,如果没有一个发生了事件,则阻塞等待,至多等待timeout毫秒,而且只要吃了提神药,就会立刻退出阻塞,并消耗掉全部的药效。最终返回添加契约的个数。如果timeout为0,则禁用超时。
可见,如果进程A阻塞于侦听器s的select函数,进程B调用s.wakeup(),则进程A立刻退出阻塞。
如果进程B调用一次或多次s.wakeup(),然后进程A调用s的select函数,则select会立即返回。接下来如果没有进程调用s.wakeup(),则再次select的话又会阻塞。
int select():同上,只不过禁用超时。
int selectNow():同样是将all-keys中发生了事件的契约也添加到selected-keys中,返回添加的个数,但是是非阻塞式的,没有就返回0.
void close():给侦听器吃提神药,解除其一切契约,然后将它关闭。
SelectionKey类(契约类)
Object attach(Object ob):设置契约的附件为ob。如果ob为null则表示不要附件。
Object attachment():返回本契约的附件。
SelectableChannel channel():返回缔结本契约的Channel.
Selector selector():返回缔结本契约的侦听者。
SelectionKey interestOps(int ops):设置侦听者所要侦听的事件,并返回本契约。SelectionKey.OP_READ,SelectionKey.OP_WRITE,SelectionKey.OP_CONNECT,SelectionKey.OP_ACCEPT,分别表示Channel的输入流有数据可读、输出流有空位可写、连接成功、有连接请求事件。多个事件用位或(|)来组合。
int interestOps():返回侦听者所要侦听的事件。
int readyOps():返回已经发生的事件。
boolean isReadable/isWritable/isConnectable/isAcceptable():如果Channel的可读/可写/连接成功/有连接请求事件已发生,则返回true.
void cancel():解除本契约。
isValid():返回本契约当前是否有效(尚未被解除)。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:66343次
排名:千里之外
原创:18篇
转载:46篇
(2)(1)(1)(1)(2)(2)(1)(5)(1)(1)(3)(1)(4)(2)(1)(9)(1)(4)(2)(1)(2)(1)(9)(1)(1)(5)Axis2开发WebService客户端 的3种方式 - Just Do It - ITeye技术网站
博客分类:
第一RPC方式,不生成客户端代码
第二,document方式,不生成客户端代码
第三,用wsdl2java工具,生成客户端方式调用
package samples.quickstart.
import javax.xml.namespace.QN
import org.apache.axiom.om.OMAbstractF
import org.apache.axiom.om.OME
import org.apache.axiom.om.OMF
import org.apache.axiom.om.OMN
import org.apache.axis2.AxisF
import org.apache.axis2.addressing.EndpointR
import org.apache.axis2.client.O
import org.apache.axis2.client.ServiceC
import org.apache.axis2.rpc.client.RPCServiceC
import samples.quickstart.StockQuoteServiceS
import samples.quickstart.xsd.GetP
import samples.quickstart.xsd.GetPriceR
public class StockQuoteClient {
* 方法一:
* 应用rpc的方式调用 这种方式就等于远程调用,
* 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
* 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
第一个参数的类型是QName对象,表示要调用的方法名;
第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。
如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法
该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
也就是 &wsdl:definitions&元素的targetNamespace属性值。
public static void testRPCClient() {
// axis1 服务端
// String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
// axis2 服务端
String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService?wsdl";
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
Options options = serviceClient.getOptions();
//确定目标服务地址
options.setTo(targetEPR);
//确定调用方法
options.setAction("urn:getPrice");
* 指定要调用的getPrice方法及WSDL文件的命名空间
* 如果 webservice 服务端由axis2编写
* 命名空间 不一致导致的问题
* org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0
QName qname = new QName("http://quickstart.samples/xsd", "getPrice");
// 指定getPrice方法的参数值
Object[] parameters = new Object[] { "13" };
// 指定getPrice方法返回值的数据类型的Class对象
Class[] returnTypes = new Class[] { double.class };
// 调用方法一 传递参数,调用服务,获取服务返回结果集
OMElement element = serviceClient.invokeBlocking(qname, parameters);
//值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
//我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
String result = element.getFirstElement().getText();
System.out.println(result);
// 调用方法二 getPrice方法并输出该方法的返回值
Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
// String r = (String) response[0];
Double r = (Double) response[0];
System.out.println(r);
} catch (AxisFault e) {
e.printStackTrace();
* 方法二: 应用document方式调用
* 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合
public static void testDocument() {
// String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
Options options = new Options();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
options.setTo(targetEPR);
// options.setAction("urn:getPrice");
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMFactory fac = OMAbstractFactory.getOMFactory();
String tns = "http://quickstart.samples/";
// 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的
OMNamespace omNs = fac.createOMNamespace(tns, "");
OMElement method = fac.createOMElement("getPrice", omNs);
OMElement symbol = fac.createOMElement("symbol", omNs);
// symbol.setText("1");
symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));
method.addChild(symbol);
method.build();
OMElement result = sender.sendReceive(method);
System.out.println(result);
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
* 为SOAP Header构造验证信息,
* 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息
* @param serviceClient
* @param tns 命名空间
* @param user
* @param passwrod
public void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(tns, "nsl");
OMElement header = fac.createOMElement("AuthenticationToken", omNs);
OMElement ome_user = fac.createOMElement("Username", omNs);
OMElement ome_pass = fac.createOMElement("Password", omNs);
ome_user.setText(user);
ome_pass.setText(passwrod);
header.addChild(ome_user);
header.addChild(ome_pass);
serviceClient.addHeader(header);
* 方法三:利用axis2插件生成客户端方式调用
public static void testCodeClient() {
String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
StockQuoteServiceStub stub = new StockQuoteServiceStub(url);
GetPrice request = new GetPrice();
request.setSymbol("ABCD");
GetPriceResponse response = stub.getPrice(request);
System.out.println(response.get_return());
} catch (org.apache.axis2.AxisFault e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
public static void main(String[] args) {
StockQuoteClient.testRPCClient();
// StockQuoteClient.testDocument();
// StockQuoteClient.testCodeClient();
wsdl2java 用于根据WSDL生成相应的服务端和客户端代码的生成工具。命令行格式为:WSDL2Java [options] -uri &url or path& : A url or path to a WSDL
wsdl2java -uri http://localhost:8080/cxfService_0617/services/Hellows?wsdl -s -o build\client
其中常用的options具体如下:-o &path& : 指定生成代码的输出路径-a : 生成异步模式的代码-s : 生成同步模式的代码-p &pkg& : 指定代码的package名称-l &languange& : 使用的语言(Java/C) 默认是java-t : 为代码生成测试用例-ss : 生成服务端代码 默认不生成-sd : 生成服务描述文件 services.xml,仅与-ss一同使用-d &databinding& : 指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri-g : 生成服务端和客户端的代码-pn &port_name& : 当WSDL中有多个port时,指定其中一个port-sn &serv_name& : 选择WSDL中的一个service-u : 展开data-binding的类-r &path& : 为代码生成指定一个repository-ssi : 为服务端实现代码生成接口类-S : 为生成的源码指定存储路径-R : 为生成的resources指定存储路径–noBuildXML : 输出中不生成build.xml文件–noWSDL : 在resources目录中不生成WSDL文件–noMessageReceiver : 不生成MessageReceiver类
浏览 53094
harveyzeng
浏览: 207194 次
来自: 成都
不能匹配这个:http://harveyzeng.iteye. ...
老兄,请问第二种方式怎么向服务器端传递参数? 还有144行到1 ...
比较给力,收下了

我要回帖

更多关于 街霸3.3 blocking 的文章

 

随机推荐