Det tar en stund för den att stänga socketen ja.
Jag vet inte hur det är med Java men i andra språk finns det något som heter reuse. Kolla efter detta.
4 svar · 267 visningar · startad av Grollen
Hej!
Jag sitter och försöker implementera ett system som ska mäta tiden för olika sätt att skicka meddelanden med hjälp utav java.
Ett av kraven är att vi skall använda port 9000 för klienter och port 10000 för servrarna. I första testet skapar jag nya sockets vid varje iteration och skickar över ett meddelande som jag skapat tidigare med följande kod
Klientkoden:
InetAddress address = InetAddress.getByName("localhost");
byte[] passing = this.getMessageWithSize(size);
for(int i=0;i<repetitions;i++)
{
//Creates a socket to the local host at the default server port and writes a message
//Start timing
timeStart = System.currentTimeMillis();
Socket clientSocket = Socket clientSocket = new Socket(address, DEFAULT_SERVER_PORT, address, DEFAULT_CLIENT_PORT);
BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream(),size);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()),size);
out.write(message);
out.flush();
//Reads the the reply
response = in.readLine();
in.close();
out.close();
clientSocket.close();
//Stop timing
timeEnd = System.currentTimeMillis();
System.out.println("#"+i+": Response from from server: Read "+response.length()+" of bytes/characters. One round robin: "+(timeEnd - timeStart)+" msec");
totalTime = totalTime + timeEnd - timeStart;
}
Serverkoden
char[] result = new char[size];
ServerSocket server = new ServerSocket(DEFAULT_SERVER_PORT);
for(int i=0; i<repetitions; i++)
{
//Creates a socket at default server port that listens to requests.
Socket serverSocket = server.accept();
BufferedReader in = new BufferedReader( new InputStreamReader(serverSocket.getInputStream()));
BufferedOutputStream out = new BufferedOutputStream(serverSocket.getOutputStream(),size);
request = in.readLine();
System.out.println("#"+i+": Request from client: Read "+request.length()+" characters.");
request = request.concat("\n");
//Writes back to the same socket
out.write(request.getBytes());
out.flush();
in.close();
out.close();
serverSocket.close();
}
server.close();
Problemet med detta är att det fungerar endast mellan 20 och 200 ggr, sen säger får jag ett exception som lyder:
Java.net.bindException - Address already in use
Någon som har någon pejling på vad jag kan ändra? Det verkar som att socket:en inte stängs riktigt, utan att den ligger kvar ett tag.
Det tar en stund för den att stänga socketen ja.
Jag vet inte hur det är med Java men i andra språk finns det något som heter reuse. Kolla efter detta.
Det finns något som heter
Socket.setReuseAddress(boolean), men det fungerar tyvärr inte heller. :/
Socket.serReuseAddress(true) sätter du det innan du öppnar socketen?
Ja. Skapar en socket som inte är connected, sätter reuse till true och sedan connectar jag till en serversocket.