2016-12-01 108 views
0

这是我的服务器。顺便说一句,我正在使用JFrame。其实我有很多电脑的时候,我在PC 1上运行服务器,然后在PC 2和PC 3上的客户端。PC 3客户端连接,但服务器无法接收消息。 pc 2客户端已连接。如何使用1台服务器执行多个客户端?

package server; 
import java.net.*; 
import java.io.*; 

public class FrmServer extends javax.swing.JFrame { 

ServerSocket providerSocket; 
Socket connection=null; 
ObjectOutputStream out; 
ObjectInputStream in; 
String message; 

//To run the connection 
public void run(){ 

用于连接

try{ 
     providerSocket = new ServerSocket(9090); 
     msgArea.append("Waiting for connection...."); 
     connection = providerSocket.accept(); 

     out = new ObjectOutputStream(connection.getOutputStream()); 
     out.flush(); 

     in = new ObjectInputStream(connection.getInputStream()); 
     sendmessage("Connection is successful..."); 

     while(true){ 
      message = (String)in.readObject(); 

      if(!message.isEmpty()) 
       msgArea.append("\nClient: "+message); 
     } 

    } 
    catch(Exception e){ 

    } 

} 

public void sendmessage(String msg){ 

    try{ 
     out.writeObject(msg); 
     out.flush(); 
     msgArea.append("\nServer: "+msg); 
    }catch(Exception e){ 

    } 
} 

/** 
* Creates new form FrmServer 
*/ 
public FrmServer() { 
    initComponents(); 
} 

private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    sendmessage(txt.getText()); 
} 
public static void main(String args[]) { 
FrmServer s = new FrmServer(); 
    s.setVisible(true); 
    s.run(); 

} 

客户

package client; 

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

public class FrmClient extends javax.swing.JFrame { 

Socket requestSocket; 
ObjectInputStream in; 
ObjectOutputStream out; 
String message; 
/** 
* Creates new form FrmClient 
*/ 
public FrmClient() { 
    initComponents(); 
} 

public void run(){ 

    try{ 
     requestSocket = new Socket("10.99.225.12",9090); 
     msgArea.append("Connected to the server..."); 

     out = new ObjectOutputStream(requestSocket.getOutputStream()); 
     out.flush(); 

     in = new ObjectInputStream(requestSocket.getInputStream()); 

     while(true){ 
      message = (String)in.readObject(); 

      if(!message.isEmpty()); 
       msgArea.append("\nServer: "+message); 
     } 
    } 
    catch(Exception e){ 

    } 

} 

public void sendmessage(String msg){ 

    try{ 
     out.writeObject(msg); 
     out.flush(); 

     msgArea.append("\nClient: "+msg); 
    } 
    catch(Exception e){ 

    } 

} 

private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    sendmessage(txt.getText()); 
} 
private void formWindowClosing(java.awt.event.WindowEvent evt) {         
    // TODO add your handling code here: 

    try{ 
     sendmessage("Got to go.. Goodbye!"); 
     in.close(); 
     out.close(); 
     requestSocket.close(); 
    } 
    catch(Exception e){ 

    } 

} 
public static void main(String args[]) { 
FrmClient c = new FrmClient(); 
    c.setVisible(true); 
    c.run(); 
} 
+2

您标记将q多线程。所以你显然已经知道答案... – Fildor

+0

在本教程的最后(http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html),你可以找到一个简单的例子,做到这一点。 – PeterMmm

回答

0

你必须为每个套接字(客户端)线程和处理它们。

到目前为止,我看到,只有一个连接,因为你初始化connection只有一次。

您可以创建一个列表,使用所有套接字以及从它们的输入/输出流写入/读取/读取。

0

您需要一个专用线程来连续侦听连接。

一旦接受连接,为每个接受的连接创建两个线程,一个用于读取传入数据,另一个用于将数据写入套接字。

这是对代码的简单修改,虽然它可以用更好的方式编写。

  1. 使您的JFrame类实现Runnable。

    public class FrmServer extends javax.swing.JFrame implements Runnable 
    
  2. 实现run方法在你的JFrame类

    @Override 
    public void run() { 
        while (true) { 
         try { 
          msgArea.append("Waiting for connection...."); 
          connection = providerSocket.accept(); 
          new ConnectionWriter(connection, msgArea).start(); 
          new ConnectionReader(connection, msgArea).start(); 
         } catch (IOException ex) { 
          System.err.out(ex); 
         } 
        } 
    } 
    
  3. 创建一个线程写入套接字

    public class ConnectionWriter extends Thread { 
    
        ObjectOutputStream out; 
        Socket connection; 
        JTextArea msgArea; 
    
        public ConnectionWriter(Socket connection, JTextArea msgArea) { 
         this.connection = connection; 
         this.msgArea = msgArea; 
        } 
    
        @Override 
        public void run() { 
         try { 
          out = new ObjectOutputStream(connection.getOutputStream()); 
          out.flush(); 
          sendmessage("Connection is successful..."); 
         } catch (IOException e) { 
          System.out.println(e); 
         } 
        } 
    
        public void sendmessage(String msg) { 
    
         try { 
          out.writeObject(msg); 
          out.flush(); 
          msgArea.append("\nServer: " + msg); 
         } catch (IOException e) { 
          System.err.println(e); 
         } 
        } 
    } 
    
  4. 创建一个线程从套接字读取。

    public class ConnectionReader extends Thread { 
    
        ObjectInputStream in; 
        Socket connection; 
        JTextArea msgArea; 
    
        public ConnectionReader(Socket connection, JTextArea msgArea) { 
         this.connection = connection; 
         this.msgArea = msgArea; 
        } 
    
        @Override 
        public void run() { 
         try { 
          in = new ObjectInputStream(connection.getInputStream()); 
          while (true) { 
           String message = (String) in.readObject(); 
    
           if (!message.isEmpty()) { 
            msgArea.append("\nClient: " + message); 
           } 
          } 
         } catch (IOException ex) { 
          System.err.out(e); 
         } 
        } 
    
    } 
    
相关问题