import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.*; public class Login extends JFrame implements ActionListener{ JTextField txtUser = new JTextField(); JPasswordField txtPass = new JPasswordField(); JButton loginBtn = new JButton("登陆"); JButton registerBtn = new JButton("注册"); JButton exitBtn = new JButton("退出"); Login(){ this.setSize(250,125); JPanel upPanel = new JPanel(); upPanel.setLayout(new GridLayout(2,2)); JLabel labUser = new JLabel("用户名"); JLabel labPass = new JLabel("密码"); upPanel.add(labUser); upPanel.add(txtUser); upPanel.add(labPass); upPanel.add(txtPass); JPanel downPanel = new JPanel(); downPanel.setLayout(new FlowLayout()); downPanel.add(loginBtn); downPanel.add(registerBtn); downPanel.add(exitBtn); this.setLayout(new BorderLayout()); this.add(upPanel,BorderLayout.CENTER); this.add(downPanel,BorderLayout.SOUTH); loginBtn.addActionListener(this); registerBtn.addActionListener(this); exitBtn.addActionListener(this); } public static void main(String args[]){ JFrame m = new Login(); m.setVisible(true); } public void actionPerformed(ActionEvent arg0){ if(arg0.getActionCommand().equals("登陆")){ String u = txtUser.getText(); String p = txtPass.getText(); String up = u+"%"+p; try{ Socket s = new Socket("localhost",8000); OutputStream os = s.getOutputStream(); OutputStreamWriter osr = new OutputStreamWriter(os); PrintWriter pw = new PrintWriter(osr,true); pw.println(up); InputStream is = s.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String flag = br.readLine(); if(flag.equals("true")){ JFrame m = new QQMain(); m.setVisible(true); } else{ JOptionPane.showMessageDialog(this,"登陆失败请重新登陆"); } } catch(Exception e){ e.printStackTrace(); } } if(arg0.getActionCommand().equals("注册")){ System.out.println("注册"); } if(arg0.getActionCommand().equals("退出")){ System.out.println("退出"); } } }
上面的PrintWriter pw = new PrintWiter(osr,true); 会直接刷新流 ;
但是 如果写成 PrintWritr pw= new PrintWriter(osr); pw.println(flag) ; pw.close(); 则会报错 说socket被关闭 .
这个有点不懂 查了PrintWriter 的close方法
public void <strong>close</strong>()
<dl><dd>关闭该流并释放与之关联的所有系统资源。关闭以前关闭的流无效。</dd></dl>
为什么socket也被关闭了??