2013-10-04 42 views
-3

在人们怀疑我不知道我在做什么(并最终无缘无故投票)之前,请阅读以下内容:初始化输入/输出流后程序不会继续?

它连接到我的服务器就好!我没有收到任何错误(来自客户端或服务器),并且我的服务器正在识别连接。它与我的朋友的客户合作,但我想成为自己的客户,显然我做错了什么。请保持主题!谢谢:)


标题基本上说这一切。我在我的Client.java上面和下面的setupStream()上测试了println消息,但仅打印了setupStream()以上的消息。我不确定我是如何在没有让程序停下来的情况下初始化我的流。

Client.java

import java.io.IOException; 


public class Client extends Stream implements Runnable { 
    public boolean running = false; 
    private Thread clientThread; 

    Frame frame; 
    public Client() { 
     super("localhost", 43594); 

     frame = new ClientFrame(500, 500); 
     start(); 
    } 

    public synchronized void start() { 
     if(running) return; 
     running = true; 

     clientThread = new Thread(this); 
     clientThread.start(); 
    } 
    public synchronized void stop() { 
     if(!running) return; 
     running = false; 

     clientThread.interrupt(); 
     try { 
      clientThread.join(); 
     } catch (InterruptedException e) {e.printStackTrace();} 
    } 

    public void run() { 
     try{ 
     setupStream(); 

     while(running) { 
      System.out.println("running"); 
     } 
     }catch(IOException e) { 
      e.printStackTrace(); 
     }finally { 
      try{ 
      out.close(); 
      in.close(); 
      socket.close(); 
      clientThread.join(); 
      }catch(IOException | InterruptedException e) { e.printStackTrace(); } 
     } 
    } 
    public static void main(String[] args) { 
     new Client(); 
    } 
} 

Stream.java

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 


public class Stream { 

    Socket socket; 
    ObjectOutputStream out; 
    ObjectInputStream in; 
    String data; 

    public Stream(String host, int port) { 
     try { 
      socket = new Socket(host, port); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    protected void setupStream() throws IOException { 
     out = new ObjectOutputStream(socket.getOutputStream()); 
     out.flush(); 
     in = new ObjectInputStream(socket.getInputStream()); 
    } 

} 

我的服务器线程:

package Server; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 

public class User extends Thread { 
    public static int users = 0; 
    public int ID; 
    public String username; 
    boolean online = false; 

    public static ArrayList<String> usernames = new ArrayList<String>(); 

    Socket socket; 

    DataOutputStream out; 
    DataInputStream in; 
    String input; 

    public User(Socket socket) { 
     this.socket = socket; 

    } 

    public String decode(String input) { 
     String[] split = input.split(" "); 

     if(input.startsWith("::")) { 
      try { 
       switch(split[0].substring(2, split[0].length()).toLowerCase()) { 
       case "setname": 
       case "changename": 
       case "newname": 
        if(usernames.contains(split[1].toLowerCase())) { 
         out.writeUTF("This name is already taken! Please choose a different one."); 
         out.flush(); 
         return null; 
        } 
        if(username == null) { 
         username = split[1].substring(0, 1).toUpperCase() + split[1].substring(1, split[1].length()); 
         Server.users.put(split[1].toLowerCase(), Server.user[ID]); 
         usernames.add(split[1].toLowerCase()); 
        } else { 
         usernames.remove(username.toLowerCase()); 
         username = split[1].substring(0, 1).toUpperCase() + split[1].substring(1, split[1].length()); 
         usernames.add(split[1].toLowerCase()); 
        } 
         return null; 
       case "rank+": 
        return null; 
       case "[sm]=": 
        return null; 
       } 
      }catch(IOException e) { } 
     } 
     return input; 
    } 

    String timeStamp; 
    public void run() { 
     try { 

      out = new DataOutputStream(socket.getOutputStream()); 
      out.flush(); 
      in = new DataInputStream(socket.getInputStream()); 

      while((input = in.readUTF()) != null) { 
       input = decode(input); 

       if(input != null) { 
        if(username != null) { 
         timeStamp = new SimpleDateFormat("[h:mm:ss] ").format(Calendar.getInstance().getTime()); 
         Server.sendGlobalMessage(timeStamp + username +": "+input); 
        } else { 
         timeStamp = new SimpleDateFormat("[h:mm:ss] ").format(Calendar.getInstance().getTime()); 
         Server.sendGlobalMessage(timeStamp + "Guest "+ID+": "+input); 
        } 
       } 
      } 

     }catch(IOException e) { e.printStackTrace(); } finally { 
      try{ 
       out.close(); 
       in.close(); 
       socket.close(); 
      } catch(IOException e) { e.printStackTrace(); } 
     } 

    } 

} 

我没碰过我的服务器线程的代码了一会儿,因为它直到我成为我的新客户之前一直在努力。

+5

你默默无视'setupStream()'的异常。在catch块中至少添加'e.printStackTrace()'。 – kiheru

+1

@VinceEmigh你应该担心错误处理,'Stream'构造函数总是失败,但是由于异常被抑制,没有人注意到。进一步的'setupStream'会抛出NPE,因为'null''Socket'没有什么好听的! – harsh

+1

并不是所有的方法都不能到达'setupStreams()'(锁定或抛出异常)之下的行。你怎么知道一个异常不会抛出,如果你从来没有检查?你说你没有得到任何错误,但你粘贴的代码无法检测到。 – kiheru

回答

2

我怀疑你的服务器没有创建一个ObjectOutputStream,所以当客户端构造它的ObjectInputStream时,它会阻止等待对象流标题,它永远不会到达。

+2

正如我所说的那样。一个ObjectInputStream在另一端需要一个ObjectOutputStream,反之亦然。*但是关于异常处理的注释不能被忽略。它不是你在程序中添加到程序后的东西。这是首先让它工作的一个重要部分。 – EJP