Netty学习2—传统多线程服务端

1 代码

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 传统socket服务端-多线程
 */
public class OioServer2 {

	@SuppressWarnings("resource")
	public static void main(String[] args) throws Exception {
		ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
		// 创建socket服务,监听10101端口
		ServerSocket server = new ServerSocket(10101);
		System.out.println("服务器启动!");
		while (true) {
			// 获取一个套接字【阻塞】
			final Socket socket = server.accept();
			System.out.println("一个新客户端连接!");
			newCachedThreadPool.execute(new Runnable() {
				public void run() {
					// 异步业务处理。客户端1执行至此,不阻塞。server可以接收客户端2的连接
					handler(socket);
				}
			});
		}
	}

	/**
	 * 读取数据
	 */
	public static void handler(Socket socket) {
		try {
			byte[] bytes = new byte[1024];
			InputStream inputStream = socket.getInputStream();
			while (true) {
				// 读取数据【阻塞】
				int read = inputStream.read(bytes);
				if (read != -1) {
					System.out.println(new String(bytes, 0, read));
				} else {
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				System.out.println("socket关闭");
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

2 测试流程

原阻塞代码accept和read不变,但客户端1执行异步业务处理,不阻塞,server可以接收客户端2的连接。这种模式为一个客户端一个线程,会导致线程数过多。相当于一个饭店,经理在门口迎接客人(accept),相当于为每个客户(socket)安排一个服务员(线程)。

时间: 2024-09-14 23:35:53

Netty学习2—传统多线程服务端的相关文章

Netty学习1—传统单线程服务端

1 代码 import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class OioServer1 { @SuppressWarnings("resource") public static void main(String[] args) throws Exception { // 创建socket服务,监听

多线程-服务端监控多个客户端进程是否僵死,具体怎么实现?

问题描述 服务端监控多个客户端进程是否僵死,具体怎么实现? 有多个已上线的系统,部署在不同的服务器上,现在要开发一个监控系统,用来监控这些系统的运行状态,其中一项是进程是否僵死的监控,想通过socket心跳包的形式来实现.开发语言用的是java. 我的思路是: 给每个客户端设置一个唯一的AppNode,客户端每隔一段时间按照规定协议发送对应的 xml心跳包给服务端. 服务端接收各个客户端发送过来的心跳包,如果超过一定时间收不到某个客户端的心跳包,则记录一条异常信息到日志表里,然后发短信通知相关人

《Linux多线程服务端编程》总结备忘

§ 1 线程安全的对象生命期管理 对象的生与死不能由对象自身拥有的mutex(互斥器)来保护.如何避免对象析构时可能存在的race condition(竞态条件)是C++多线程编程面临的基本问题. 当一个对象被多个线程同时看到,那么对象的销毁时机就会模糊不清,可能出现多种的race condition(竞态条件): 即将析构一个对象时,从何而知此刻是否有别的对象正在执行该对象的成员函数? 如何保证在执行成员函数期间,对象不会被另一个线程所析构? 在调用某个对象的成员函数之前,如何得之这个对象还活

scoket tcp ip 报文-Java 的 Socket服务端客户端以tcp/ip协议发送接收报文

问题描述 Java 的 Socket服务端客户端以tcp/ip协议发送接收报文 代码谁有模板,比如给你一个login报文,logout报文!!急急急!!! 解决方案 Android Socket 编程(WIFI 和 ADB) 有了发送数据的功能,再发送文件还需要分包等协议. 解决方案二: 这个不知道是不是你要的答案, 解决方案三: http://blog.csdn.net/u013301192/article/details/46336719 解决方案四: 网页上的1楼回复应该对你有用,祝你好运

Netty学习5-Netty3.X服务端与客户端

Server1 import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.ch

Netty学习4—NIO服务端报错:远程主机强迫关闭了一个现有的连接

1 发现问题 NIO编程中服务端会出现报错 Exception in thread "main" java.io.IOException: 远程主机强迫关闭了一个现有的连接. at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25) at sun.nio.ch.IOUtil.readIntoNativeBuffer(I

《Netty 权威指南》—— 服务端序列图

声明:本文是<Netty 权威指南>的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文. 下面,我们对NIO服务端的主要创建过程进行讲解和说明,作为NIO的基础入门,我们将忽略掉一些在生产环境中部署所需要的一些特性和功能. 步骤一:打开ServerSocketChannel,用于监听客户端的连接,它是所有客户端连接的父管道,代码示例如下: 1 ServerSocketChannel acceptorSvr = ServerSocketChannel.open(); 步骤二:绑

性能优化总结(五):CSLA服务端如何使用多线程的解决方案

前篇说到了使用异步线程来实现数据的预加载,以提高系统性能. 这样的操作一般是在客户端执行,用以减少用户的等待时间.客户端发送多次异步请求,到达服务端后,如果服务端不支持多线程处理 操作,线性处理各个请求,必然导致客户端的异步请求变得没有意义. 大家肯定会说,谁会把服务端设计成单线程的啊,那不是明显的错误吗?是的!但是我们的系统使用了CSLA来作为实现分布式的框架, 而它的服务端程序却只能支持单线程--这个问题我们一直想解决,但是查过CSLA官方论坛,作者说由于GlobalContext和Clie

handler-android使用netty框架与PC服务端通信,接收到内容与发送内容不同

问题描述 android使用netty框架与PC服务端通信,接收到内容与发送内容不同 例如PC端发送888,android端却收到888后面还跟着一大串以前测试时候的内容, 部分代码如下,复制时括号有些错乱请勿在意: Bootstrap configureBootstrap(Bootstrap b, EventLoopGroup g) { b.group(g) .channel(NioSocketChannel.class) .remoteAddress(parements.getString(