设为首页 - 加入收藏 呼和浩特站长网 (http://www.0471zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 软件 数据 连续 正在
当前位置: 首页 > 广东第一论坛 > 外闻 > 正文

Socket技术,实现Http协议和游戏服务器协议(Java代码)

发布时间:2019-08-02 17:21 所属栏目:[外闻] 来源:今日头条
导读:在网络技术中,前后端通讯是一个难点,也是一个服务器程序员必须攻克的技术瓶颈。在两台计算机要实现信息交互,就需要一种技术来说,而两台计算机网卡来实现,无非就是两种技术UDP和TCP,其中,两种技术由于不同的特性,使用在不同的地方,在一些不要求高

在网络技术中,前后端通讯是一个难点,也是一个服务器程序员必须攻克的技术瓶颈。在两台计算机要实现信息交互,就需要一种技术来说,而两台计算机网卡来实现,无非就是两种技术UDP和TCP,其中,两种技术由于不同的特性,使用在不同的地方,在一些不要求高到达型传输领域(如:视频)使用UDP之外,90%的通讯都是通过TCP协议来传输,由于其可靠的安全达到性。

在程序员眼里,不用太想了解网卡是通过5层协议(或者说3层协议)怎么实现tcp通讯,在编程语言里socket就是tcp的代名词(可能有点不准备哈,但是我个人是这样认为的)。

我们先用一个简单的http协议中get案例来说,让大家更好理解游戏前后端的通讯协议指定。

Socket技术,实现Http协议和游戏服务器协议(Java代码)

以下为java代码:

  1. public?class?testHttpClient?{?
  2. public?static?void?main(String[]?arg){?
  3. Socket?socket=new?Socket();?
  4. try?{?
  5. socket.connect(new?InetSocketAddress("www.baidu.com",?80),?300);?
  6. OutputStream?o=socket.getOutputStream();?
  7. //http协议字符串?包括包头和包体,http采用"\r\n"做为分割,包头除了第一排之外,都是采用key:value方式来保存信息,一把服务器解锁提取?
  8. String?requestStr="GET?/?HTTP/1.1\r\n"?//第一排三个信息?分别是?1、请求方式(一把都会用两张get和post)?2、请求路径?3、采用http1.1协议?
  9. +"Host:?www.baidu.com\r\n"?//申明Host?
  10. //如果有其它hearder?字段信息可以防止在这里?
  11. +"\r\n"?//这里表示包头结束?
  12. +"\r\n";?//这里表示包体结束(由于这个get没有任何的结构体,如果需要向post那样传参?key1=value1&key2=value2,注意一定要在包头中增加"Content-Length:***"申明包体长度)?
  13. o.write(requestStr.getBytes());?
  14. o.flush();?
  15. BufferedReader?i=?new?BufferedReader(new?InputStreamReader?(socket.getInputStream()));?
  16. String?response="";?
  17. String?readOneStr=null;?
  18. while?((readOneStr=i.readLine())!=null){?
  19. response+=readOneStr+"\r\n";?
  20. }?
  21. System.out.println(response);?
  22. }catch?(IOException?ioe){?
  23. ioe.printStackTrace();?
  24. }?
  25. }?
socket技术,实现http协议和游戏服务器协议(java代码)

重点说明一下整个socket发送内容:http协议采用“\r\n”作为解码器分割符号,这个协议的二进制流包括包头和包体两个部分,请求协议具体内容:

包头:

  1. GET?/?HTTP/1.1\r\n?

使用空格分割成三个信息1、请求方式(一把都会用两张get和post) 2、请求路径 3、采用http1.1协议

  1. Host:?www.baidu.com\r\n?
  2. Content-Length:?***\r\n?
  3. Content-type:application/json\r\n?
  4. Cookie:************\r\n?

采用key:value的方式向服务器提交信息。Content-Length很重要,用于服务器读取包体的长度。

  1. \r\n?

再用“\r\n”来说明http包头信息结束,后面的字节流是包头内容

  1. \r\n?

这个说明请求包体结束

广东第一论坛这里基本上一个http协议请求协议结束,然后我们再来看看服务器http响应信息,也是包括包头和包体,包体有点变化的是第一个排“HTTP/1.1 200 OK\r\n” 也是三部分信息,返回协议,状态码和状态(http中200就是成功响应的意思),除此以外也是也是key:value值了。也是采用连续的两个“\r\n”来分割包头和包体字节流。包体就没有什么好说了,就是一些html、css、js代码,也就我们实际用户能看见的网页代码。

附图如下:

socket技术,实现http协议和游戏服务器协议(java代码)

看完了上面的http协议,我们就可以理解我接下来要说明我在所以游戏项目服务器设计的协议,我们游戏项目由于功能需要,都是采用tcp长连接,服务器需要定时向游戏前端发送不同指令和响应前端请求,所以需要一个严谨高效的通讯协议:

包头

  1. 包头开始识别码(int)4+?命令编号(shot)2?+?消息唯一编号(int)4?+内容长度(int)4?

包体

  1. 内容bytes[]?

用意说明:包头含有四个重要信息,第一个是包头开始识别码,用于服务器在循环读取socket管道信息时,发现新包开始。第二个是命令编号,就是前来请求服务器的动作指令(如:"1"用户登入验证,“2”为击杀命令),服务器会自动去调用响应模块代码。第三部分是这个包唯一码,用于防止前端重复提交包,造成服务器业务逻辑错误。第四部分,就是包体字节流长度。这样,每一个包头固定长度为14字节,而包体是可有可无的,取决于调用命令是否是需要前端传递参数。

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章