webForumDet fria alternativet

Address already in use

4 svar · 265 visningar · startad av Grollen

GrollenMedlem sedan dec. 20039 inlägg
#1

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.

NickemannenMedlem sedan aug. 20003 524 inlägg
#2

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.

GrollenMedlem sedan dec. 20039 inlägg
#3

Det finns något som heter
Socket.setReuseAddress(boolean), men det fungerar tyvärr inte heller. :/

NickemannenMedlem sedan aug. 20003 524 inlägg
#4

Socket.serReuseAddress(true) sätter du det innan du öppnar socketen?

GrollenMedlem sedan dec. 20039 inlägg
#5

Ja. Skapar en socket som inte är connected, sätter reuse till true och sedan connectar jag till en serversocket.

Genererad på 373 ms · cache AV · v20260730165559-full.f96bc7eb