赞
踩
public void run() { // TODO 自动生成的方法存根 String line=""; try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); while((line=br.readLine())!=null) { if(line.equals("quit")) { System.out.println("客户端"+num+"断开"); break; } System.out.println(line); //line+="\n"; for(Socket s : sockets) {//严格for循环 print_out(s,line); System.out.println(s); } /*bw.write(line.toUpperCase()); bw.newLine(); bw.flush();*/ } } catch (IOException e) { // TODO 自动生成的 catch 块 //e.printStackTrace(); System.out.println("线程异常"); } } private void print_out(Socket s,String msg) { try { BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); bos.write(msg); bos.newLine(); bos.flush(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }
2.客户端线程
public class clientRead implements Runnable { private Socket socket; String content2;//打印你传进来的内容 public clientRead(Socket socket) { super(); this.socket = socket; } public void run() { // TODO 自动生成的方法存根 try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true) { content2=br.readLine(); content2+="\n"; if(content2 != null && !content2.trim().equals("")) UIcode.chatContent.append(content2);//将读取的数据追加到文本域后面 // System.out.println(1); } } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
3.用户名验证成功后
public UIcode(String username) {//检查用户名后,启动服务器。 this.username = username; try { socket = new Socket("127.0.0.1",8000); bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); } catch (UnknownHostException e2) { // TODO 自动生成的 catch 块 e2.printStackTrace(); } catch (IOException e2) { // TODO 自动生成的 catch 块 e2.printStackTrace(); } new Thread(new clientRead(socket)).start(); public static void myWrite(String str,BufferedWriter bw2) { try { bw2.write(str); bw2.newLine(); bw2.flush(); } catch (UnknownHostException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }
4.java界面
public class login extends JFrame//图形界面容器 JFrame { JPanel mb1,mb2,mb3;//面板容器类 JButton an1,an2;//按钮组件 JLabel bq1,bq2;//标签组件 一个标签,本身是用于显示信息的,一 般情况下是不能直接更改器显示内容的 JTextField wbk;//轻量级组件,它允许编辑单行文本 JPasswordField mmk;//一个只能输入数字的密码框 static String username; static char[] password; public static void main(String[] args) { login lx=new login(); } login() { mb1=new JPanel(); mb2=new JPanel(); mb3=new JPanel(); bq1=new JLabel("用户名"); bq2=new JLabel("密 码"); an1=new JButton("登录"); an2=new JButton("注册"); wbk=new JTextField(10);//具有指定列数的新的空TextField mmk=new JPasswordField(10); this.setLayout(new GridLayout(3,1));//来设置用户界面上的屏幕组件的格式布局 GridLayout 网格布局 3行1列 mb1.add(bq1); mb1.add(wbk); mb2.add(bq2); mb2.add(mmk); mb3.add(an1); mb3.add(an2); an1.addActionListener(new ActionListener() {//为按担组件注册 ActionListener 监听 。在制发生操作事件时,调用该对象 actionPerformed 方法。JButton中的方法 @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 username=wbk.getText(); password=mmk.getPassword(); // System.out.println(username); // System.out.println(password); boolean flag=myCheck(username,password);//调用数据库工具类中的方法,检查用户名和密码是否与数据库一致。 if(flag) { UIcode ui = new UIcode(username); setVisible(false);//将窗口隐藏 } else { //显示用户或密码错误or wbk.setText(""); mmk.setText(""); JOptionPane.showMessageDialog(null, "用户名或密码错误", "警告", JOptionPane.PLAIN_MESSAGE);//(确定Frame在其中显示的对话框,提示框里显示的信息,可以改变窗体的主题信息,设置了信息提示内容的图标) } //关掉登录窗口 } }); an2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 register rg = new register(); } }); this.add(mb1); this.add(mb2); this.add(mb3); this.setTitle("用户登录"); this.setSize(500,300); this.setLocation(300,280); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); }
5.关于输入输出流的理解
输入流是将资源数据读入到缓冲Buffer中
输出流是将Buffer中的数据按照规定格式写入到指定位置
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。