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
public void Client(){
}
Client client = new Client();
client.Client();//<-here you are calling your method
Client client = new Client();