J2MESocket超时处理

在开发J2ME的时候需要用到Socket 所以研究了下超时的处理

 

在J2ME中基于UDP协议编程一文中介绍了如何使用Datagram和DatagramConnection来开发应用程序,本文将主要讲述在 MIDP2.0中使用ServerSocketConnection和SocketConnection来开发联网应用程序。TCP协议是可以保证传输的 质量的,这也是他和UDP的一大区别。由于以上谈到的四个类都属于GCF,他们在程序编写方面也非常相似,通常我们在Server端的某个端口监听,当客 户端连接服务器的时候,则可以得到一个SocketConnection的实例。通过两端的SocketConnection则可以实现C/S结构的通信 了。

首先看一下,ServerSocketConnection类,它的一个非常重要的方法就是acceptAndOpen()方法,这个方法返回一个SocketConnection实例,从而使得客户端和服务器端可以通过socket通信了。典型的代码如下:

// Create the server listening socket for port 1234

ServerSocketConnection scn = (ServerSocketConnection)

Connector.open("socket://:1234");

// Wait for a connection.

SocketConnection sc = (SocketConnection) scn.acceptAndOpen();

// Set application specific hints on the socket.

sc.setSocketOption(DELAY, 0);

sc.setSocketOption(LINGER, 0);

sc.setSocketOption(KEEPALIVE, 0);

sc.setSocketOption(RCVBUF, 128);

sc.setSocketOption(SNDBUF, 128);

// Get the input stream of the connection.

DataInputStream is = sc.openDataInputStream();

// Get the output stream of the connection.

DataOutputStream os = sc.openDataOutputStream();

// Read the input data.

String result = is.readUTF();

// Echo the data back to the sender.

os.writeUTF(result);

// Close everything.

is.close();

os.close();

sc.close();

scn.close();

..

SocketConnection的使用也是非常简单,通过Connector的open方法我们可以得到一个SocketConnection的实例。



SocketConnection sc = (SocketConnection)

Connector.open("socket://host.com:79");

sc.setSocketOption(SocketConnection.LINGER, 5);

InputStream is = sc.openInputStream();

OutputStream os = sc.openOutputStream();

os.write("/r/n".getBytes());

int ch = 0;

while(ch != -1) {

 ch = is.read();

}

is.close();

os.close();

sc.close();

其实我们在用socket编写程序的时候无非遵循这样的一种规则:服务器端建立监听端口等待连接,客户端通过open()方法与服务器端建立连接,两端通过建立的socket传输数据,关闭连接。

下图是我在运行WTK中NetworkDemo的时候的截图!代码也一并发表出来。

J2ME中使用Socket开发联网程序(1)(图一)

在 J2ME中基于UDP协议编程一文中介绍了如何使用Datagram和DatagramConnection来开发应用程序,本文将主要讲述在 MIDP2.0中使用ServerSocketConnection和SocketConnection来开发联网应用程序。TCP协议是可以保证传输的 质量的,这也是他和UDP的一大区别。由于以上谈到的四个类都属于GCF,他们在程序编写方面也非常相似,通常我们在Server端的某个端口监听,当客 户端连接服务器的时候,则可以得到一个SocketConnection的实例。通过两端的SocketConnection则可以实现C/S结构的通信 了。

首先看一下,ServerSocketConnection类,它的一个非常重要的方法就是acceptAndOpen()方法,这个方法返回一个SocketConnection实例,从而使得客户端和服务器端可以通过socket通信了。典型的代码如下:

// Create the server listening socket for port 1234

ServerSocketConnection scn = (ServerSocketConnection)

Connector.open("socket://:1234");

// Wait for a connection.

SocketConnection sc = (SocketConnection) scn.acceptAndOpen();

// Set application specific hints on the socket.

sc.setSocketOption(DELAY, 0);

sc.setSocketOption(LINGER, 0);

sc.setSocketOption(KEEPALIVE, 0);

sc.setSocketOption(RCVBUF, 128);

sc.setSocketOption(SNDBUF, 128);

// Get the input stream of the connection.

DataInputStream is = sc.openDataInputStream();

// Get the output stream of the connection.

DataOutputStream os = sc.openDataOutputStream();

// Read the input data.

String result = is.readUTF();

// Echo the data back to the sender.

os.writeUTF(result);

// Close everything.

is.close();

os.close();

sc.close();

scn.close();

..

SocketConnection的使用也是非常简单,通过Connector的open方法我们可以得到一个SocketConnection的实例。



SocketConnection sc = (SocketConnection)

Connector.open("socket://host.com:79");

sc.setSocketOption(SocketConnection.LINGER, 5);

InputStream is = sc.openInputStream();

OutputStream os = sc.openOutputStream();

os.write("/r/n".getBytes());

int ch = 0;

while(ch != -1) {

 ch = is.read();

}

is.close();

os.close();

sc.close();

其实我们在用socket编写程序的时候无非遵循这样的一种规则:服务器端建立监听端口等待连接,客户端通过open()方法与服务器端建立连接,两端通过建立的socket传输数据,关闭连接。

 

 

设置超时的时间

