java实现聊天室求助

qq_40213652 2018-06-30 04:25:27
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;

public class server implements ActionListener {
int count = 0;
Vector soconly = new Vector();
HashMap sockets = new HashMap();
HashMap socket_thread = new HashMap();
ServerSocket serversocket;
JFrame frame;
JTextArea area = new JTextArea();
JPanel panel = new JPanel();
JButton start = new JButton("启动");
JButton stop = new JButton("停止");

public server() {
panel.add(start);
panel.add(stop);
frame.add(panel, BorderLayout.NORTH);///25
frame.add(area, BorderLayout.CENTER);
frame.pack();
center();
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.setVisible(true);

start.addActionListener(this);
stop.addActionListener(this);
System.out.println("new");
}

public void center() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension e = toolkit.getScreenSize();
int x = e.width / 2 - (int) (frame.getSize().getWidth() / 2);
int y = e.height / 2 - (int) (frame.getSize().getHeight() / 2);
frame.setLocation(x, y);
}

public void actionPerformed(ActionEvent e) {
JButton btn = (JButton) e.getSource();
if (btn == start) {
serverRun serverrun = new serverRun();
System.out.println("gogo");
serverrun.start();
}
if (btn == stop) {
try {
Iterator i = soconly.iterator();
while (i.hasNext()) {
Socket s = (Socket) i.next();
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
person bj = new person();
out.writeObject("系统消息-----服务器马上关闭!!!!!!请马上关闭客户端");
}
count++;
if (count == 2) {
System.exit(0);
}
JOptionPane.showMessageDialog(frame, "已通知客户端,请再次点击关闭按钮关闭");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

class serverRun extends Thread {
public void run(){
try {

serversocket = new ServerSocket(9999);
System.out.println("开始SERVERRUN");
area.append("服务器启动\n");
start.setEnabled(false);
while (true) {
Socket socket = serversocket.accept();
System.out.println("连接成功");
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String name = br.readLine();
area.append("服务器接收用户" + name + "的连接\n");
soconly.add(socket);
Iterator i = soconly.iterator();
while (i.hasNext()) {
Socket s = (Socket) i.next();// 获得其他SOCKET的通信口
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject("系统消息-----" + name + "用户进入" + "------");
}

Vector v = getList();
Iterator j = soconly.iterator();
while (j.hasNext()) {
Socket s = (Socket) j.next();
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(v);
System.out.println("服务器发送用户列表进入");
}

Details d = new Details(socket);
socket_thread.put(name, d);
d.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

class Details extends Thread {
boolean alive = true;
ObjectInputStream in;
ObjectOutputStream out;
Socket socket;

Details(Socket socket) {
this.socket = socket;
}

public void run(){
while(alive){
try{
in = new ObjectInputStream(socket.getInputStream());
person person=(person)in.readObject();
String name=person.getKey();
String content=person.getValue();
if(name.equalsIgnoreCase("all")){
Iterator i=soconly.iterator();
while(i.hasNext()){
Socket s=(Socket)i.next();
out=new ObjectOutputStream(s.getOutputStream());
out.writeObject(content);
System.out.println("Send");
}
}
if(name.equalsIgnoreCase("exit")){
Details thread=(Details)socket_thread.get(content);
thread.alive=false;
area.append(content+"离开\n");
socket.close();
soconly.remove(socket);
sockets.remove(content);
Iterator i=soconly.iterator();
while(i.hasNext()){
Socket s=(Socket)i.next();
out=new ObjectOutputStream(s.getOutputStream());
out.writeObject("系统消息-----"+content+"用户离开"+"------"); }
Vector v=getList();
Iterator j=soconly.iterator();
while(j.hasNext()){
Socket s = (Socket) j.next();
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(v);
System.out.println("服务器发送用户列表离开");
}
}
if(!name.equalsIgnoreCase("all")&!name.equalsIgnoreCase("exit")){
area.append("处理私聊信息");
Socket s=(Socket)sockets.get(name);
out=new ObjectOutputStream(s.getOutputStream());
out.writeObject(content);}
}catch(Exception e)
{e.printStackTrace();}
}
}
}


public Vector getList() {
Vector v = new Vector();
Set set = sockets.keySet();
Iterator i = set.iterator();
while (i.hasNext()) {
v.add(i.next());
}
return v;
}
public static void main(String args[]){
new server(); }///182
}

运行后服务器的小窗口弹不出来,出现以下问题,求大神解答!!!!感激!!!!

Exception in thread "main" java.lang.NullPointerException
at chat.server.<init>(server.java:25)
at chat.server.main(server.java:182)
...全文
1399 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingmax54212008 2018-10-16
  • 打赏
  • 举报
回复
核心是sockect这块。
2dot5 2018-09-27
  • 打赏
  • 举报
回复
可以参考一下这个简单的即时聊天
隐语者 2018-09-07
  • 打赏
  • 举报
回复
3楼正解,话说评论必须要6个字符,贼坑!
叮咚呛咚呛 2018-09-06
  • 打赏
  • 举报
回复
首先你需要一个这个来优化你的socket,
https://download.csdn.net/download/jkl012789/10647635
当然如果不想直接用封装好的socket包,那么你可以去看源码,基本都有注释
https://github.com/yunwang1949/WSocket/tree/master
zhuailhw123 2018-08-21
  • 打赏
  • 举报
回复
JFrame frame = new JFrame();
hyhssm 2018-08-20
  • 打赏
  • 举报
回复
我之前也写了一个聊天室,可以参考下
https://github.com/hyhroot/LiaoTian.git
verejava 2018-08-09
  • 打赏
  • 举报
回复
聊天室有个手机版的 ,可以参考一下

http://www.verejava.com/?id=17478705812238

天意young 2018-08-09
  • 打赏
  • 举报
回复
JFrame frame没有实例化

引用 2 楼 wang135139 的回复:
JFrame frame; 没有new 当然空指针


引用 3 楼 qq_39705793 的回复:
将第二十五行改写成如下代码:
JFrame frame = new JFrame();
me and you 2018-08-08
  • 打赏
  • 举报
回复
请问在创建窗口时,为什么关闭窗口事件需要重写而缩放和最小化窗口事件不需要重写就可以执行?
起床搬砖 2018-08-03
  • 打赏
  • 举报
回复
没有牛
松鼠不是鼠 2018-08-03
  • 打赏
  • 举报
回复
顶3楼说的
码龙3 2018-07-27
  • 打赏
  • 举报
回复
将第二十五行改写成如下代码: JFrame frame = new JFrame();
寸辰 2018-07-05
  • 打赏
  • 举报
回复
JFrame frame; 没有new 当然空指针
Ma_Da_O007 2018-06-30
  • 打赏
  • 举报
回复
你的jframe没有new出来,也没有设置大小。
更想问的是,这是一种什么奇怪的框架吗?把面板写到监听里面的?

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