Java客户端服务器

Java客户端服务器

问题描述:

这个问题在我看来已经超过了一天了,我找不到它的一个修复程序。我正在用Java编写一个聊天应用程序。问题是服务器无法发送消息给客户端,但可以只接收it.Here是我的课:Java客户端服务器

服务器类:

public class Server implements Runnable { 
static InetAddress address; 
static ArrayList<Integer> clients=new ArrayList<Integer>(); 
static ArrayList<Socket> socs=new ArrayList<>(); 
static String message=""; 
static DataOutputStream toClient; 
static ServerSocket socket; 
static Socket socketNew; 
static boolean running=false; 
public Server(InetAddress address){ 
    this.address=address; 

} 
public static void main(String[] args) throws IOException 
{ 
    socket=new ServerSocket(8000); 
    System.out.println("Server started on port 8000"); 
    running=true; 

    while(true) 
    { 
     socketNew=socket.accept(); 
     socs.add(socketNew); 
     address=socketNew.getInetAddress(); 

     System.out.println("connected to client at address: "+address); 

     Server server=new Server(address); 
     new Thread(server).start(); 


    } 
} 


public void run() { 

    { 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream())); 
     String message=br.readLine(); 
     System.out.println(message); 
     for(Socket s:socs)  //sending the above msg. to all clients 
     { 
      OutputStream os=os = s.getOutputStream(); 
      PrintWriter pw = new PrintWriter(os, true); 
      pw.write(message); 
      pw.flush(); 

     } 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 
    } 

    } 
private void message() { 


}  


} 

这里是我的客户端类的相关功能:

private void receive_data() 
    { 
     BufferedReader br; 
     try { 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String message=br.readLine(); 
      console(message); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



    } 
private void send_data() { 

    OutputStream os; 
    try { 
     os = socket.getOutputStream(); 
     PrintWriter pw = new PrintWriter(os, true); 
     pw.println(this.name+": "+textField.getText()); 
     pw.flush(); 
     textField.setText(""); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 




} 

而且,服务器停服任何来自客户端的消息在第一个消息之后。我认为这个问题可以通过在循环内部将run()方法的内容封装在服务器类中来消除。但是它会以这种方式抛出异常。对于上述问题的任何解决方案?

+1

是的,你需要用循环把它括起来。请更改它,并在您的问题中包含它抛出的异常(完整堆栈跟踪)。 – RealSkeptic

+0

这种方法的问题是当我杀死客户端的窗口时,有很多例外,并且这也是无限的。我尝试了类似while(running)的方式,其中running最初为true。如果发现任何异常,我将运行设置为false。但这样,其他客户端也无法发送任何消息到服务器。并且你能帮我解决我的第一个问题吗?为什么客户端无法从服务器收到任何消息? –

+0

他们可以从其他客户端接收消息吗? –

public void run() { 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream())); 
     String message; 
     PrintWriter out; 

     while ((message = br.readLine()) != null) { 
      for (Socket s : socs) // sending the above msg. to all clients 
      { 
       out = new PrintWriter(s.getOutputStream(), true); 
       out.println(message); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

你走了。经过一个小客户的测试,我很快写下了自己,并且很有效。

你绝对应该在你的代码格式上工作。 (主要是那些没有理由的范围括号)。

+0

感谢man.It工作。对格式化部分感到抱歉。这个问题让我感到非常头痛,所以我只是贴了它而不关心缩进。 –