在Java中使用套接字时,如何在开始处理之前判断客户端是否已完成发送所有(二进制)数据.考虑例如:
istream = new BufferedInputStream (socket.getInputStream());
ostream = new BufferedOutputStream(socket.getOutputStream());
byte[] buffer = new byte[BUFFER_SIZE];
int count;
while(istream.available() > 0 && (count = istream.read(buffer)) != -1)
{
// do something..
}
// assuming all input has been read
ostream.write(getResponse());
ostream.flush();
Run Code Online (Sandbox Code Playgroud)
我对SO如阅读类似的帖子这个,也没有找到确凿的答案.虽然上面的解决方案有效,但我的理解是,您永远无法确定客户端是否已完成发送所有数据.例如,如果客户端套接字发送了一些数据块然后阻止等待来自另一个数据源的数据,然后它可以发送更多数据,那么上面的代码可能很好地假设客户端已完成发送所有数据,因为istream.available()将为当前字节流返回0 .
最近我为我编写的一个软件添加了一些负载均衡功能.它是一个联网的应用程序,它根据来自SQL数据库的输入执行一些数据处理.由于压缩可能非常密集,我已经添加了在不同服务器上运行此应用程序的多个实例以分割负载的功能,但现在负载平衡是一种手动操作.用户必须指定哪些实例占用输入域的哪个部分.
我想把它提升到一个新的水平,并对实例进行编程,以自动协商输入数据的潜水,并识别其中一个"消失"(已经崩溃或已经断电),以便其余的实例可以采取在失败的实例的工作量上.
为了实现这一点,我正在考虑在实例之间使用简单的心跳协议来确定谁在线以及谁不在线,虽然这不是非常复杂但我想知道是否有任何已建立的心跳网络协议(基于UDP,TCP或两者兼而有之).
显然,在集群,故障转移和高可用性技术的网络世界中,这种情况发生了很多,所以我想最后我想知道是否有任何已建立的协议或算法,我应该知道或实现.
编辑
根据答案,似乎没有完善的心跳协议或没有人知道它们(这意味着它们毕竟不是那么完善)在这种情况下我只是要滚动我自己的.
虽然没有一个答案提供了我特别想要的东西,但我会投票支持Matt Davis的答案,因为它是最接近的,他指出了使用多播的好主意.
谢谢大家的时间〜
sockets network-programming network-protocols distributed-computing
在WinSock2.h中,无效的套接字和套接字错误被定义为这些?这有什么意义吗?
#define INVALID_SOCKET (SOCKET)(~0)
#define SOCKET_ERROR (-1)
Run Code Online (Sandbox Code Playgroud) 我需要在代码的这一部分上创建一个10秒的超时
DatagramPacket getack = new DatagramPacket(incoming,incoming.length);
socket.receive(getack);
我需要它列出10s的传入数据包,如果它在10s之前收到一个数据包它将跳过if语句,如果它达到10s它将跳转到else并重新发送数据包.这是可能的,我怎么能这样做,我对此很新.
private static void sendDATA() {
outgoing = new byte[512]; // Empty array
try {
ByteBuffer sDATA = ByteBuffer.allocate(516);
// 512 - 2 byte opcode, 2 byte block #, 512 data
DatagramPacket data = new DatagramPacket(outgoing, outgoing.length, InetAddress.getByName(clientip), clientport);
InputStream fis = new FileInputStream(new File(FILE));
int a;
int block = 1;
while((a = fis.read(outgoing,0,512)) != -1)
{
data.setLength(a);
sDATA.put((byte)3);
sDATA.put((byte)block);
sDATA.put(outgoing);
socket.send(data);
while(true) {
DatagramPacket getack = new DatagramPacket(incoming, incoming.length);
socket.receive(getack);
if(incoming[0] == …Run Code Online (Sandbox Code Playgroud) 在C编程中,当我想通过网络发送整数时,我们需要使用htonl()或htons()在发送之前将整数从主机字节顺序转换为网络字节顺序.
但是在golang中,我检查了网络包,并且找不到像htons/htonl这样的类似函数.那么在使用golang时我应该如何发送整数?我需要自己实现htons/htonl吗?
我想实现一个Twisted服务器,它需要XML请求并发送XML响应:
<request type='type 01'><content>some request content</content></request>
<response type='type 01'><content>some response content</content></response>
<request type='type 02'><content>other request content</content></request>
<response type='type 02'><content>other response content</content></response>
Run Code Online (Sandbox Code Playgroud)
我创建了一个扭曲的客户端和服务器之前该交换简单的字符串,并试图扩展到使用XML,但我似乎无法弄清楚如何正确设置了全面的总结.
client.py:
#!/usr/bin/env python
# encoding: utf-8
from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol
from twisted.words.xish.domish import Element, IElement
from twisted.words.xish.xmlstream import XmlStream
class XMLClient(XmlStream):
def sendObject(self, obj):
if IElement.providedBy(obj):
print "[TX]: %s" % obj.toXml()
else:
print "[TX]: %s" % obj
self.send(obj)
def gotProtocol(p):
request = Element((None, 'request'))
request['type'] = 'type 01'
request.addElement('content').addContent('some request content') …Run Code Online (Sandbox Code Playgroud) 这个问题的目标是我只是想更好地理解P2P和网络以及安全/加密的本质.我是一名前端Web开发人员,如果我们低于HTTP请求,我对网络堆栈的了解并不是很好.
话虽如此,我试图了解互联网服务提供商和所识别的内容如何"嗅探"洪流流量.我觉得这个问题会暴露我的无知,但是不可能有某种类似HTTPS的P2P协议那么不可读吗?
我知道一个给定的数据包必须在整个过程中识别它到网络的目的地,但是不能将数据包配置为只显示它们的目的地,以便没有人能够确定它的目的,直到它到达目的地为止?为什么ISP显然是一个不可复制的情况,只能看看P2P流量并了解它的一切,但SSH是非常安全的?
encryption p2p bittorrent network-programming network-security
如何检查我是否有开放的网络连接,并且可以联系c#中的特定IP地址?我在VB.Net中看到了一些例子,但它们都使用了'My'结构.谢谢.
当我读到关于套接字编程的内容时,我知道AF_代表地址族.但从字面上看,一个家庭应该有很多成员.那么,AF_INET地址族的成员是什么?
在我看来,我认为说地址类型比地址族更合适.这也适用于PF(协议族).
谢谢.
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
Run Code Online (Sandbox Code Playgroud)
在这个结构中,究竟是什么意思地址家族所描述的sa_family?
这是否意味着像TCP/UDP这样的协议有"地址"?嗯,我认为协议可以是识别号码而不是地址.
无论如何,如果是,那么他们的家庭在什么基础上被划分?
sockets ×6
java ×2
networking ×2
.net ×1
bittorrent ×1
c# ×1
c++ ×1
encryption ×1
events ×1
go ×1
p2p ×1
python ×1
timeout ×1
twisted ×1
xml ×1