【问题标题】:How can i send multiple information from a client application to a server?如何将多个信息从客户端应用程序发送到服务器?
【发布时间】:2020-10-20 02:55:01
【问题描述】:

我是套接字方面的新手,我想知道如何从客户端应用程序的几个文本字段中获取写入的内容,并根据它们来自的文本字段将该数据放入服务器应用程序中的标签中.

到目前为止,我已经在客户端和服务器之间建立了连接,当您按下客户端类中的按钮时,您可以从文本字段发送字符串并成功地将其写入位于服务器类的标签中。

这里有客户端类

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

class Client extends JFrame implements ActionListener{
    JTextField field1;
    JTextField field2;
    JPanel panel;
    JButton btnStart;
    JLabel lblText;

    public Client(){
        panel = new JPanel();
        panel.setLayout(null);

        lblText=new JLabel("CLIENT");
        lblText.setBounds(75,0,150,30);
        field1=new JTextField(20);
        field1.setBounds(10,40,225,30);
        field2=new JTextField(20);
        field2.setBounds(10,80,225,30);
        btnStart=new JButton("Send");
        btnStart.setBounds(75,100,75,30);
        btnStart.addActionListener(this);

        panel.add(btnStart);
        panel.add(field1);
        panel.add(field2);
        panel.add(lblText);

        this.add(panel);
        this.setBounds(600,300,275,500);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public void actionPerformed(ActionEvent event){
        if(event.getSource() == this.btnStart){
            try {
                Socket socket = new Socket("192.168.1.90",9000);
                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                out.writeUTF(field1.getText());
                out.close();
                field1.setText("");/*
                DataOutputStream out2 = new DataOutputStream(socket.getOutputStream());
                out2.writeUTF(field2.getText());
                out2.close();
                */
            }catch (Exception e) {
                System.out.println("Connection failed");
            }

        }
    }
}

服务器类

import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.io.*;

class Server extends JFrame implements Runnable{
  JLabel lblUsername;
  JLabel lblNss;
  JPanel panel;
  Thread thread1;

  public Server(){
    panel= new JPanel();
        panel.setLayout(null);
        lblUsername = new JLabel("");
    lblUsername.setBounds(0,0,150,30);
    lblNss = new JLabel("");
    lblNss.setBounds(0,40,150,30);
    panel.add(lblUsername);panel.add(lblNss);

    thread1 = new Thread(this);
    thread1.start();


        this.add(panel);
    this.setBounds(1200,300,280,350);
        this.setVisible(true);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
  public void run(){
    try {
      ServerSocket server = new ServerSocket(9000); 
      while(true){
        Socket socket = server.accept(); 
        DataInputStream in = new DataInputStream(socket.getInputStream());
        String text_message = in.readUTF();
        lblUsername.setText(text_message);
        //lblNss.setText();
        socket.close();
      }
    }catch (Exception e) {
      e.printStackTrace();
    }

  }
}

【问题讨论】:

  • 我的错,我已经翻译了帖子
  • 你的对象和变量也应该有英文名称。
  • @MoritzSchmidt 不是真的,只要描述是英文的,如果你愿意,你可以使用法文的代码,但它应该足够紧凑以适合minimal reproducible example,这样很容易了解并隔离问题。英文代码不是必须的。
  • 要发送多个字符串,您需要创建自己的自定义对象,将文本字段中的所有信息添加到它,然后发送对象,在服务器端,使用该对象字段来填充标签。
  • @Frakcool 感谢您的反馈,它确实帮助我解决了我的问题

标签: java swing sockets server client


【解决方案1】:

对我来说,它使用 JAX-RS 工作,通过它,您可以发送多个参数作为 url 中的链接,甚至发送对象。对我来说这非常有用,因为所有从 Java 对象到客户端中的 json 的转换(发送到服务器)然后从 json 到服务器中的 java 对象的转换都是透明且易于实现的。

这里是一个接收两个参数的方法的例子:

    @GET
    @Path("/purchase/{title}/{date}")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response extendPurchase(@PathParam("title") String title, @PathParam("date") String date) {
        if(DBManager.extendPurchase(title, date)) {
            return Response.ok().build();
        }else {
            return Response.serverError().build();
        }
    }

这里是一个接收对象的方法的例子 这是服务器中的方法:

    @POST
    @Path("/purchase")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response registerPurchase(Book book){
        if (DBManager.registerPurchase(book))
            return Response.ok().build();
        else
            return Response.serverError().build();
        
    }

这里在客户端调用:

    //Client and server reference
    Client client = ClientBuilder.newClient();
    WebTarget webTarget = client.target("URL");

    //Create an object and send it to the server
    Book b = new Book();
    WebTarget wb = webTarget.path("/purchase");
    Invocation.Builder invocationBuilderWB = wb.request(MediaType.APPLICATION_JSON);
    Response response = invocationBuilderWB.post(Entity.entity(b,  MediaType.APPLICATION_JSON));

希望对你有用。

【讨论】:

  • 您好 Juan,我的代码目前非常简单,实际上是用于学校项目,但我想了解您的代码是如何工作的
  • 当然!您希望我解释哪一部分?
  • 该项目在一个公共仓库中,所以如果你想检查我的代码的某些部分,请随意。 github.com/juan-ud-santos/Deusto-Booking
【解决方案2】:

感谢@Frakcool 的帮助。

“要发送多个字符串,您需要创建自己的自定义对象,将文本字段中的所有信息添加到其中,然后发送对象,在服务器端,使用该对象字段填充标签”

在这里我创建了一个自定义对象,该对象将从文本字段中接收字符串

import javax.swing.*;
import java.awt.*;

class Object extends JFrame{
  String name;
  String nss;

  public Object(String field1, String field2){
   this.name = field1;
   this.nss = field2;
  }
}

这是客户端应用程序的一部分,当按下按钮时,您可以将信息发送到服务器

public void actionPerformed(ActionEvent event){
    if(event.getSource() == this.btnEnviar){
        try {
            Socket socket = new Socket("192.168.1.90",9000); // Server IP
            ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
            Object o = new Object(name.getText(),nss.getText()); //Here I would created the object based on the data from two different JTextFields
            os.writeObject(o);
            os.close();
            name.setText("");
            nss.setText("");
        }catch (Exception e) {
            System.out.println("Connection failed");
        }

    }
}

因此,您需要在服务器中创建对象,如果需要,您可以存储对象的属性

public void run(){
  try {
    ServerSocket server = new ServerSocket(9000);
    while(true){
      Socket socket = server.accept(); 
      ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
      Objeto o = (Objeto)is.readObject();
      lblNombre.setText(o.nombre);
      lblNSS.setText(o.nss);
      socket.close();
    }
  }catch (Exception e) {
    e.printStackTrace();
  }
 }

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2018-09-16
    • 2020-04-06
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多