JAVA 服务器套接字 - 帮助它不会发送
JAVA SERVER SOCKET - Help it won't send
我已经为此工作了将近一个星期,我已经将它精简为最基本的代码,但客户端仍然收不到来自客户端的消息。任何帮助将不胜感激。
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");
}
}
看来你知道可能是什么问题,但你没有到处改正。
在你的客户中你有
// 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
时一样。这样的编写器可以通过 PrintWriter(OutputStream out, boolean autoFlush)
构造函数
创建
我们可以在哪里阅读
autoFlush
- A boolean; if true, the println
, printf
, or format
methods will flush the output buffer
因此请考虑在 类
中使用此构造函数
writer = new PrintWriter(socket.getOutputStream(),true);
并且当您通过 println
发送消息时,它应该会自动刷新。
您当前的代码中还有一些其他可能的问题
- 您正在创建本地套接字变量而不是初始化套接字字段
你有与构造函数同名的方法,这不是好的做法,所以不要
public void Client(){
}
Client client = new Client();
client.Client();//<-here you are calling your method
您应该删除 return 类型 void
以创建该方法构造函数,这样您的代码将只减少到
Client client = new Client();
我已经为此工作了将近一个星期,我已经将它精简为最基本的代码,但客户端仍然收不到来自客户端的消息。任何帮助将不胜感激。
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");
}
}
看来你知道可能是什么问题,但你没有到处改正。
在你的客户中你有
// 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
时一样。这样的编写器可以通过 PrintWriter(OutputStream out, boolean autoFlush)
构造函数
我们可以在哪里阅读
autoFlush
- A boolean; if true, theprintln
,printf
, orformat
methods will flush the output buffer
因此请考虑在 类
中使用此构造函数writer = new PrintWriter(socket.getOutputStream(),true);
并且当您通过 println
发送消息时,它应该会自动刷新。
您当前的代码中还有一些其他可能的问题
- 您正在创建本地套接字变量而不是初始化套接字字段
你有与构造函数同名的方法,这不是好的做法,所以不要
public void Client(){ } Client client = new Client(); client.Client();//<-here you are calling your method
您应该删除 return 类型
void
以创建该方法构造函数,这样您的代码将只减少到Client client = new Client();