закрыть все розетки после его использования? на стороне сервера - PullRequest
3 голосов
/ 12 февраля 2011

Нужно ли закрывать все розетки после его использования? Где я должен поместить их в этот код? Моя программа просто работает нормально, когда я ее запускаю. Однако, когда я перезапустил его, он сказал «Исключение в потоке» main «java.net.BindException: Адрес уже используется: JVM_Bind». Поэтому, я думаю, что я не закрыл все сокеты после его использования.

import java.io.*;
import java.net.*;
import java.util.*;
public class Server2 {
public static void main(String args[]) throws Exception {
    int PORT = 5555;      // Open port 5555
    //open socket to listen
    ServerSocket server = new ServerSocket(PORT);
    Socket client = null;
    while (true) {
        System.out.println("Waiting for client...");
        // open client socket to accept connection
        client = server.accept();
        System.out.println(client.getInetAddress()+" contacted ");
        System.out.println("Creating thread to serve request");
        ServerStudentThread student = new ServerStudentThread(client);
        student.start();


    }

}

}

Ответы [ 3 ]

2 голосов
/ 12 февраля 2011

Вызов server.close() в блоке finally.

ServerSocket server = new ServerSocket(PORT);
try {
    while (true) {
        System.out.println("Waiting for client...");
        // open client socket to accept connection
        Socket client = server.accept();
        System.out.println(client.getInetAddress()+" contacted ");
        System.out.println("Creating thread to serve request");
        ServerStudentThread student = new ServerStudentThread(client);
        student.start();
    }
} finally {
    server.close();
}
0 голосов
/ 12 февраля 2011
  1. Вы выполняете бесконечный цикл while, у вас есть логическая переменная, которая сообщает, когда нужно остановиться, я думаю, вы не выходите изящно, поэтому порт не закрыт.

Можетбудь ты можешь попробовать вот так

import java.io.*;
import java.net.*;
import java.util.*;
public class Server2 {
static int NUM_CONN_TO_WAIT_FOR=15;
boolean exitServer =false;
public static void main(String args[]) throws Exception {
    int PORT = 5555;      // Open port 5555
    //open socket to listen
    ServerSocket server = new ServerSocket(PORT);
    Socket client = null;
    static int connections =0;
try
{

    while (!exitServer ) {
        System.out.println("Waiting for client...");
        // open client socket to accept connection
        if ( connections < NUM_CONN_TO_WAIT_FOR )
        {
          client = server.accept();
          System.out.println(client.getInetAddress()+" contacted ");
          System.out.println("Creating thread to serve request");
          ServerStudentThread student = new ServerStudentThread(client);
          student.start();
        } else
        {
            exitServer =true;
        } 
        connections++;

    }
} catch (Exception e)
{
   System.out.println(e.printStackTrace());
}
finally
{

   if ( client != null)
        client.close();

   if ( server!= null)
        server.close();

}

}

}
0 голосов
/ 12 февраля 2011

Address already in use: JVM_Bind - означает, что ваша операционная система не является закрытой розеткой после предыдущего использования.Он закрывается по тайм-ауту около 30-180 секунд.

Я действительно не знаю, как это сделать в Java, но в C коде это можно сделать так до вызова системной функции bind:

int yes = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

Это значит: установить флаг (опция) SO_REUSEADDR в sockfd сокет.

В Java должен существовать соответствующий механизм для того же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...