一网友在群中问,nginx支持socket转发吗?html
实话说,我没作过socket转发,可是我知道socket跟http同样都是经过tcp或者udp通讯的,我猜想啦一下nginx应该支持吧,而后又在网上查啦一下,网上说支持,也有支持的相关官方文档,且有理有据,因而我秉承不瞎扯,知之为知之的科学态度,我只对网友回啦两个字:“能够”,就不过多扯,此时群中也有网友为他解答问题啦,我就继续干个人活啦,干活,干活,干活,干活,没有过多的关注这个问题,没有过多的关注这个问题。linux
一小时后,半天后,半个月后,一年后 ,十年后 ... nginx
此去经年,我又来到群中:哇靠,这货竟还在执着于一样的问题,不停的问:“怎么弄,怎么弄?” !! 感受杨过的黯然销魂掌都练成啦,这个货为何尚未半点进展。难道他在参悟天书5卷,准备修仙成佛!c#
因而我就对此问题产生啦极大的兴趣,开始搞。从搞到搞到结束不过30分钟,不过30分钟,搞定,搞定。下面的篇幅我会详解整个过程。数组
说此段子你们勿喷我,可是我只想对群中的此类网友说:服务器
一、大家在问怎么作以前,官方文档有见到过吗,百度过相关文章吗?socket
二、百度文档后,有亲自操刀过吗?想游泳不下水行吗?tcp
三、本身操刀过程当中,一旦出错,大家有没有认真对待过错误信息?学习
四、在解锁一门招式的时候,有没有思考过相似的招式是怎么样的?或者你来设计这个招式会是什么样子的?思考?思考?关联?关联?测试
话有点过度,但愿能引发你的关注,若是与你不对症,绕过便可,勿喷。
实现服务端能够向客户端发送信息,客户端接受到信息后,显示出来。用c#控制台程序实现。
服务端监听本机ip与端口,服务端代码以下:
class Program { static Socket sck = null; static void Main(string[] args) { sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //监听本机ip IPAddress ip = IPAddress.Parse("172.18.8.196"); IPEndPoint endPoint = new IPEndPoint(ip, int.Parse("11911")); sck.Bind(endPoint); sck.Listen(10); Console.WriteLine("开启监听!"); Thread thread = new Thread(JtSocket); thread.IsBackground = true; thread.Start(); while (true) { var msg = Console.ReadLine().Trim(); if (msg != "") { byte[] buffer = System.Text.Encoding.ASCII.GetBytes(msg); //将要发送的数据,生成字节数组。 accSck.Send(buffer); Console.WriteLine("向客户端发送了:" + msg); } } } static Socket accSck = null; static void JtSocket() { while (true) { accSck = sck.Accept(); Console.WriteLine("连接成功!"); } } }
客户端链接ip为nginx代理服务器ip,客户端以下:
class Program { static Socket clientSocket = null; static Thread thread = null; static void Main(string[] args) { clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //这里联通nginx代理服务器地址ip IPAddress ip = IPAddress.Parse("172.18.8.252"); IPEndPoint endpoint = new IPEndPoint(ip, Convert.ToInt32("11911")); clientSocket.Connect(endpoint); thread = new Thread(ReceMsg); thread.IsBackground = true; thread.Start(); Console.WriteLine("123"); Console.ReadKey(); } static void ReceMsg() { while (true) { byte[] buffer = new byte[1024 * 1024 * 2]; clientSocket.Receive(buffer); string ReceiveMsg = System.Text.Encoding.UTF8.GetString(buffer).Substring(0,30); Console.WriteLine("接收到数据:" + ReceiveMsg); } } }
准备一台linux服务器。nginx官网:http://nginx.org/ 。在网上搜到大体用的是 ngx_stream_core_module 这个模块,这里你也能够关注一下官方文档中的其余模块都是作什么的,那么这有相关的启用配置说明,与示例配置。
第一句即是:该ngx_stream_core_module
模块是自1.9.0版本。此模块不是默认构建的,应使用配置参数启用 --with-stream
。
那好吧,咱们就安装nginx,搞这个的,安装应该都会吧。
[root@localhost /]# cd /usr/local/src [root@localhost src]# wget http://nginx.org/download/nginx-1.11.10.tar.gz
而后解压,解压完,根据文档提示须要使用这个参数--with-stream 来启用功能。
[root@localhost src]# ./configure --prefix=/usr/local/nginx --with-stream
而后,make,make install。
完成以后就是nginx配置配置文件啦,这个文档中有示例,可知与events模块平级,按照这作就好啦。
worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } stream{ upstream abc{ server 172.18.8.196:11911; } server{ listen 11911; proxy_pass abc; } }
ok,保存退出,重启nginx使配置生效便可。到这里全部的操做就都完成啦,让咱们拭目以待,看下结果吧。
启动服务端--->显示:开启监听--->启动客户端----> 客户端显示:链接成功---->服务端输入:abc----->服务端:点击回车---->客户端显示:abc。以下
服务端:客户端:
至此全部的都已整个过程都已结束,功能实现。
接下来是你们最喜欢的总结内容啦,内容有二,以下:
一、但愿能关注我其余的文章。
二、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,咱们一块儿学习探讨。