help on udp server error:java.net.SocketException: Operation not permitted

hunter hanyh2004 at gmail.com
Sat Sep 17 01:15:49 EDT 2011


I write a udp server with netty.It accepts the heartbeat packet from clients
and update the  status of clients stored in redis.

Now the ratio is about 1000 request/s.but it occausly reported excepion:
java.net.SocketException: Operation not permitted
	at sun.nio.ch.DatagramChannelImpl.send0(Native Method)
	at sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(Unknown Source)
	at sun.nio.ch.DatagramChannelImpl.send(Unknown Source)
	at sun.nio.ch.DatagramChannelImpl.send(Unknown Source)
	at
org.jboss.netty.channel.socket.nio.SocketSendBufferPool$PooledSendBuffer.transferTo(SocketSendBufferPool.java:243)
	at
org.jboss.netty.channel.socket.nio.NioDatagramWorker.write0(NioDatagramWorker.java:545)
	at
org.jboss.netty.channel.socket.nio.NioDatagramWorker.writeFromUserCode(NioDatagramWorker.java:462)
	at
org.jboss.netty.channel.socket.nio.NioDatagramPipelineSink.eventSunk(NioDatagramPipelineSink.java:112)
	at org.jboss.netty.channel.Channels.write(Channels.java:611)
	at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:263)
	at
org.jboss.netty.channel.socket.nio.NioDatagramChannel.write(NioDatagramChannel.java:236)
	at
cn.doyo.net.server.online.HearbeatServerHandler.messageReceived(HearbeatServerHandler.java:54)
	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:302)
	at
org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:76)
	at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
	at
org.jboss.netty.channel.socket.nio.NioDatagramWorker.read(NioDatagramWorker.java:419)
	at
org.jboss.netty.channel.socket.nio.NioDatagramWorker.processSelectedKeys(NioDatagramWorker.java:348)
	at
org.jboss.netty.channel.socket.nio.NioDatagramWorker.run(NioDatagramWorker.java:261)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)



the handler source :
public class HearbeatServerHandler extends SimpleChannelHandler {

       ...........
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
		if (e.getMessage() instanceof HearbeatFrame) {
			HeartbeatServer.udpCounter.getAndAdd(1); //counter
			HearbeatFrame frame = (HearbeatFrame) e.getMessage();
			switch (frame.getCmd()) { 
			case 1:
				ChannelBuffer buf = ChannelBuffers.buffer(4);
				int ts = (int) (System.currentTimeMillis() / 1000);
				buf.writeInt(ts); //here is exception occurred place.!


				e.getChannel().write(buf, e.getRemoteAddress()); 
				break;
			case 2:
				if (frame.isValidate()) { 
					InetSocketAddress in = (InetSocketAddress) e
							.getRemoteAddress();
					String ip = in.getAddress().getHostAddress();
					frame.setIp(ip);
					StatusUpdateWorker worker = new StatusUpdateWorker(frame);  //update
status
					pool.execute(worker);
				} else {
					logger.log(Level.WARNING, "CMD:2,Frame is error");
				}
				break;
			case 3:
				if (frame.isValidate()) { // delete client

					Jedis redis = RedisUtil.getRedis();
					redis.srem("o-u", frame.getUid() + "");
					redis.srem("o-c", frame.getGuid());
					logger.info("Remove Uid from Online Set.Uid:"
							+ frame.getGuid());
					RedisUtil.returnRedis(redis);
				} else {
					logger.log(Level.WARNING, "CMD:3,Frame is error");
				}
				break;
			default:
				;
			}
		} else {
			logger.log(Level.WARNING, "Unexpected udp packet");
		}
	}


--
View this message in context: http://netty-forums-and-mailing-lists.685743.n2.nabble.com/help-on-udp-server-error-java-net-SocketException-Operation-not-permitted-tp6803207p6803207.html
Sent from the Netty User Group mailing list archive at Nabble.com.


More information about the netty-users mailing list