【问题标题】:How to pass a string to a local sever in java如何在java中将字符串传递给本地服务器
【发布时间】:2013-04-20 23:01:33
【问题描述】:

我创建了一个本地服务器和一个客户端窗口,让它们在本地相互通信。

服务器和客户端都已创建。我的问题是我需要客户端在

JTextField 我想将它传递给服务器。现在,当我检查输入的字符串时,它会显示

该字符串具有 NULL 值。

这是我的客户端代码:

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

public class MyClientSide extends JFrame{


    public static String userFile;
    public static String entered = "";

    public static String host = "localhost";
    public static int port = 8080;
    public static Socket socket = null;



    public static DataOutputStream out = null; 

    public MyClientSide(){

        JLabel jlbl = new JLabel("File Name: ");
        final JTextField jtxt = new JTextField(20);
        JButton jbtn = new JButton("Upload to Server");
        JPanel jpnl = new JPanel();

        jbtn.addActionListener(new ActionListener(){ 

            public void actionPerformed (ActionEvent e) {//Start of actionPerformed 

                entered = jtxt.getText();


            }

        });


        jpnl.add(jlbl);
        jpnl.add(jtxt);
        jpnl.add(jbtn);
        this.add(jpnl);

    }

    public MyClientSide(String error) {
        // TODO Auto-generated constructor stub

        JLabel jlbl = new JLabel("Please connect to server");

        this.add(jlbl);
    }


    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        String error = "Please connect to server";

        MyClientSide connectFrm = new MyClientSide();

        MyClientSide errorFrm = new MyClientSide(error);

        try {

            socket = new Socket(host,port);

            connectFrm.setTitle("File Transfer Client");
            connectFrm.setSize(500,80);
            connectFrm.setVisible(true);
            connectFrm.setDefaultCloseOperation(EXIT_ON_CLOSE);


                    InputStreamReader(socket.getInputStream()));

            BufferedReader in = new BufferedReader(new     
                    InputStreamReader(socket.getInputStream()));

            out = new DataOutputStream(socket.getOutputStream());

                   out.writeBytes(entered); /*Here is my problem. when I pass this to the server,
                                              The value is NULL. I need to pass a string from 
                                              JTextField*/

        }

        catch (IOException e) {

            errorFrm.setTitle("Error!!!!");
            errorFrm.setSize(200,100);
            errorFrm.setVisible(true);
            errorFrm.setDefaultCloseOperation(EXIT_ON_CLOSE);

            System.err.print("Please connect to server");

        }

    }



}

感谢您的帮助

【问题讨论】:

    标签: java sockets java-io


    【解决方案1】:

    你的问题是你没有等待上传按钮被按下!

    你打电话

           connectFrm.setVisible(true);
           connectFrm.setDefaultCloseOperation(EXIT_ON_CLOSE);
    

    但同时,您将继续与服务器通信。 请记住,setVisibleJFrame 不是阻塞调用。也就是说,无论对话框是否显示,无论按钮是否被按下,它都会不停止直接进入下一个代码。

    您只需在按下按钮后与服务器通信。

    在您的 actionPerformed 函数中:

            public void actionPerformed (ActionEvent e) {//Start of actionPerformed 
    
                entered = jtxt.getText();
                sendToServer(entered);
    
            }
    

    然后创建一个名为sendToServer 的函数,只有在输入数据后才会调用该函数。 把你的try/catch

       try {
            socket = new Socket(host,port);
            ..
    

    在这个新功能中

    【讨论】:

    • 谢谢。让我试试,我会尽快回复。
    • 问题是如果用户没有连接到服务器,我不想显示客户端窗口。在这种情况下,如果我将在将在 ActionPerfomed 中调用的 SendToServer 中建立连接,那么客户端将能够看到连接之前的窗口。
    【解决方案2】:

    entered String 将不是 null,而是一个空的 String,这是它初始化的值。在用户有机会输入String 之前,您正在创建Socket

    由于您使用的是 Swing,因此最安全的方法是使用 SwingWorker。当用户输入新文本后,您可以执行Socket 上传操作,而不会阻止EDT

    【讨论】:

    • 好的,但是这里的问题是我不想在没有客户端连接到服务器的情况下显示客户端窗口。
    • 您当然可以像当前一样创建Socket,但最好不要有潜在的空闲套接字。许多防火墙/路由器会在超时后关闭未使用的端口。在此之后尝试执行操作将引发异常。
    • 谢谢。我会尝试使用您的建议,我会尽快回复
    • 感谢您的建议
    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 2013-05-31
    • 2012-04-10
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2019-02-14
    相关资源
    最近更新 更多