具体思路:
1、写一个server服务器,用于监听10001端口,以及处理接收和向客户端发出数据。
2、客户端寻找服务器的ip地址与服务器端口。建立连接。
3、每个客户端与服务器建立连接后,创建一个InputStream流和一个OutputStream流用于传输数据。
同时客户端将自己的用户信息对象通过ObejcetOutputStream流传输过来。
4、服务器同时为客户端开启一个线程,用于while(true)死循环接收所发来的信息。
5、服务器根据用户信息的不同权限,处理信息,并将消息发送给每个客户端,使每个客户端可见。
补充内容:
1、编写一个登陆界面,用于输入你的用户名。(已实现)
2、编写一个聊天窗口,用于收发数据。(已实现)
3、用户分为两种不同的权限,普通用户与管理员。(已实现)
4、管理员拥有踢人、禁言功能,普通用户拥有私聊功能(待实现)。
写的乱七八糟- -!,看看就好
package chat;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class Login extends Thread{
static JTextArea user,psd;
static JButton jbLogin, jbExit;
static String usname="";
static ObjectOutputStream os;
static DataInputStream dis;
static DataOutputStream dos;
static String ReadIn=" ";
static Login thread;
static User u1;
public void show() {
JFrame Loginmenu=new JFrame();
Loginmenu.setLayout(null);
user=new JTextArea();//新建一个文本框
user.setBorder(BorderFactory.createTitledBorder("你的名字"));//给这个文本框添加标题
Loginmenu.add(user);//将一个文本框加入面板之中
user.setBounds(120, 75, 260, 50);//设置这个文本框的(x轴,y轴,长,宽)
psd=new JTextArea();//新建一个文本框
psd.setBorder(BorderFactory.createTitledBorder("待定"));//给这个文本框添加标题
Loginmenu.add(psd);//将一个文本框加入面板之中
psd.setBounds(15, 380, 660, 200);//设置这个文本框的(x轴,y轴,长,宽)
jbLogin=new JButton("登录");//新建一个按钮
jbLogin.setBounds(280, 250, 100, 50);//设置这个按钮的位置大小
Loginmenu.add(jbLogin);//将一个组件加入面板之中
jbExit=new JButton("退出");//新建一个按钮
jbExit.setBounds(120, 250, 100, 50);//设置这个按钮的位置大小
Loginmenu.add(jbExit);//将一个组件加入面板之中
//下面是按钮监听器
jbLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
usname=user.getText();//获取用户名
Loginmenu.setVisible(false);
Menu.show();
thread.start();
}
});
Loginmenu.setSize(500,400);//设置整个面板的大小
Loginmenu.setVisible(true);//将整个面板设置为可见
}
public static void main(String[] args) throws IOException, InterruptedException {
Login l=new Login();
l.show();
thread = new Login();
}
public static void send() throws IOException {
System.out.println(u1.talk);
if(u1.talk) {
dos.writeUTF(Menu.Chat);
}
else {
Menu.readW.append("你已被禁言!\n");
}
}
public void run(){
try {
super.run();
u1=new User(usname);
u1.ip=InetAddress.getLocalHost().getHostAddress();
// 1:连接对象
Socket out = new Socket("192.168.101.177",10001);
// 2:创建流对象 发送数据信息与接收数据
os = new ObjectOutputStream(out.getOutputStream());
dis = new DataInputStream(out.getInputStream());
dos = new DataOutputStream(out.getOutputStream());
// 3:写出数据到服务器
os.writeObject(u1);
while(true) {
ReadIn=dis.readUTF();
Menu.readW.append(ReadIn);
Menu.readW.setCaretPosition(Menu.readW.getText().length());
}
}
catch(IOException e) {
System.out.println("错误!");
}
}
}
package chat;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class Login extends Thread{
static JTextArea user,psd;
static JButton jbLogin, jbExit;
static String usname="刘建宏";
static ObjectOutputStream os;
static DataInputStream dis;
static DataOutputStream dos;
static String ReadIn=" ";
static Login thread;
static User u1;
public void show() {
JFrame Loginmenu=new JFrame();
Loginmenu.setLayout(null);
user=new JTextArea();//新建一个文本框
user.setBorder(BorderFactory.createTitledBorder("你的名字"));//给这个文本框添加标题
Loginmenu.add(user);//将一个文本框加入面板之中
user.setBounds(120, 75, 260, 50);//设置这个文本框的(x轴,y轴,长,宽)
psd=new JTextArea();//新建一个文本框
psd.setBorder(BorderFactory.createTitledBorder("待定"));//给这个文本框添加标题
Loginmenu.add(psd);//将一个文本框加入面板之中
psd.setBounds(15, 380, 660, 200);//设置这个文本框的(x轴,y轴,长,宽)
jbLogin=new JButton("登录");//新建一个按钮
jbLogin.setBounds(280, 250, 100, 50);//设置这个按钮的位置大小
Loginmenu.add(jbLogin);//将一个组件加入面板之中
jbExit=new JButton("退出");//新建一个按钮
jbExit.setBounds(120, 250, 100, 50);//设置这个按钮的位置大小
Loginmenu.add(jbExit);//将一个组件加入面板之中
//下面是按钮监听器
jbLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
usname=user.getText();//获取用户名
Loginmenu.setVisible(false);
Menu.show();
thread.start();
}
});
Loginmenu.setSize(500,400);//设置整个面板的大小
Loginmenu.setVisible(true);//将整个面板设置为可见
}
public static void main(String[] args) throws IOException, InterruptedException {
Login l=new Login();
l.show();
thread = new Login();
}
public static void send() throws IOException {
System.out.println(u1.talk);
if(u1.talk) {
dos.writeUTF(Menu.Chat);
}
else {
Menu.readW.append("你已被禁言!\n");
}
}
public void run(){
try {
super.run();
u1=new User(usname);
u1.ip=InetAddress.getLocalHost().getHostAddress();
// 1:连接对象
Socket out = new Socket("192.168.101.177",10001);
// 2:创建流对象 发送数据信息与接收数据
os = new ObjectOutputStream(out.getOutputStream());
dis = new DataInputStream(out.getInputStream());
dos = new DataOutputStream(out.getOutputStream());
// 3:写出数据到服务器
os.writeObject(u1);
while(true) {
ReadIn=dis.readUTF();
Menu.readW.append(ReadIn);
Menu.readW.setCaretPosition(Menu.readW.getText().length());
}
}
catch(IOException e) {
System.out.println("错误!");
}
}
}
package chat;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Menu {
static JFrame MenuC;
static JTextArea readW;
static JTextArea writeW;
static JButton jbSend;
static JButton jbExit;
static String Chat="0";
static JScrollPane JspRead;
public static void show() {
JFrame MenuC=new JFrame();
MenuC.setLayout(null);
readW=new JTextArea();//新建一个文本框
readW.setBorder(BorderFactory.createTitledBorder("聊天内容"));//给这个文本框添加标题
//readW.setBounds(15, 10, 660, 350);//设置这个文本框的(x轴,y轴,长,宽)
readW.setEditable(false);
JspRead = new JScrollPane();//增加一个滚动条
JspRead.setViewportView(readW);
//JspRead.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JspRead.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JspRead.setBounds(10, 5, 680, 360);
MenuC.add(JspRead);
//MenuC.add(readW);//将一个文本框加入面板之中
writeW=new JTextArea();//新建一个文本框
writeW.setBorder(BorderFactory.createTitledBorder("输入内容"));//给这个文本框添加标题
MenuC.add(writeW);//将一个文本框加入面板之中
writeW.setBounds(15, 380, 660, 200);//设置这个文本框的(x轴,y轴,长,宽)
jbSend=new JButton("发送");//新建一个按钮
jbSend.setBounds(550, 600, 100, 50);//设置这个按钮的位置大小
MenuC.add(jbSend);//将一个组件加入面板之中
jbExit=new JButton("退出");//新建一个按钮
jbExit.setBounds(400, 600, 100, 50);//设置这个按钮的位置大小
MenuC.add(jbExit);//将一个组件加入面板之中
MenuC.setSize(750,700);//设置整个面板的大小
MenuC.setVisible(true);//将整个面板设置为可见
jbSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Chat=writeW.getText();//获取聊天内容
try {
Login.send();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
writeW.setText("");
}
});
}
}
package chat;
import java.io.Serializable;
public class User implements Serializable{
public String name;
public int power;
public boolean talk;
public String ip;
public User(String name) {
this(name,1,true);//默认权限为1,可以发言
}
public User(String name,int power,boolean talk) {
this.name=name;
this.power=power;
this.talk=talk;
}
}