java - 如何将多个信息从客户端应用程序发送到服务器?
问题描述
我是套接字方面的新手,我想知道如何从客户端应用程序的几个文本字段中获取写入的内容,并根据它们来自的文本字段将该数据放入服务器应用程序中的标签中。
到目前为止,我在客户端和服务器之间建立了连接,当您按下客户端类中的按钮时,您可以从文本字段发送字符串并成功地将其写入位于服务器类的标签中。
在这里,我有 Client 类
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();
}
}
}
解决方案
感谢@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();
}
}
推荐阅读
- ios - 应用程序因 iOS 13.2 中的 cpu 使用而终止
- javascript - 如何在 Laravel 中使用 JQuery / JavaScript 检查复选框
- reactjs - Electron setSize 方法和 ReactJS
- html - 滚动上的“位置:固定”图像
- c - 在 C 中的系统调用中传递变量
- typescript - 获取泛型对象成员的编译时类型
- google-maps - 如何使用 NOX Emulator 获取我在 Android Studio 中的当前位置?
- firebase - Flutter Navigator 从 firebase 推送数据
- reactjs - 如何在 React.js 中切换摄氏度和华氏度?
- android - 错误 prebuild react-native, build.gradle