- 服务器线程
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中的数据按照规定格式写入到指定位置