【问题标题】:How to do multiple clients with 1 server?如何使用 1 台服务器处理多个客户端?
【发布时间】:2017-04-15 16:49:11
【问题描述】:

这是我的服务器。顺便说一句,我正在使用 JFrame。实际上,当我在 pc 1 上运行服务器时,我有很多 pc,然后是 pc 2 和 pc 3 上的客户端。pc 3 客户端连接但服务器无法接收消息。虽然 pc 2 客户端已连接。

 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();
}

【问题讨论】:

  • 您标记了 q 多线程。所以你显然已经知道答案了……
  • tutorial的末尾,您可以找到一个简单的示例。

标签: java multithreading swing client-server java-io


【解决方案1】:

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

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

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

  1. 让您的 JFrame 类实现 Runnable。

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

    @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);
            }
        }
    
    }
    

【讨论】:

    【解决方案2】:

    您必须为每个套接字(客户端)创建一个线程并处理它们。

    到目前为止,我只看到了 一个 连接,因为您只初始化了一次 connection

    您可以创建一个列表,其中包含所有套接字并从/向其输入/输出流写入/读取。

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多