【问题标题】:JAVA SERVER SOCKET - Help it won't sendJAVA SERVER SOCKET - 帮助它不会发送
【发布时间】:2015-08-10 10:31:22
【问题描述】:

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

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

    }

}
import java.awt.TextField;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
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 Client {

    Socket socket;
    PrintWriter writer;
    static JTextArea textShow;
    TextField textSend;

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

    }

    public void Client() throws Exception {

        // dECLARE
        JFrame frame = new JFrame();
        frame.setTitle("Client");
        JPanel panel = new JPanel();
        textShow = new JTextArea(10, 40);
        JTextField textSend = new JTextField(35);
        JButton 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);

        setupConnections();
    }

    // SETTING UP THE CONNECTION
    public void setupConnections() throws Exception {

        Socket socket = new Socket("localhost", 443);
        System.out.println("Client accepted");

        // SETUP RECIEVE MESSAGE
        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        System.out.println("Done sam");
        String Message = reader.readLine();
        System.out.println(Message);
        System.out.println("Sent");

        // SETUP SEND MESSAGE
        writer = new PrintWriter(socket.getOutputStream());
        writer.println("Hello G");
        writer.flush();
        System.out.println("Network Established");

    }
}

【问题讨论】:

  • 你有什么错误吗?
  • 我们不需要几码无关的 GUI 代码来调试网络问题。请将您的代码简化为一个演示问题的小示例。

标签: java sockets client server


【解决方案1】:

您似乎知道可能是什么问题,但您并没有到处纠正。

在您的客户中有

// SETUP SEND MESSAGE
writer = new PrintWriter(socket.getOutputStream());
writer.println("Hello G");
writer.flush();

所以你意识到PrintWriter 不会立即发送你的消息,而是将它放在内部缓冲区中,所以要强制发送你的ware 调用flush

但在服务器中,您不会刷新该消息

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

避免此类问题的最简单方法是使用 PrintWriter,它会自动刷新,就像您使用 println 时一样。这样的作家可以由PrintWriter(OutputStream out, boolean autoFlush)构造函数创建

我们可以在哪里阅读

autoFlush - 一个布尔值;如果为真,printlnprintfformat 方法将刷新输出缓冲区

所以考虑在两个类中都使用这个构造函数

writer = new PrintWriter(socket.getOutputStream(),true);

当您通过println 发送消息时,它应该会自动刷新。


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

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

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

    您应该删除返回类型 void 以创建该方法的构造函数,这样您的代码将被简化为

    Client client = new Client();
    

【讨论】:

  • 谢谢Pshemo,我将在代码中实现这些方法,我会告诉你它是否有效:)
  • 谢谢 Pshemo,它有效!我对 JAVA 还很陌生。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多