当前位置: 首页 > news >正文

电子商务网站建立广西医科大学网站建设

电子商务网站建立,广西医科大学网站建设,自动引流推广软件,做网站系统开发的意义1.net包的强大功能 不可否认#xff0c;go在网络服务开发有强大的优势。net库是一个功能强大的网络编程库#xff0c;它提供了构建TCP、UDP和HTTP服务器和客户端所需的所有基础工具。 例如#xff0c;搭建tcp服务器#xff0c;只需要几行代码。 func main() {listener, …1.net包的强大功能 不可否认go在网络服务开发有强大的优势。net库是一个功能强大的网络编程库它提供了构建TCP、UDP和HTTP服务器和客户端所需的所有基础工具。 例如搭建tcp服务器只需要几行代码。 func main() {listener, err : net.Listen(tcp, :8080)if err ! nil {log.Fatal(err)}for {conn, err : listener.Accept()if err ! nil {log.Print(err)continue}go handleConnection(conn)} }func handleConnection(conn net.Conn) {defer conn.Close()// 处理连接... } 搭建udp服务器 func main() {addr, err : net.ResolveUDPAddr(udp, :8080)if err ! nil {log.Fatal(err)}conn, err : net.ListenUDP(udp, addr)if err ! nil {log.Fatal(err)}defer conn.Close()buffer : make([]byte, 1024)for {n, remoteAddr, err : conn.ReadFromUDP(buffer)if err ! nil {log.Print(err)continue}// 处理数据...} } 搭建http服务器使用net/http子模块 func main() {http.HandleFunc(/, handler)log.Fatal(http.ListenAndServe(:8080, nil)) }func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, Hello, World!) } 2. java搭建tcp服务器 2.1.使用原生API的挑战 虽然利用java原生的NIOAPI也可以进行socket开发但存在诸如以下的缺陷与挑战 编程复杂性NIO的编程模型相对复杂需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等类库和API。开发者需要处理多路复用、事件循环、非阻塞读写等操作这增加了编程的难度和代码的复杂性。可靠性和稳定性问题原生NIO需要开发者自己处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包读写等情况如果没有足够的NIO编程经验积累一个NIO框架的稳定往往需要半年甚至更长的时间。线程管理NIO编程涉及到Reactor模式必须对多线程和网络编程非常熟悉才能编写出高质量的NIO程序。线程的管理和调度也是一个挑战尤其是在高并发场景下。JDK NIO的BUG例如臭名昭著的Epoll Bug它会导致Selector空轮询最终导致CPU 100%。虽然在JDK 1.7中有所改善但并未完全解决。资源消耗使用内存占用较高使用直接内存缓冲区可能导致较高的内存消耗尤其是在处理大量数据时。 正因如此minanetty这类高效的NIO框架应运而生。然而nettymina的学习成本也不小。 2.2.netty编解码示例 下面看下netty如何处理tcp网络连接主要是黏包/拆包逻辑。  解码器 protected void decode(ChannelHandlerContext ctx, ByteBuf in, ListObject out) throws Exception {if (in.readableBytes() DefaultMessageHeader.SIZE) {return;}in.markReaderIndex();// ----------------protocol pattern-------------------------// header(12bytes) | body// msgLength 12len(body) | body// msgLength | index | cmd | bodybyte[] header new byte[DefaultMessageHeader.SIZE];in.readBytes(header);DefaultMessageHeader headerMeta new DefaultMessageHeader();headerMeta.read(header);int length headerMeta.getMsgLength();if (length maxProtocolBytes) {logger.error(message data frame [{}] too large, close session now, length);ctx.close();return;}int bodySize length - DefaultMessageHeader.SIZE;if (in.readableBytes() bodySize) {in.resetReaderIndex();return;}int cmd headerMeta.getCmd();byte[] body new byte[bodySize];in.readBytes(body);Class? msgClazz messageFactory.getMessage(cmd);Object message messageCodec.decode(msgClazz, body);out.add(new RequestDataFrame(headerMeta, message));} 编码器 Overrideprotected void encode(ChannelHandlerContext ctx, Object message, ByteBuf out) throws Exception {assert message instanceof SocketDataFrame;SocketDataFrame dataFrame (SocketDataFrame) message;// ----------------protocol pattern-------------------------// header(12bytes) | body// msgLength 12len(body) | body// msgLength | index | cmd | bodyint cmd messageFactory.getMessageId(dataFrame.getMessage().getClass());try {byte[] body messageCodec.encode(dataFrame.getMessage());// 写入包头//消息内容长度int msgLength body.length DefaultMessageHeader.SIZE;out.writeInt(msgLength);out.writeInt(dataFrame.getIndex());// 写入cmd类型out.writeInt(cmd);// 写入包体out.writeBytes(body);} catch (Exception e) {logger.error(wrote message {} failed, cmd, e);}} 2.3.创建socket服务器 private class ChildChannelHandler extends ChannelInitializerSocketChannel {Overrideprotected void initChannel(SocketChannel arg0) throws Exception {ChannelPipeline pipeline arg0.pipeline();if (protocolDecoder ! null) {pipeline.addLast(protocolDecoder,protocolDecoder);} else {pipeline.addLast(protocolDecoder, new DefaultProtocolDecoder(messageFactory, messageCodec, maxProtocolBytes));}if (protocolEncoder ! null) {pipeline.addLast(protocolEncoder, protocolEncoder);} else {pipeline.addLast(protocolEncoder, new DefaultProtocolEncoder(messageFactory, messageCodec));}if (idleTime 0) {// 客户端XXX没收发包便会触发UserEventTriggered事件到IdleEventHandlerpipeline.addLast(new IdleStateHandler(0, 0, idleTime,TimeUnit.MILLISECONDS));pipeline.addLast(serverIdleHandler, serverIdleHandler);}pipeline.addLast(socketIoHandler, channelIoHandler);}} 总体来说还是挺复杂的需要对netty的api有一定的了解。 3. go搭建tcp服务器 3.1私有协议栈编解码 Tcp传输层在网络传递的数据是一堆字节码类似于水管的流水没有边界。由于传输层不是应用层没有公有协议也就没有统一的通信格式都是应用程序内部定义的只要服务器与客户端遵守同样的规则即可因此这种协议也叫“私有协议”。 import (byteserrors )// Protocol constants. const (HeadLength 8MaxPacketSize 64 * 1024 )type MessageHeader struct {Cmd int //消息类型Size int //消息长度 }// ErrPacketSizeExceed is the error used for encode/decode. var ErrPacketSizeExceed errors.New(Protocol: packet size exceed)type Protocol struct {buf *bytes.Buffer }// NewDecoder returns a new decoder that used for decode network bytes slice. func NewDecoder() *Protocol {return Protocol{buf: bytes.NewBuffer(nil),} }func (c *Protocol) readHeader() (*MessageHeader, error) {buff : c.buf.Next(HeadLength)id : bytesToInt(buff[0:4])size : bytesToInt(buff[4:HeadLength])// packet length limitationif size MaxPacketSize {return nil, ErrPacketSizeExceed}return MessageHeader{Cmd: id, Size: size}, nil }func (c *Protocol) Decode(data []byte) ([]*Packet, error) {c.buf.Write(data)// check lengthif c.buf.Len() HeadLength {return nil, errors.New(length too small)}var packets []*Packetfor c.buf.Len() 0 {header, err : c.readHeader()if err ! nil {return packets, err}if header.Size c.buf.Len() {body : c.buf.Next(header.Size)p : Packet{Header: *header, Data: body}packets append(packets, p)} else {break}}return packets, nil }func (c *Protocol) Encode(cmd int, data []byte) ([]byte, error) {// p : Packet{Cmd: cmd, Length: len(data)}bodyLen : len(data)buf : make([]byte, HeadLengthbodyLen)copy(buf[0:4], intToBytes(cmd))copy(buf[4:HeadLength], intToBytes(bodyLen))copy(buf[HeadLength:], data)return buf, nil }// Decode packet data length byte to int(Big end) func bytesToInt(b []byte) int {result : 0for _, v : range b {result result8 int(v)}return result }func intToBytes(n int) []byte {buf : make([]byte, 4)buf[0] byte((n 24) 0xFF)buf[1] byte((n 16) 0xFF)buf[2] byte((n 8) 0xFF)buf[3] byte(n 0xFF)return buf } 大致逻辑 每次链接建立时将缓存区的二进制流转移到session自己的缓存区Protocol#buf字段在循环内部每次读取包头8个字节如果剩余的字节树超过包体的长度则接取对应的长度反序列化为一个完整的消息包再转交给下一步的消息解码器。这个流程只依赖go的内部api完全无需引入其他依赖非常漂亮。  3.2.tcp服务器 package networkimport (errorsfmtgithub.com/gorilla/websocketlognetnet/httpreflect )type Node struct {Name string // 服务器名称option Options }func (n *Node) Startup(opts ...Option) error {// 设置参数opt : Options{}for _, option : range opts {option(opt)}n.option optif n.option.ServiceAddr {return errors.New(service address cannot be empty in master node)}go func() {n.listenTcpConn()}()return nil }// Enable current server accept connection func (n *Node) listenTcpConn() {listener, err : net.Listen(tcp, n.option.ServiceAddr)if err ! nil {log.Fatal(err.Error())}defer listener.Close()for {conn, err : listener.Accept()if err ! nil {log.Println(err.Error())continue}go handleClient(n, conn)} }// 处理客户端连接包括socket,websocket func handleClient(node *Node, conn net.Conn) {defer conn.Close() // 确保在函数结束时关闭连接ioSession : NewSession(conn, node.option.MessageCodec)// 异步向客户端写数据go ioSession.Write()// read loopbuf : make([]byte, 2048)for {n, err : conn.Read(buf)if err ! nil {log.Printf(fmt.Sprintf(Read message error: %s, session will be closed immediately, err.Error()))return}if n 0 {continue}packets, err : ioSession.ProtocolCodec.Decode(buf[:n])if err ! nil {log.Println(err.Error())return}// process packets decodedfor _, p : range packets {typ, _ : GetMessageType(p.Header.Cmd)msg : reflect.New(typ.Elem()).Interface()err : node.option.MessageCodec.Decode(p.Data, msg)if err ! nil {log.Println(err.Error())continue}ioFrame : RequestDataFrame{Header: p.Header, Msg: msg}node.option.IoDispatch.OnMessageReceived(ioSession, *ioFrame)}} }完整代码请移步 -- go游戏服务器
http://www.w-s-a.com/news/591358/

