webForumDet fria alternativet

Address already in use

Java

4 svar · 267 visningar · startad av Grollen

Medlem sedan dec. 20039 inlägg
Frågan#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.

Medlem sedan aug. 20003 575 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.

Medlem sedan dec. 20039 inlägg
#3

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

Medlem sedan aug. 20003 575 inlägg
#4

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

Medlem 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.

253 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)