gpt4 book ai didi

java - 来自客户端的第一个字符串由服务器发送并显示。之后服务器就没有收到了吗?

转载 作者:行者123 更新时间:2023-12-01 12:35:55 24 4
gpt4 key购买 nike

所以我决定尝试创建一个简单的聊天室类型的程序。我已经完成了大部分工作,当我发送一条消息时,它会在服务器上输出..除了我只能发送一条消息,之后服务器上什么也没有发生。

即:客户端输入:“Hello world!”

服务器上的输出:“Hello world!”

然后我尝试发送另一条消息:客户端输入:“服务器先生,为什么你这么随意?”

服务器上的输出:null(它并没有说 null,它只是根本不执行任何操作)

这可能是什么原因造成的?

客户:

public class ClientSocket {

final static int PORT = 5921;

public static void main(String[] args) throws IOException
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
JPanel panel = new JPanel();
final JTextField field = new JTextField(20);
JLabel l = new JLabel("Enter a message and see it on the server...");

panel.add(field);
panel.add(l);
frame.add(panel);

frame.setVisible(true);

final Socket sock = new Socket("90.231.151.132", PORT);
final PrintStream ps = new PrintStream(sock.getOutputStream());

field.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String txt = field.getText();

ps.println(txt);

ps.close();

field.setText("");

}
});

}
}

服务器:

public class ServerSocketTest
{

final static int PORT = 5921;

public static void main(String[] args) throws Exception
{
ServerSocketTest t = new ServerSocketTest();
t.run();
}

public void run() throws Exception
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
JPanel panel = new JPanel();
final JTextArea field = new JTextArea(5, 20);
JButton button = new JButton("Close connection");
field.setEditable(false);
JLabel l = new JLabel("Messages coming from the client is displayed here..");

panel.add(field);
panel.add(l);
panel.add(button);
frame.add(panel);

//frame.add(l);

frame.setVisible(true);

final ServerSocket servSock = new ServerSocket(PORT);
while(true){
Socket sock = servSock.accept();
InputStreamReader ir = new InputStreamReader(sock.getInputStream());
BufferedReader br = new BufferedReader(ir);

String r = br.readLine();

br.close();

System.out.println(r);

field.append(r);

button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
try {
servSock.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
}

最佳答案

来自Socket's JavaDoc :

getOutputStream() throws IOException

...

Closing the returned OutputStream will close the associated socket.

当您关闭流时,您也关闭了套接字。您的服务器端实现也存在同样的问题。因此,您要么需要再次打开套接字,要么实际上不关闭它。

关于java - 来自客户端的第一个字符串由服务器发送并显示。之后服务器就没有收到了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com