Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中如何将字符串传递到本地服务器_Java_Sockets_Java Io - Fatal编程技术网

在java中如何将字符串传递到本地服务器

在java中如何将字符串传递到本地服务器,java,sockets,java-io,Java,Sockets,Java Io,我创建了一个本地服务器和一个客户端窗口,使它们能够在本地相互通信 服务器和客户端都已创建。我的问题是我需要客户在 JTextField,我想把它传递给服务器。现在,当我检查输入的字符串时,它会显示 该字符串具有空值 这是我的客户代码: import java.io.*; import java.net.Socket; import java.awt.event.*; import javax.swing.*; public class MyClientSide extends JFrame{

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

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

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

该字符串具有空值

这是我的客户代码:

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");

        }

    }



}

谢谢您的帮助

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

你打电话

       connectFrm.setVisible(true);
       connectFrm.setDefaultCloseOperation(EXIT_ON_CLOSE);
但同时,您还需要继续与服务器通信。 记住
JFrame
setVisible
不是阻塞调用。也就是说,无论对话框是否显示,按钮是否按下,它都将直接进入下一个代码而不停止

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

i、 e

在执行的
操作中
功能:

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

            entered = jtxt.getText();
            sendToServer(entered);

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

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

在这个新函数中

输入的
字符串
将不是
null
,而是一个空的
字符串
,它是用来初始化它的值。在用户有机会输入
字符串之前,您正在创建一个
套接字


因为您使用的是Swing,所以最安全的方法是使用。当用户输入新文本后,您就可以执行
Socket
上传操作,而无需阻止
EDT

谢谢。让我试试,我很快就会回复。问题是如果用户未连接到服务器,我不想显示客户端窗口。在这种情况下,如果我将在SendToServer中建立连接,该连接将在ActionPerfomed中调用,那么客户端将能够在连接之前看到窗口。ok,但这里的问题是,我不想在客户端未连接到服务器的情况下显示客户端窗口。当然,您可以按照当前的操作创建
套接字
,但最好不要有潜在的空闲套接字。许多防火墙/路由器在超时后关闭未使用的端口。在此之后尝试执行操作将引发异常。谢谢。我会尽量利用你的建议,我会尽快回复你的建议