2013-04-20 1 views
1

Я создаю многопользовательский чат-сервер, и я уверен, что он будет работать (исправьте меня, если я ошибаюсь), у меня есть проблема, что в сокете, к которому подключается клиент, имеет значение null, поэтому соединения не могут быть создан, потому что я использую if (Socket! = null), поэтому я не получаю ошибок, но я быстро объясню свой макет. Сервер начинается с класса стартера (LaunchServer), который использует объект класса ClientConnector как Minecraft, а затем запускает метод runServer(). Вот код для этого класса:Почему этот сокет не равен нулю?

public class LaunchServer 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("[Info] Running"); 
     ClientConnector Minecraft = new ClientConnector(); 
     Minecraft.runServer(); 
    } 
} 

Это довольно просто. Это приводит нас к классу ClientConnector. Здесь мы начинаем с метода runServer(). Прямо сейчас у нас есть блок catch try. в этом блоке мы печатаем сообщение, которое сервер пытается подключиться к порту 1337. Затем мы создаем новый ServerSocket, называемый serverocket. Затем мы отправляем сообщение на консоль, говоря, что мы привязаны к порту и что мы ждем подключения. Хотя true, мы создаем новый сокет Socket, который равен ServerSocket.accept(); OMG трахал его. Вот код. Вы знаете, что он делает ...

import java.util.ArrayList; 
import java.net.*; 
import java.io.*; 

public class ClientConnector 
{ 

public static ArrayList<Socket> Connections = new ArrayList<Socket>(); 

public static void runServer() 
{ 
    try 
    { 
     System.out.println("[Info] Attempting to bind to port 1337."); 
     @SuppressWarnings("resource") 
     ServerSocket serversocket = new ServerSocket(1337); 
     System.out.println("[Info] Bound to port 1337."); 
     System.out.println("[Info] Waiting for client connections..."); 
     while(true) 
     { 
      Socket socket = serversocket.accept(); 
      new ClientHandler(socket).start(); 
      Connections.add(socket); 
     } 

    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

Это подводит нас к классу обработчика:

import java.io.*; 
import java.net.*; 


public class ClientHandler extends Thread 
{ 
Socket Socket; 

public ClientHandler(Socket socket) 
{ 
    socket = Socket; 
    System.out.println("[Info] Client connected on port 1337."); 
} 

public void run() 
{ 
    while(true) 
    { 
     for(int i = 0; i < ClientConnector.Connections.size(); i++) 
     { 

      try 
      { 
       if(Socket != null)//This stays null... 
       { 
        ObjectOutputStream Output = new //These can't be created... 
        ObjectOutputStream(Socket.getOutputStream()); 
        ObjectInputStream Input = new ObjectInputStream(Socket.getInputStream()); 
        whileChatting(Input, Output); 
       } 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public static void sendMessage(String message, String returnedMessage, ObjectOutputStream out) 
{ 
    try 
    { 

     if(!message.isEmpty()) 
     { 
      out.writeObject("\247c[Server]\247d " + message); 
      out.flush(); 
      System.out.println("[Chat] Sent: " + message); 
     } 
     else 
     { 
      out.writeObject(returnedMessage); 
      System.out.println("[Chat] Sent: " + returnedMessage); 
     } 
     out.flush(); 
     System.out.println("[Info] Fluching remaining data to stream."); 
     System.out.println("\n[Server] " + message); 
    } 
    catch(IOException ioException) 
    { 
     System.out.println("[Warning] Error: ioException @ sendMessage line 76."); 
    } 
} 

public static void whileChatting(ObjectInputStream input, ObjectOutputStream output) throws IOException 
{ 
    String message = ""; 
    do 
    { 
     try 
     { 
      message = (String) input.readObject(); 
      System.out.println("\n" + message); 
      sendMessage("", message, output); 
     } 
     catch(ClassNotFoundException classNotFoundException) 
     { 
      System.out.println("[Warning] Error: ClassNotFoundException @ whileChatting line 1-7."); 
      System.out.println("\n idk wtf that user sent!"); 
     } 
    }while(!message.equals("/stop")); 
} 


} 

Прочитайте метод выполнения. Там вы увидите нулевую проблему

Будет ли соединение принято, а затем передано классу hander? Как можно получить нулевое соединение? Мой вопрос: как я могу исправить эту проблему?

+0

Существует опечатка в имени переменной в классе 'ClientHandler' - вы написали' Оправа Socket', что является причиной всех ошибок. Посмотрите на конструктор, вы все перепутались с именами переменных –

ответ

5

Проблема в том, что у вас есть логическая ошибка из-за не рекомендованных соглашений об именах. Вы не должны указывать переменные с ключевыми словами, такими как переменная Socket, и каждая переменная должна иметь отличимое имя. например а не socket1, socket2, но serverSocket, clientSocket, потому что это упростит для вас и всех остальных возможность читать и исправлять код.

Изменить

Socket Socket; 

в

Socket connectedSocket; 

и в конструкторе

socket = Socket; 

в

connectedSocket = socket; 

, наконец, в вашем run() изменения метода

if(Socket != null) 

в

if(connectedSocket != null) 
+1

+1 - Еще один пример того, кто-то ** игнорирует ** соглашения стиля Java и получает укушенное. Здесь есть урок ... –

+0

На самом деле переменная-член должна быть названа 'socket', а код конструктора должен читать' this.socket = socket'. Это не 'ServerSocket'. – EJP

+0

@ EJP: Хорошо, я исправлю это. Хотя, назвав это чем-то, что было не просто «сокетом», я надеялся помочь отличить его имена. Что-то вроде 'connectedSocket' было бы более подходящим, хотя – TheMerovingian