2013-08-03 3 views
-1

Я делаю простой веб-сервер, где я создаю новый поток каждый раз, когда клиент подключается. Затем мне нужно отправить ответ с помощью BufferedOutputStream (поскольку для протокола HTTP требуется/r/n в конце строки). Вот мой код:Исключение «Socket is closed» при использовании Socket, который передается потоку?

class HttpServer{ 
    public static void main(String args[]){ 
     ServerSocket ss = null; 
     int port = 40000; 

     try{ 
      if(args.length > 0){ 
       port = Integer.parseInt(args[0]); 
      } 

      ss = new ServerSocket(port); 

      while(true){ 
       Socket client = ss.accept(); 
       User user = new User(client); 
       user.start(); 
      } 
     } 
     catch(Exception e){ 
       System.err.println(e.getMessage()); 
     } 
    } 
} 

И мой класс Пользователь:

class User extends Thread{ 

     Socket client; 

     public User(Socket s){ 
      client = s; 
     } 

     public void run(){ 
      try{ 
       BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream()); 

       println(bos, "Hello World"); 
       bos.close(); 

       client.close(); 
      } 
      catch(Exception e){ 
        System.err.println(e.getMessage()); 
      } 
     } 

     private void println(BufferedOutputStream bos, String s) throws IOException { 
      String news = s + "\r\n"; 
      byte[] array = news.getBytes(); 
      for(int i=0; i<array.length; i++){ 
       bos.write(array[i]); 
      } 
      return; 
     } 
    } 

Проблема возникает, когда я пытаюсь создать BufferedOutputStream; это дает мне ошибку «Socket is closed», и я понятия не имею, почему.

Любая помощь будет высоко оценена.

Спасибо!

Это код, который не работает:

class User extends Thread{ 

    Socket client; 

    public User(Socket s){ 
     client = s; 
    } 

    public void run(){ 
     try{ 
      System.out.println("Address: " + client.getInetAddress().toString()); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 

      String line; 
      Boolean first = true; 
      while(!((line = reader.readLine()).equals(""))){ 
       if(first) 
        System.out.println(line.split(" ")[1]); 
       first = false; 
      } 
      reader.close(); 

      BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream()); 
      println(bos, "Hello World"); 
      bos.close(); 



      // Close socket 
      client.close(); 
     } 
     catch(Exception e){ 
       System.err.println(e.getMessage()); 
     } 
    } 

    private void println(BufferedOutputStream bos, String s) throws IOException { 
     String news = s + "\r\n"; 
     byte[] array = news.getBytes(); 
     for(int i=0; i<array.length; i++){ 
      bos.write(array[i]); 
     } 
     return; 
    } 
} 
+1

странно, я не знаю, что происходит – tbodt

+0

Как клиент вызывает ваш сервер? Возможно, клиент закрывает соединение, прежде чем читать какой-либо вывод с сервера? – tangens

+0

Я тестировал его, введя localhost: 40000 в браузере, и это результат. Я также попытался использовать локальный адрес, например. 192.168.0.100:40000 с тем же результатом. – Neurion

ответ

0

Насколько я могу сказать, что нет никаких проблем с вашим кодом. Кажется более вероятным, что операционная система или браузер каким-то образом ограничивают доступ к вашему серверу.

-1
Socket client = ss.accept(); 
User user = new User(client); 
user.start(); 

accept Блокировка вызовов в ожидании соединений. Пользовательский поток никогда не создается. Вы должны создать новый класс User, который создает для вас новый поток и записывает ваши сообщения на сервер.

public class User extends Thread{ 

      Socket client; 
      int port; 
      public User(int p) throws UnknownHostException, IOException{ 
       port = p; 
       client = new Socket(InetAddress.getLocalHost(), 40000); 
      } 

      public void run(){ 
       try{ 
        BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream()); 

        println(bos, "Hello World"); 
        bos.close(); 

        client.close(); 
       } 
       catch(Exception e){ 
         System.err.println(e.getMessage()); 
       } 
      } 

      private void println(BufferedOutputStream bos, String s) throws IOException { 
       String news = s + "\r\n"; 
       byte[] array = news.getBytes(); 
       for(int i=0; i<array.length; i++){ 
        bos.write(array[i]); 
       } 

       return; 
      } 

      public static void main(String[] args) throws UnknownHostException, IOException { 
       User user = new User(4000); 
       user.start(); 
      } 
     } 

Сервер должен слушать только входящие соединения. (И, возможно, распечатать)

import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 


class HttpServer{ 
    public static void main(String args[]){ 
     ServerSocket ss = null; 
     int port = 40000; 

     try{ 
      if(args.length > 0){ 
       port = Integer.parseInt(args[0]); 
      } 

      ss = new ServerSocket(port); 

      while(true){ 
       Socket client = ss.accept(); 
       Scanner scanner = new Scanner(client.getInputStream()); 
       while (scanner.hasNext()) { 
        System.out.println(scanner.nextLine()); 
       } 
      } 
     } 
     catch(Exception e){ 
       System.err.println(e.getMessage()); 
     } 
    } 
} 

Выполнить оба из них, как различные процессы Java и вы должны увидеть привет мир на стороне сервера. Если вы измените свой порт, возможно, вам придется изменить его и на стороне клиента.

+0

Пользователь * - это принятое соединение, а не новое клиентское соединение внутри сервера. Вы вообще не поняли код. -1 – EJP

2

Это исключение означает, что вы закрыли розетку.

Закрытие входного потока или выходного потока сокета закрывает два других, и закрытие любого фильтра-входа/выхода/считывателя/записи закрывает поток/считыватель/запись, который он фильтрует.