草庐IT

TCP-Sockets

全部标签

for-loop - 从 go 中的 tcp 连接读取数据是否需要 for 循环?

有一个func来处理tcp连接:for{select{caseconn:=我的问题是,如果你使用for循环,你必须写return否则它会是一个死循环。如果它返回,这个handleClient函数将只执行一次。所以这里不需要for,对吧?我们仍然可以在没有for的情况下读取所有数据,这是正确的思考方式吗? 最佳答案 服务器处理连接的常见模式可能是funchandleClient(connnet.Conn){r:=bufio.NewReader(conn)for{line,err:=r.ReadBytes(byte('\n'))swit

sockets - Golang http 服务器应用程序有很多套接字 (CLOSE_WAIT)

应用程序可以工作几天。但是在某些时候,应用程序有很多处于CLOSE_WAIT状态的套接字,并且无法接收新的客户端。也许是某种泛洪(例如:同步泛洪)?网络统计-ant|grepCLOSE_WAIT|卫生间3258195482606403258-套接字处于CLOSE_WAIT状态更新:编写一些处理程序:funcGetScore(mongo*mgo.Session,redisConnredis.Conn,rendererhandlers.Render)http.Handler{mutex:=sync.Mutex{}returnhttp.HandlerFunc(func(whttp.Respo

sockets - 使用 os.OpenFile() 而不是 net.Listen()

我深入研究了os.OpenFile和net.Listen的调用堆栈,看看我是否可以使用os创建一个UNIX域套接字。打开文件。以下是我的尝试。但是,在跟踪两个调用堆栈(os.OpenFile和net.Listen)之后,我仍然感到困惑。显然,下面的代码没有从文件中读取数据,而是将数据存储到文件系统。如何使用os.OpenFile实现UNIX域套接字?如果os.ModeSocket不与os.OpenFile一起使用以创建UNIX套接字,它的用途是什么?packagemainimport("fmt""log""os")funcmain(){sock,err:=os.OpenFile("f.

unit-testing - 尝试在 TCP 监听器上提供服务时,由于超时,Go 测试模棱两可地失败

我有这个单元测试:funcTestServer(t*testing.T){db:=prepareDBConn(t)deferdb.Close()lis:=bufconn.Listen(1024*1024)t.Logf("Openedlistener:%v",lis)grpcServer:=grpc.NewServer(withUnaryInterceptor(),)t.Logf("Openedgrpcserver:%v",grpcServer)signKey:=getSignKey()ifsignKey==nil{t.Fatal("FailedtofindorparseRSApriva

sockets - 通过 TCP 处理多个客户端

好的,我刚开始学习golang,到目前为止我很喜欢它。但是我没有发现他们的文档适合入门者,这是我的问题。我想编写接受连接并向客户端写入内容的小服务器程序。到目前为止没有问题。然而,一旦它获得真正的功能,我就需要能够处理多个客户端,我认为这也是goroutines的一个很好的练习。listener,error:=net.Listen("tcp",remote)con,error:=listener.Accept()gohandleClient(&con);funchandleClient(con*net.Conn){我已经删除了大部分代码。问题是,无论我尝试什么,我都无法通过con。co

Golang tcp客户端服务器程序

我可以做服务器程序或客户端程序,但我不知道如何做客户端/服务器程序。有人知道这段代码有什么问题吗?谢谢。packagemainimport("net""os""bufio""io")funcmain(){listen,_:=net.Listen("tcp","localhost:9001")dial,_:=net.Dial("tcp","localhost:9002")scanner:=bufio.NewScanner(os.Stdin)forscanner.Scan(){conn,_:=listen.Accept()ifscanner.Text()=="a"{conn.Close()

asynchronous - 如何有效地解码 gobs 并等待更多通过 tcp 连接到达

我想为游戏应用程序建立TCP连接。时间效率很重要。我想有效地接收许多对象。由于负载的原因,提高CPU效率也很重要。到目前为止,我可以确保每次使用go的net库调用连接时都会调用handleConnection。但是,一旦创建了连接,我就必须进行轮询(一遍又一遍地检查以查看连接上是否已准备好新数据)。这似乎效率低下。如果新数据不必要地占用CPU,我不想运行该检查以查看新数据是否已准备就绪。我一直在寻找诸如以下两个选项之类的东西,但没有找到我要找的东西。(1)执行以某种方式阻塞(不占用CPU)的读取操作,然后在连接流上准备好新内容时解除阻塞。我找不到那个。(2)采用异步方法,当新数据到达连

sockets - 从正在收听的相同端口调用地址

我正在开发一个P2P应用程序,并希望节点同时充当客户端和服务器。比如我建立了一个监听节点,在goroutine中运行如下代码:ln,_:=net.Listen("tcp",":8080")for{conn,err:=ln.Accept().....}然后,在另一个goroutine中,逻辑确定它必须联系另一个节点以让它知道它的存在,比如在本地主机地址“:8081”上,它也有一个类似的监听循环正在运行。如果我只使用net.Dial("tcp",":8081"),它将选择一个随机端口号进行连接,并且节点位于8081将尝试联系该端口而不是8080上的正确端口。有没有办法从8080发起net.

sockets - 如何发现客户端正在从 go 中的 tcp 缓冲区读取

我开始在一个项目中使用golang相当长的时间。在我的项目中,我必须实现一个响应tcp客户端的tcp服务器。服务器必须向客户端发送大量消息。问题是,当服务器向客户端连接写入消息时,它必须等到客户端从缓冲区读取该消息,然后再发送另一条消息(服务器必须等到客户端调用reader.ReadString('\n')方法)。在我的服务器代码中我写了:for{data:=但服务器将所有消息发送给客户端,而无需等待客户端中的ReadString。如何让服务器等到客户端读取一条消息,然后再发送另一条消息? 最佳答案 我认为要么赋值不明确,要么你误解

sockets - 如何处理 go 中的粘性 tcp 数据包?

我有一个tcp服务器和一个客户端,服务器执行以下操作funcproviderCallback(connnet.Conn){reader:=bufio.NewReader(conn)varerrerrorfor{lenbyte,_:=reader.Peek(4)reader.Discard(4)slen:=int(binary.BigEndian.Uint32(lenbyte))data,err=reader.Peek(slen)process(data)reader.Discard(slen)}}客户端发送数据包的速度似乎快于进程可以处理的速度,因此我想在bufio中缓冲请求并稍后处理