sc.setSocketOption(SocketConnection.LINGER, 5);

 

  • setSocketOption(<属性名>, int);

    <属性名>:

    • SocketConnection.DELAY:开启Nagle算法?(0/1)

    • SocketConnection.LINGER:服务器悬挂等待时间

    • SocketConnection.KEEPALIVE:

    • SocketConnection.RCVBUF:接收缓冲

    • SocketConnection.SNDBUF:发送缓冲

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: CompletableFuture超时处理是指在异步任务执行过程中,如果任务执行时间超过了预设的时间,就会抛出TimeoutException异常。为了避免任务执行时间过长导致程序出现问题,我们可以使用CompletableFuture的超时处理机制来解决这个问题。 在CompletableFuture中,我们可以使用以下方法来设置超时时间: 1. orTimeout(long timeout, TimeUnit unit):设置超时时间,并在超时后抛出TimeoutException异常。 2. completeOnTimeout(T value, long timeout, TimeUnit unit):设置超时时间,并在超时后返回默认值。 通过使用这些方法,我们可以在异步任务执行过程中设置超时时间,避免任务执行时间过长导致程序出现问题。 ### 回答2: CompletableFuture是Java8中新增的一个异步编程工具,它可以帮助我们更加方便地实现异步编程。在异步编程中,时常会遇到需要等待一段时间后才能获取结果的情况,而等待时间如果过长会导致程序运行变慢或者出现性能瓶颈。因此,CompletableFuture提供了超时处理机制,来解决这个问题。 CompletableFuture的超时处理主要是通过对future对象的get操作设置等待时间来实现的。在CompletableFuture中,我们可以使用3种方式来实现超时处理。 1. 使用completeOnTimeout方法 使用completeOnTimeout方法可以设置一个超时时间,等待时间超过这个时间,就会触发超时处理。具体方法如下: CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { //执行一些异步操作 //返回结果 }); //设置超时时间为1s future.completeOnTimeout("超时了", 1, TimeUnit.SECONDS); //获取异步操作结果 String result = future.get(); 当等待时间超过超时时间后,get操作就会返回"超时了"字符串,从而触发超时处理。 2. 使用orTimeout方法 使用orTimeout方法也可实现超时处理。具体方法如下: CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { //执行一些异步操作 //返回结果 }); //设置超时时间为1s future.orTimeout(1, TimeUnit.SECONDS); //获取异步操作结果 String result = future.get(); 当等待时间超过超时时间后,get操作就会抛出TimeoutException异常,从而触发超时处理。 3. 使用completeOnTimeout方法和exceptionally方法结合 有时候,我们需要在超时处理时返回一个异常信息,此时可以使用completeOnTimeout方法和exceptionally方法结合来实现。具体方法如下: CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { //执行一些异步操作 //返回结果 }); //设置超时时间为1s future.completeOnTimeout("超时了", 1, TimeUnit.SECONDS); //如果发生异常,则返回异常信息 future.exceptionally(throwable -> "发生异常" + throwable.getMessage()); //获取异步操作结果 String result = future.get(); 当等待时间超过超时时间后,get操作就会返回"超时了"字符串,如果发生异常,就会返回"发生异常xxxxx"的异常信息。 总之,CompletableFuture的超时处理机制可以帮助我们更好地控制异步编程中的等待时间,从而提高程序性能。 ### 回答3: CompletableFuture是Java 8中的一个并发处理类,它提供了一种简便的方法来实现异步操作和流水线处理。CompletableFuture较往常的Future类更强大和灵活,因为它允许开发人员在完成之前对结果进行处理。 CompletableFuture提供了处理超时的方法。在某些情况下,异步操作可能需要在一定时间内完成,如果超时,则需要采取一些操作。CompletableFuture中的或方法就提供了类似于超时操作的功能。 或方法接收两个参数,一个是CompletableFuture实例,另一个是时间限制。如果CompletableFuture在指定的时间之内完成,或方法将返回它的结果。如果CompletableFuture未能在规定的时间内完成,则或方法将返回一个新的CompletableFuture实例。 以下是一个简单的示例: ```java CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { // 执行一些异步操作 return "操作结果"; }); // 设置超时时间为3秒 CompletableFuture<String> result = future.orTimeout(3, TimeUnit.SECONDS); String value = ""; try { value = result.get(); } catch (InterruptedException | ExecutionException e) { // 处理异常 } ``` 在上面的示例中,future是一个异步操作,orTimeout方法将设置超时时间为3秒,并返回一个新的CompletableFuture实例。如果异步操作未能在规定时间内完成,超时的CompletableFuture实例将被返回。 需要注意的是,orTimeout方法将在传入的CompletableFuture实例之上设置超时操作。也就是说,如果异步操作已经完成,orTimeout方法不会将时间限制应用于它,它只会继续返回完成的CompletableFuture实例。 另外,还有一个类似的方法是completeOnTimeout,它允许开发人员在超时时提供一个默认值(也就是当异步操作未能在规定时间内完成时返回的结果)。 总之,使用CompletableFuture的超时处理方法可以很方便地控制异步操作的时间范围,保证程序的稳定性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值