2013-10-20 92 views
0

我目前正在一个线程服务器上工作,该线程服务器允许多个客户端通过“/ username message”格式连接和发送消息给对方。服务器运行并且我的客户端类能够成功连接并被要求输入用户名,但是一旦我尝试发送消息而不是接收输出“To [username]:message”I receive“To:[内存地址]: [内存地址]“,我很困惑,因为我没有试图打印任何对象。聊天服务器吐出内存地址。不知道为什么

此外,应该在消息的另一端的客户端上没有显示任何内容。我处理客户端线程的方式是在创建并启动它们之后添加到的ArrayList。我试图将消息发送到另一端的客户端的方式是使用服务器类中的一个方法,该方法遍历客户端线程的ArrayList并将消息输出到具有相应名称的消息。

提前:我知道我的parseUserName和parseMessage方法不太好,但我选择让他们坐下来,直到我可以处理更大的问题。作为参考,这里是我的服务器类。

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.Scanner; 

/** 
* 
* @author 
*/ 
public class ThreadedChatServer 
{ 


    //private ServerSocket server = new ServerSocket(5679); 
    private ServerSocket server; 
    ArrayList<ClientThread> clientThreads; 

    public ThreadedChatServer(ServerSocket s) 
    { 
     server = s; 
     clientThreads = new ArrayList<ClientThread>(); 
    } 


    public void openServer() throws IOException 
    { 
     while(true) 
     { 
      Socket client = server.accept(); 
      System.out.println("The server is connected to " + client.getInetAddress()); 

      // starts a thread for this client 
      ClientThread c = new ClientThread(client, this); 
      c.start(); 
      clientThreads.add(c); 
     } 
    } 

    // Iterates through the clientThreads ArrayList and prints the given message 
    // to the client whose name matches the "to" parameter. 
    public void sendMessage(String from, String to, String m) 
    { 
     for (int i = 0; i < clientThreads.size(); i++) 
     { 
      if (clientThreads.get(i).getUserName() != from && 
        clientThreads.get(i).getUserName() == to) 
      { 
       clientThreads.get(i).toClient.println(m); 
      } 
     } 
    } 

    public static void main(String[] a) throws IOException 
    { 
     new ThreadedChatServer(new ServerSocket(5679)).openServer(); 
    } 

    public class ClientThread extends Thread 
{ 
    private Socket s; 
    private String name; 
    private BufferedReader fromClient; 
    private PrintWriter toClient; 
    private ThreadedChatServer server; 

    public ClientThread(Socket c, ThreadedChatServer tc) throws IOException 
    { 
     s = c; 
     name = null; 
     fromClient = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     toClient = new PrintWriter(s.getOutputStream(), true); 
     server = tc; 
    } 

    public void run() 
    { 
     String s = null; 
     int size = 0; 
     char[] c = null; 





     try 
     { 
      toClient.println("Enter a username: "); 
      s = fromClient.readLine(); 
      name = s; 

      // Accept/send messages from the user 
      while ((s = fromClient.readLine()) != null) 
      { 
       size = s.length(); 
       c = new char[size]; 
       for (int i = 0; i < size; i++) 
       { 
        c[i] = s.charAt(size - i - 1); 
       } 
       String output = c.toString(); 
       String s2 = "To " + parseUserName(output) + ": " 
         + parseMessage(output); 
       toClient.println(s2); 
       server.sendMessage(this.name, parseUserName(output), 
         parseMessage(output)); 

      } 

      // Close the connection 
      fromClient.close(); 
      toClient.close(); 
      this.s.close(); 
      clientThreads.remove(c); 
     } catch (IOException e) {e.printStackTrace();} 
    } 

    public String getUserName() {return name;} 

    public String parseUserName(String s) 
    { 
     Scanner in = new Scanner(s); 
     String temp = in.next(); 
     if (temp.charAt(0) == '/') 
     { 
      temp = temp.substring(1, temp.length()); 
      return temp; 
     } 

     return temp; 

    } 

    public String parseMessage(String s) 
    { 
     Scanner in = new Scanner(s); 
     String temp = in.next(); 
     Boolean firstSpaceCheck = false; 
     for (int i = 0; i < temp.length(); i++) 
     { 
      if (temp.charAt(i) == ' ') 
      { 
       temp = temp.substring(i + 1, temp.length()); 
       firstSpaceCheck = true; 
      } 
     } 
     return temp; 
    } 
} 
} 
+0

你必须有四个不同的变量,三种不同类型的,全称为's'?这使得事情非常难以遵循! –

回答

0

这不是内存地址,它从Object#toString其输出需要的格式

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

在这种情况下,它看起来像[[email protected]它告诉你,你要发送的字符数组Object的输出回到客户端,所以输出是由Object#toString返回的。更换

String output = c.toString(); 

String output = new String(c); 
+0

完全忽略了这一点,谢谢!现在我可以继续尝试弄清楚为什么信息没有发送给收件人:P – user2901273