socket 面试最终题一般都是让你写一个简单的客户端和服务端通信的例子,本文就带大家一起来写这个 demo。
可以使用 socket 和 rvicesocket 以及其它 api;
写一个客户端和服务端之间 tcp 通信的例子;
服务端处理任务需要异步处理;
因为服务端处理能力很弱,只能同时处理 5 个请求,当第六个请求到达服务器时,需要服务器返回明确的错误信息:服务器太忙了,请稍后重试~。
需求比较简单,唯一复杂的地方在于第四点,我们需网站推广的方式要对客户端的请求量进行控制,首先我们需要确认的是,我们是无法控制客户端发送的请求数的,所以我们只能从服务端进行改造,比如从服务端进行限流高一化学必修一第一章。
有的同学可能很快想到,我们应该使用 rversocket 的 backlog 的属性,把其设置成 5,但我们在上一章中说到 backlog 并不能准确代表限制的客户端连接数,而且我们还要求服务端返回具体的错误信息,即使 backlog 生效,也只会返回固定的错误信息,不是我们定制的错误信息。
我们好好想想,线程池似乎可以做这个事情,我们可以把线程池的 coresize 和 maxsize 都设置成回到唐朝当皇帝txt下载 4,把队列大小设置成 1,这样服务端每次收到请求后,会先判断一下线程池中的队列有没有数据,如果有的话,说明当前服务器已经马上就要处理第五个请求了,当前请求就是第六个请求,应该被拒绝。
正好线程池的加入也可以满足第三点,服务端的任务可以异步执行。
客户端的代码跑步机的十大品牌比较简单,直接向服务器请求数据即可,代码如下:
客户端代码中我们也用到了线程池,主要是为了并发模拟客户端一次性发送 6 个请求,按照预期服务端在处理第六个请求的时候,会返回特定的错误信息给客户端。
以上代码主要方法是 nd 方法,主要处理像服务端发送数据,并处理服务端的响应。
服务端的逻辑分成两个部分,第一部分是控制客户端的请求个数,当超过服务端的能力时,拒绝新的请求,当服务端能力可响应时,放入新的请求,第二部分是服务端任务的执行逻辑。
我们使用 collectpoll.getqueue().size() >= 1 来判断目前服务端是否已经到达处理的极限了,如果队列中有一个任务正在排队,说明当前服务端已经超负荷运行了,新的请求应该拒绝掉,如果队列中没有数据,说明服务端还可以接受新的请求。
以上代码注释详细,就不累赘说了。
服务端的处理逻辑比较简单,主要步骤是:从客户端的 socket 中读取输入,进行处理,把响应返回给客户端。
我们使用线程沉睡 2 秒来模拟服务端的处理逻辑,代码如下:
测试的nz是哪个国家时候,我们必须先启动服务端,然后再启动客户端,首先我们启动服务端,打印日志如下:
接着我们启动客户端,打印日志如下:
我们最后看一下服务端的运行日志:
从以上运行结果中,我们可以看出得出的结果是符合我们预期的,服务端在请求高峰时,能够并发处理5个请求,其余请求可以用正确的提示进行拒绝。
所以代码集中在 socketclient、socketrvicestart、socketrvice 中,启动的顺序为先启动 socketrvicestart,后运行 socketclient,感兴趣的同学可以自己 debug 下,加深印象。
以上就是socket结合线程池实现客户端和服务端通信实战demo的详细内容,更多关于socket线程池客户端与服务端通信demo的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-06 02:38:45,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/97e17081774632ecec127977f7b04fe5.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Socket结合线程池使用实现客户端和服务端通信demo.doc
本文 PDF 下载地址:Socket结合线程池使用实现客户端和服务端通信demo.pdf
留言与评论(共有 0 条评论) |