我最近与一家刚刚失去服务器/网络管理员的公司进入网络开发职位.虽然我被聘用进行网络开发,但我被要求在服务器上做一些日常维护任务,但我仍然遇到麻烦,没有这种东西的背景.我们失去了与旧网络管理员的所有通信,这没有任何帮助.
这是情况.在大学的这部分几十个老师曾共享服务器(Windows Server 2003中,SP 2)如目录\\servername\Jones$,\\servername\Smith$和\\servername\Watson$.我的问题是:为什么共享名称附有美元符号?它似乎不是技术要求,也不区分这些文件夹与其他类似命名的文件夹.这种标准风格,某种我无法理解的要求,或者我应该作为上一个管理员怪癖的产品而被注销的东西?
对于有点蹩脚的问题道歉,但我无法弄清楚这一点,并且我一直在继续添加带有美元符号附加共享名称的新目录,因为我不确定它是否真的有必要.
披露:我正在处理的代码是大学课程.
背景:我要完成的任务是报告不同线程技术的效果.为此,我编写了几个类来响应客户端使用Java套接字的请求.我们的想法是向服务器发送请求并报告不同的线程策略如何处理这个问题.每个客户端将发出100个请求,并且在每次迭代中,我们将客户端数量增加50,直到出现故障.
问题:可重复且一致地发生异常:
Caused by: java.net.NoRouteToHostException: Cannot assign requested address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
这种情况发生在几种情况下,包括客户端和服务器都在localhost上运行时.可以成功连接一段时间,尝试连接150个客户端后不久就会抛出异常.
我的第一个想法是它可能是Linux对打开文件描述符(1024)的限制,但我不这么认为.我还检查了套接字之间的任何和所有连接是否正确关闭(即在正确的finally块内).
我对发布代码犹豫不决,因为我不确定哪些部分最相关,并且不希望在问题中有大量代码.
有没有人遇到过这个?如何避免NoRouteToHostException?
编辑(进一步的问题是斜体)
到目前为止,一些好的答案指向短暂的端口范围或RFC 2780.这两个都表明我有太多的连接打开.对于两者而言,似乎需要达到此限制的连接数表明在某些时候我没有关闭连接.
调试了客户端和服务器后,两者都被观察到了方法调用myJava-Net-SocketInstance.close().这表明连接正在关闭(至少在非例外情况下).这是正确的建议吗?
此外,是否还需要等待操作系统级别才能再次使用端口?如果在运行下一次尝试之前只需要短时间(或乐观地运行命令),则可以为每个50多个客户端单独运行程序.
编辑v2.0
在提供了良好的答案后,我修改了我的代码,使用方法setReuseAddress(true)与客户端上的每个Socket连接.这没有达到预期的效果,我仍然限制在250-300个客户端.程序终止后,运行该命令会netstat -a显示TIME_WAIT状态中存在大量套接字连接.
我的假设是,如果套接字处于TIME-WAIT状态,并且已使用该SO-REUSEADDR选项设置,则任何尝试使用该端口的新套接字都能够 - 但是,我仍然收到NoRouteToHostException.
它是否正确? 还有什么办法可以解决这个问题吗?
你如何检查你是否可以通过java连接到互联网?一种方法是:
final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...
Run Code Online (Sandbox Code Playgroud)
但是,是否有更适合执行该任务的东西,特别是如果您需要经常进行连续检查并且极有可能丢失互联网连接?
如果远程服务器(由HTTP提供服务)上存在文件,并且有URL,我该如何检查Java?我不想下载文件,只检查它的存在.
除了java.nio之外,java中有哪些async io(基于套接字)的选项?java.nio也使用backround中的线程(因为我认为.NET的async-socket-library确实如此,可能它已经被更改了)或者使用正确的select调用它是"真正的"async io吗?
0.0.0.0是有效的IP地址吗?我希望我的程序能够存储它作为没有使用地址的指示,但如果它实际上有效则不起作用.
我已经在Windows上(在本地计算机上)成功安装了MongoDB作为服务,但现在我想将MongoDb移动到一个单独的服务器上.所以我将tarball解压缩到网络上的虚拟服务器(运行linux).
当我从本地机器使用PuTTY连接到服务器("testmongoserver")时,我启动了mongod服务器,它告诉我它正在监听默认的28017端口.mongo控制台也在工作,允许我创建一个新数据库(testdb)并向其添加用户.
但是,我无法从远程访问服务器.当我键入testmongoserver:28017它时,不会像localhost:28017在本地计算机上那样打开HTTP控制台.我也无法使用官方驱动程序连接并提供连接字符串.
在Linux上安装MongoDB的必要步骤是什么,以便我可以从具有连接字符串的远程计算机访问它并通过其使用HTTP控制台 testmongoserver:28017
谢谢!
我想在我的应用程序中找到一种方法来将日期和时间与外部源给出的内容同步.
我不想使用手机时间,因为我可能会在实时间差5分钟左右.5分钟或更少= 10分钟!
我听说过GPS卫星或网络天线的时间信息.
我已经尝试过使用System.getCurrentTime,但是我得到了设备的当前设备,因此,如果我的设备提前5分钟设置,则会显示错误的时间.
编辑
提出一个简短的问题:我怎么能得到这个时间?

我尝试了解protobuf和gRPC以及如何使用它们.你能帮我理解一下:
我已经知道 - 或者假设我这样做 - 那:
对于已经使用该技术的人,我再次认为这是一个简单的问题.我仍然会感谢你对我有耐心并帮助我.我也非常感谢网络深入研究这些技术.
编辑:准确地完成所做的事情
我需要SSH本地主机没有密码,通常的方式(使用公钥)不起作用.
user@PC:~$ rm -rf .ssh/*
user@PC:~$ ssh-keygen -t rsa > /dev/null
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
user@PC:~$ ls .ssh/
id_rsa id_rsa.pub
user@PC:~$ ssh-copy-id -i localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is f7:87:b5:4e:31:a1:72:11:8e:5f:d2:61:bd:b3:40:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
user@localhost's password:
Now try logging …Run Code Online (Sandbox Code Playgroud) networking ×10
java ×4
sockets ×2
android ×1
asynchronous ×1
connection ×1
file-exists ×1
grpc ×1
http ×1
ip ×1
linux ×1
login ×1
mongodb ×1
openssh ×1
passwords ×1
ssh ×1
time ×1
url ×1