Какова ситуация, когда hashCode двух объектов равен друг другу, но == и equals () получат значение false?
blockquote>Согласно документации Java:
[ 1112]Если объекты равны (т. Е. x.equals(y) == true
), тоhashCode
этих объектов также должны быть равны (т. Е.x.hashCode() == y.hashCode()
)Если два объекта равны hashCode
(т. Е. [ 114]), то не обязательно, чтобы эти объекты были равны (т. Е.x.equals(y) == true/false
)
См. Подробности в Oracle Java Tutorial: Object as Superclass
Я предполагаю, что Вы могли попробовать все порты> 5000 (например), в последовательности. Но как Вы передадите к клиентской программе, какой порт Вы слушаете? Кажется более простым выбрать порт и затем сделать это легко настраивающимся, если необходимо переместить сценарий между различными средами.
Для HTTP стандартный порт равняется 80. Альтернативные порты, которые я видел используемый, 8080, 880 и 8000.
На самом деле довольно легко, когда Вы не пытаетесь сделать все в одной строке :-/
require 'socket'
t = STDIN.read
port = 8080 # preferred port
begin
server = TCPServer.new('127.0.0.1', port)
rescue Errno::EADDRINUSE
port = rand(65000 - 1024) + 1024
retry
end
# Start remote process with the value of port
socket = server.accept
puts socket.gets
socket.print "HTTP/1.1 200/OK\rContent-type: text/plain\r\n\r\n" + t
socket.close
Это выполняет (сильное слово) то же как отрывок в вопросе.
Передайте 0 в для номера порта. Это заставит систему выбирать порт для Вас из эфемерного диапазона портов. После того как Вы создаете сервер, можно попросить у этого его addr, который будет содержать порт, с которым связывается сервер.
server = TCPServer.new('127.0.0.1', 0)
port = server.addr[1]
Не связывайтесь на случайных портах. Выберите по умолчанию и сделайте его настраивающимся. Случайные порты являются несовместимыми с брандмауэрами. FTP делает это и брандмауэр поддерживают для него, кошмар - он должен глубоко осмотреть пакеты.