在开发将在TCP/IP端口上侦听的应用程序时,应如何选择默认端口?假设此应用程序将安装在许多计算机上,并且需要避免端口冲突.
假如我要获得共享,虚拟或专用托管,我在某处读取服务器/机器一次只能处理64,000个TCP连接,这是真的吗?无论带宽如何,任何类型的托管处理有多少?我假设HTTP通过TCP工作.
这意味着只有64,000个用户可以连接到该网站,如果我想提供更多服务,我必须转移到网络农场吗?
这可能是一个愚蠢的问题:
例如:
如果使用HTTP传输MP3或视频,它是否在内部使用UDP进行传输?
这可能是一个非常基本的问题,但它让我感到困惑.
两个不同的连接插座可以共用一个端口吗?我正在编写一个应该能够处理超过10万个并发连接的应用服务器,而且我们知道系统上可用的端口数量大约为60k(16位).连接的套接字被分配给新的(专用)端口,因此这意味着并发连接的数量受端口数量的限制,除非多个套接字可以共享同一个端口.所以问题.
我在这里先向您的帮助表示感谢!
在基于Android和iOS的应用程序上工作,该应用程序需要与在同一设备中运行的服务器进行通信.目前使用TCP环回连接与App和Server通信(用户层编写的应用程序,使用Android NDK用C++编写的服务器)
我想知道是否用Unix Domain socket替换内部通信会改善性能吗?
或者一般来说是否有任何证据/理论证明Unix Domain套接字会提供比TCP环回连接更好的性能?
如何尝试从超时的套接字读取数据?我知道,select,pselect,poll,有一个超时字段,但使用它们会禁用tcp reno stack中的"tcp fast-path".
我唯一的想法是在循环中使用recv(fd,...,MSG_DONTWAIT)
我有两个通过TCP/IP进行通信的组件.组件A充当服务器/侦听器,组件B充当客户端.两者应该尽快沟通.任何时候都只能有一个连接(尽管这个问题不在此处).我公司的一位高级开发人员表示,我需要在两个组件之间使用应用程序级心跳,以确保连接保持打开状态.
我认为连接保持开放与TCP/IP,但我读过许多博客/网站,说这些应用程序之间的心跳是非常标准的做法.
我知道组件A心跳组件B的部分原因是,如果组件B存在通信问题(链路断开或组件B未运行),它可以通知支持.是否因任何其他原因需要心跳?比如确保经常出现"在管道中"保持开放的东西?
组件A当前每20秒检测一次组件B,如果在120秒内没有从组件B接收到任何内容,则关闭连接.然后,假设如果链路断开,组件B将定期尝试重新连接,则它继续侦听连接.这成功了.
重申我的问题:保持TCP/IP连接存活所需的心跳是否必要?
如果您的TCP连接可能太慢并且UDP"连接"可能太不可靠,您使用什么?有各种标准的可靠UDP协议,你有什么经验吗?
请在每个回复中讨论一个协议,如果其他人已经提到您使用的协议,则考虑将其投票并使用评论进行详细说明(如果需要).
我对这里的各种选项感兴趣,其中TCP位于规模的一端而UDP位于另一端.提供了各种可靠的UDP选项,每个选项都带有TCP到UDP的一些元素.
我知道TCP通常是正确的选择,但是有一个备选列表通常可以帮助我们得出结论.像UDP,RUDP等基于UDP构建的东西各有利弊,你使用它们,你的经历是什么?
为了避免疑问,没有更多的信息,这是一个假设的问题,我希望这个问题会引出一个回复列表,详细说明需要做出决定的人可以使用的各种选项和备选方案.
作为最近一个问题的后续内容,我想知道为什么在没有尝试在TCP套接字上进行读/写操作的情况下,为什么Java不可能检测到套接字已被对等端正常关闭?无论是使用前NIO Socket还是NIO ,情况似乎都是如此SocketChannel.
当对等体正常关闭TCP连接时,连接两端的TCP堆栈都知道这一事实.服务器端(启动关闭的那个)最终处于状态FIN_WAIT2,而客户端(未明确响应关闭的那个)最终处于状态CLOSE_WAIT.为什么没有一个方法Socket或SocketChannel可以查询TCP堆栈看到底层的TCP连接是否已经终止?是不是TCP堆栈没有提供这样的状态信息?或者这是一个设计决定,以避免昂贵的内核调用?
在已经发布了这个问题的答案的用户的帮助下,我想我会看到问题可能来自哪里.未明确关闭连接的一方最终处于TCP状态,CLOSE_WAIT这意味着连接正在关闭并等待一方发出自己的CLOSE操作.我认为isConnected返回true和isClosed返回是公平的false,但为什么不存在类似的东西isClosing呢?
以下是使用pre-NIO套接字的测试类.但使用NIO可获得相同的结果.
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws Exception {
final ServerSocket ss = new ServerSocket(12345);
final Socket cs = ss.accept();
System.out.println("Accepted connection");
Thread.sleep(5000);
cs.close();
System.out.println("Closed connection");
ss.close();
Thread.sleep(100000);
}
}
import java.net.Socket;
public class MyClient {
public static …Run Code Online (Sandbox Code Playgroud) 首先,在同一台服务器上同时使用UDP和TCP有什么问题吗?
其次,我可以使用相同的端口号吗?
tcp ×10
sockets ×7
udp ×3
http ×2
networking ×2
c ×1
hosting ×1
java ×1
linux ×1
loopback ×1
port ×1
tcplistener ×1
unix ×1
unix-socket ×1