服务器或客户端上的Java NIO套接字在什么时候套接字连接已准备好发送数据?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了服务器或客户端上的Java NIO套接字在什么时候套接字连接已准备好发送数据?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4601字,纯文字阅读大概需要7分钟。
内容图文
![服务器或客户端上的Java NIO套接字在什么时候套接字连接已准备好发送数据?](/upload/InfoBanner/zyjiaocheng/681/02278364770f476bb4fbd19b469262d9.jpg)
我正在使用Java NIO,这是我第一次设置有效的TCP连接(直到现在,我才完成UDP,很久以前才完成一个简单的TCP测试程序).
现在,我不确定我可以可靠地开始向客户端发送数据的确切时间,以使他们知道另一端有活动的连接(假设没有出现问题).
假设一切都没有阻塞.
客户:
1)打开一个没有绑定的新套接字通道,因此可以将其设置为异步
s = SocketChannel.open()
2)设置为非阻塞
s.configureBlocking(false)
>我们需要在这里装订吗?还是仅仅为了我们要引用本地端口?
3)尝试连接到正在监听的服务器
s.connect(someAddr)
>如果返回true,则Javadocs说连接已建立.这是否意味着我不需要调用finishConnect()?根据我的阅读,这是用于本地连接的,但是它没有指定远程连接是否可能立即返回true.
>客户端将SYN发送到服务器吗?
服务器:
4)服务器通过一些serverSocketChannel.accept()获得传入连接,我们假定该连接是非阻塞的,并且在这种情况下将假装它返回有效的套接字对象(而不是null).
>这是否意味着服务器一旦获得连接,就接受了连接(假设一切顺利)并发回SYN-ACK?
客户:
5)客户端现在是否调用finishConnect()?
>客户端何时知道何时继续调用finishConnect()?在步骤(3)中调用s.connect(…)之后,我是否立即循环X秒?
>发送ACK时是这个吗?我是否应该在X秒钟内循环直到它返回true …并且如果由于某些错误在X秒钟内没有响应,则杀死“半连接”?
> s.isConnected()是否对步骤(3)中的connect()成功返回true,还是对finishConnect()成功?
我不确定我是否做得正确,也不确定在什么时候服务器可以安全发送,或者客户端可以发送…服务器的安全级别是(4),和(5)给客户?
与服务器建立连接后,是否需要让客户端发送心跳数据包,以便我的应用程序知道可以开始发送数据了?我不知道服务器如何知道它已完全连接,因为我看不到服务器会在最终确认完成后知道的任何方式…除了客户端知道连接已建立并发送某种“第一个数据包的数据.
服务器知道的唯一方法是,是否能以某种方式弄清楚它何时获得ACK数据包,但是我看不到Java让我知道当前的方法.
注意:我可能缺少知识,我可能说了一些不正确的内容,如果您可以指出错误之处,那么我很乐意更新我的帖子,因此事实是正确的.
链接,这些链接指导了我对这篇文章的了解/创建:
解决方法:
Do we need to bind here? Or is that just for if we want to refer to a local port?
您不需要绑定客户端SocketChannel.
s.connect(someAddr)
If this returns true, the javadocs say the connection is established. Does that mean I don’t need to call finishConnect()?
正确.
From what I read, this is for local connections, but it does not specify if remote connections could possibly return true immediately or not.
它可以随时返回true,您必须检查一下.
Is this where the client sends a SYN to the server?
是.
Server gets an incoming connection through some serverSocketChannel.accept(), which we assume is non blocking and will pretend in this case it returns a valid socket object (and not null). Does this mean that as soon as the server gets the connection, it accepted the connection (assuming all went well) and sends back a SYN-ACK?
否.TCP/ IP堆栈已发送了SYN-ACK.它不依赖于应用程序代码何时调用accept().
Does the client call finishConnect() now?
同样,这不取决于服务器应用程序何时调用accept. TCP握手由服务器内核完成.如果connect()未返回true,并且随后的select()指示通道现在可连接,则客户端应调用finishConnnect().
请注意,finishConnect()可以返回true,在这种情况下您可以继续进行操作,或者可以返回false,在这种情况下您可以继续等待OP_CONNECT,或者引发异常,在这种情况下它将失败并应关闭通道.
When does the client know when to keep calling finishConnect()? Do I just loop for X seconds immediately after calling s.connect(…) from step (3)?
往上看.
Is this when it sends the ACK?
否.这都是由内核异步完成的
Am I supposed to loop for X seconds until it returns true… and kill the ‘half formed connection’ if it doesn’t respond within X seconds due to something going wrong?
不,请参见上面.
Does s.isConnected() return true for the connect() in step (3) succeeding, or finishConnect() succeeding?
两者:它们是互斥的.
I’m not sure if I’m doing this properly, and I’m also not sure at what point is it safe for the server to send, or the client to send… is it at (4) for the server, and (5) for the client?
只要服务器具有可接受的套接字,就可以发送.客户端可以在connect()或finishConnect()返回true时立即发送.
Do I need to have the client send a heartbeat packet after the connection is done to the server so my application knows it’s okay to start sending data?
没有.
I don’t know how the server would know it’s fully connected since I can’t see any way the server would know when the final acknowledgement is done… except for the client knowing the connection is established and it sends some kind of ‘first packet’ data.
往上看.发送数据包以查看是否可以发送数据包的想法没有意义.
The only way the server would know is if I can somehow figure out when it gets the ACK packet
当accept()返回时,服务器已经具有ACK数据包.
NOTE: I may be missing knowledge …
您忽略的是服务器上存在侦听积压队列.
内容总结
以上是互联网集市为您收集整理的服务器或客户端上的Java NIO套接字在什么时候套接字连接已准备好发送数据?全部内容,希望文章能够帮你解决服务器或客户端上的Java NIO套接字在什么时候套接字连接已准备好发送数据?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。