Java 来自客户端get的第一个字符串';由服务器发送和显示。之后,服务器不再';你不明白吗?
所以我决定尝试创建一个简单的聊天室类型的程序。我已经完成了大部分工作,当我发送消息时,它会在服务器上输出。。除了我只能发送一条消息,之后服务器上什么也没有发生 i、 e: 在客户端输入:“你好,世界!” 服务器上的输出:“你好,世界!” 然后我尝试发送另一条消息: 客户端输入:“服务器先生,为什么你这么随意?” 服务器上的输出:null(它没有说null,只是什么都不做) 这可能是什么原因 客户:Java 来自客户端get的第一个字符串';由服务器发送和显示。之后,服务器不再';你不明白吗?,java,sockets,serversocket,Java,Sockets,Serversocket,所以我决定尝试创建一个简单的聊天室类型的程序。我已经完成了大部分工作,当我发送消息时,它会在服务器上输出。。除了我只能发送一条消息,之后服务器上什么也没有发生 i、 e: 在客户端输入:“你好,世界!” 服务器上的输出:“你好,世界!” 然后我尝试发送另一条消息: 客户端输入:“服务器先生,为什么你这么随意?” 服务器上的输出:null(它没有说null,只是什么都不做) 这可能是什么原因 客户: public class ClientSocket { final static int
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();
}
}
});
}
}
}
发件人:
getOutputStream()抛出IOException
关闭返回的OutputStream将关闭关联的套接字。
当您关闭流时,您也在关闭套接字。服务器端实现也存在同样的问题。因此,要么您需要再次打开插座,要么实际上不关闭它。Hmm。。我猜PrintStream就是OutputStream?我从客户端删除了.close(),从服务器删除了br.close()。还是同样的问题吗?我应该做些别的事情吗?(我最近刚开始学习套接字,我对官方教程(oracle one)一无所知)。英语不是我的母语,很抱歉有任何误解。另外,您需要在循环中从套接字(
br.readLine();
)读取。您发布的示例应用程序只读取了一行,然后就完成了。哦,对了,现在可以正常工作了:D按照您所说的做了,并在br.readLine()上执行了一个while循环。谢谢