Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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_Client_Server - Fatal编程技术网

JAVA服务器套接字-帮助它赢得';不发送

JAVA服务器套接字-帮助它赢得';不发送,java,sockets,client,server,Java,Sockets,Client,Server,我已经为此工作了将近一个星期,我已经把它精简到了最基本的代码,客户端仍然不会收到来自客户端的消息。任何帮助都将不胜感激 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.s

我已经为此工作了将近一个星期,我已经把它精简到了最基本的代码,客户端仍然不会收到来自客户端的消息。任何帮助都将不胜感激

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Server {

    Socket socket;
    JTextArea textShow;
    PrintWriter writer;
    static String message;

    JButton buttonSend;

    // LAUNCH
    public static void main(String[] args) throws Exception {
        Server servobj = new Server();
        servobj.Server();

    }

    public void Server() throws Exception {

        // dECLARE
        JFrame frame = new JFrame();
        frame.setTitle("The Server");
        JPanel panel = new JPanel();
        textShow = new JTextArea(10, 40);
        JTextField textSend = new JTextField(35);
        buttonSend = new JButton("SEND");
        JScrollPane scrollPane = new JScrollPane(textShow,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        // INITIALIZE
        frame.getContentPane().add(panel);
        panel.add(textShow);
        textShow.setLineWrap(true);
        panel.add(scrollPane);
        panel.add(textSend);
        panel.add(buttonSend);
        frame.setSize(500, 500);
        frame.setVisible(true);
        setupServer();

    }

    // SETTING UP THE SERVERS
    public void setupServer() throws Exception {

        ServerSocket servSock = new ServerSocket(443);

        socket = servSock.accept();
        System.out.println("Server Socket accepted");

        writer = new PrintWriter(socket.getOutputStream());
        writer.println("Hello");
        System.out.println("MESSAGE SENT");

        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        message = reader.readLine();
        System.out.println(message);

    }

}

似乎你知道问题出在哪里,但你没有到处纠正

在你的客户中,你有

// SETUP SEND MESSAGE
writer = new PrintWriter(socket.getOutputStream());
writer.println("Hello G");
writer.flush();
因此,您意识到,
PrintWriter
不会立即发送您的消息,而是将其放在内部缓冲区中,以便强制发送您调用
flush

但在服务器中,您并没有刷新该消息

writer = new PrintWriter(socket.getOutputStream());
writer.println("Hello");
System.out.println("MESSAGE SENT");
避免此类问题的最简单方法是使用PrintWriter,它将自动刷新,就像使用
println
时一样。这种编写器可以由构造函数创建

我们可以在哪里读到

自动刷新
-布尔值;如果为true,则
println
printf
format
方法将刷新输出缓冲区

请考虑在两个类

中使用这个构造函数
writer = new PrintWriter(socket.getOutputStream(),true);
当您通过
println
发送消息时,它应该自动刷新


在您当前的代码中还存在一些其他可能的问题

  • 您正在创建本地套接字变量,而不是初始化套接字字段
  • 您有与构造函数同名的方法,这不是好的做法,因此

    public void Client(){
    
    }
    
    Client client = new Client();
    client.Client();//<-here you are calling your method
    

您有任何错误吗?我们不需要几码不相关的GUI代码来调试网络问题。请将您的代码简化为一个演示问题的小示例。谢谢Pshemo,我将在代码中实现这些方法,我将告诉您它是否有效:)谢谢Pshemo,它有效!,我对JAVA相当陌生。:)
public void Client(){

}

Client client = new Client();
client.Client();//<-here you are calling your method
Client client = new Client();