相关文章:

  • wordpress企业网站源码开发网站用什么工具做设计
  • 网站负责人不是法人seo神马网站推广器
  • 网站建设绩效考核方案wordpress支付宝付款
  • 高要区住房和城乡建设局网站如何网上注销自己的公司
  • 哪种技术做网站容易论文答辩图片做记录片的是哪个网站
  • 怎样在微信中做网站网站的备案号在哪
  • 返利淘网站怎么做wordpress htnl短代码
  • 网站 手机 appwordpress管理账户
  • 徐州网站建设 网站制作做招商网站的前景怎么样
  • 网站开发就业岗位鹧鸪哨网站1v1深度开发
  • 在线手机动画网站模板网站登录注册怎么做
  • 苏州品牌网站设计晋江论坛兔区是什么
  • 怎么利用代码做网站重庆网络营销网站建设销售
  • 用dw怎么做网站留言板百度举报网站
  • 成都微网站设计企业为什么要做网络营销推广
  • 双桥区网站制作企业网站一般内容包括哪些
  • 莆田外贸专业建站做app 需要先做网站吗
  • 网站怎么用北京口碑最好的装修公司
  • 潮州网站建设深圳微信分销网站设计
  • asp.net网站开发实例教程pdf泉州seo网站关键词优推广
  • 怎样建立一个企业网站dede 网站名称
  • 做网上竞彩网站合法吗免费网站建设品牌
  • 网站开发所需要的的环境客户关系管理的内涵
  • 优质做网站公司做软件的人叫什么
  • 徐州市徐州市城乡建设局网站首页网站建设刂金手指下拉十五
  • 建设游戏网站目的及其定位市场营销策略概念
  • 小学电教检查网站建设资料wordpress谷歌字体
  • 南通做网站的公司有哪些中国建筑论坛网
  • 技术支持 佛山网站建设wordpress不用ftp
  • 广州定制app开发wordpress配置搜索引擎优化