服务端

package 夏日聊天室;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class chatServer 
{
private ServerSocket server;
private Socket clientSocket;
private DataInputStream serverin;
private DataOutputStream serverout;
private Waiter[] waiters;
public static final int max = 50;
public static final int noroom = -1;
public chatServer()
{
waiters=new Waiter[max];
int i;
for(i=0;i<max;i++)
{
waiters[i]=null;
}
try 
{
System.out.println("建立服务器中...");
server=new ServerSocket(54188);

} catch (IOException e) 
{

e.printStackTrace();
}
}
public int getFreeWaiter()
{
int index;
for(index=0;index<waiters.length&&waiters[index]!=null;index++)
;
if(index>=max)
index=noroom;
return index;
}

public void  listenning()
{
boolean ok=true;
String mess;
while (ok)
{
try 
{
System.out.println("倾听中...");
clientSocket=server.accept();
System.out.println(clientSocket.getInetAddress()+"接入");
int i;
i=getFreeWaiter();
if(i!=noroom)
{
waiters[i]=new Waiter(clientSocket,i);
waiters[i].start();
}
else
{
serverin=new DataInputStream(clientSocket.getInputStream());
serverout=new DataOutputStream(clientSocket.getOutputStream());
serverout.writeUTF("O\n");
mess = serverin.readUTF();
serverin.close();
serverout.close();
clientSocket.close();
}
} catch (IOException e) 
{

e.printStackTrace();
ok=false;
}
}
}
class Waiter extends Thread
{
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private int index;
private String nickName;
boolean goon=true;

public Waiter(){}
public Waiter (Socket socket,int index)
{
this.socket=socket;
this.index=index;
try 
{
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
} catch (IOException e) 
{

e.printStackTrace();
}
}
private void dealMessage(String mess)
{
String[] detailMess;
String command;

detailMess=mess.split("\n");
command=detailMess[0];
if(command.equals("hello"))
{
nickName=detailMess[1];
try 
{
out.writeUTF("youare\n"+(index+100+"").substring(1));
int i;
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
out.writeUTF("Friend\n"+(waiters[i].index+101+"").substring(1)+waiters[i].nickName);
}
}
String newFriend=((index+101+"").substring(1)+""+nickName);
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
waiters[i].out.writeUTF("New\n"+newFriend);
}
}
} catch (IOException e) 
{
// TODO 异常关闭
goon=false;
e.printStackTrace();
}
}
else if(command.equals("bye"))
{
try 
{
out.writeUTF("bye\n");
int i;
String offFriend=((index+101+"").substring(1)+""+nickName);
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
waiters[i].out.writeUTF("off\n"+offFriend);
}
}

} catch (IOException e) 
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
goon=false;
}
else if(command.equals("all"))
{
int i;
for(i=0;i<waiters.length;i++)
{
if(waiters[i]!=null&&i!=index)
{
try 
{
waiters[i].out.writeUTF(mess);
} catch (IOException e) 
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
goon=false;
}
else if(command.equals("sigle"))
{
try 
{
int targetIndex=Integer.parseInt(detailMess[3]);
String  Message=detailMess[0]+"\n"+detailMess[2]+"\n"+detailMess[5];
waiters[targetIndex].out.writeUTF(Message);

} catch (IOException e) 
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
goon=false;
}

}
public void run()
{
String mess;
while (goon)
{
try 
{
mess=in.readUTF();
dealMessage(mess);
} catch (IOException e) 
{

e.printStackTrace();
goon=false;
}
}
try 
{
System.out.println(socket.getInetAddress()+"下线了");
in.close();
out.close();
socket.close();
waiters[index]=null;
} catch (IOException e) 
{

e.printStackTrace();
}

}
}
public static void main(String[] args)
{
chatServer cs=new chatServer();
cs.listenning();
}
}

客户端

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class chatClient 
{
private JFrame jfrmMain;
private Container container;
private JLabel  jlblTopic;
private JTextArea jtxaChatContent;
private JScrollPane jscpChatContent;
private JLabel jlblFriendList;
private DefaultListModel  dimFriendList;
private JList jlstFriendList;
private JScrollPane jscpFriendList;
private JLabel jlblSystemInformation;
private DefaultListModel  dimSystemInformation;
private JList jlstSystemInformation;
private JScrollPane jscpSystemInformation;
private JLabel jlblCurrentFriendTopic;
private JLabel jlblCurrentFriend;
private JLabel jlblNickName;
private JTextField jtxtMessage;
private JPasswordField jpsd;
private JButton jbtnExit;
private JButton jbtnSend;
private String nickName;
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private int index;
public chatClient(String nickName)
{
this.nickName=nickName;
initFrame();
reinitFrame();
try 
{
linkServer();
new Listenner();

Thread.sleep(500);
out.writeUTF("hello\n"+nickName);
} catch (Exception e) 
{

showMessage(jfrmMain,e.getMessage()+"\n连接服务器失败");
jfrmMain.dispose();
}
dealAction();

}

private void showMessage(JFrame jfrm,String mess)
{
JOptionPane.showMessageDialog(jfrm, mess,"系统提示",JOptionPane.DEFAULT_OPTION);
}

private void linkServer() throws Exception
{
try
{
socket=new Socket("localhost",54188);

}catch(IOException e)
{
throw new Exception("Class:chatClient:\nlinkServer\nError:连接服务器失败");

}

try 
{
in=new DataInputStream(socket.getInputStream());

} catch (IOException e) 
{

throw new Exception("输入通信信道失败");
}
try 
{
out=new DataOutputStream(socket.getOutputStream());

} catch (IOException e) 
{

throw new Exception("输出通信信道失败");
}

}

public void initFrame()
{
Dimension dim;

Font normalFont=new Font("宋体",Font.PLAIN,16);
//窗口实现
jfrmMain=new JFrame("聊天室");
container=jfrmMain.getContentPane();
container.setLayout(null);
jfrmMain.setFont(normalFont);
jfrmMain.setSize(11200/15,9045/15);
 //居中工作
dim=Toolkit.getDefaultToolkit().getScreenSize();
jfrmMain.setLocation((dim.width-jfrmMain.getWidth())/2,(dim.height-jfrmMain.getHeight())/2);

jfrmMain.setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\zhao\\Desktop\\java\\夏日聊天室\\图片\\图标.jpg"));
jfrmMain.setVisible(true);
jfrmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//标题
jlblTopic=new JLabel("嘻嘻哈哈聊天室");
jlblTopic.setFont(new Font("宋体",Font.PLAIN,36));
jlblTopic.setForeground(Color.gray);
jlblTopic.setBounds(3592/15,0,3780/15,525/15);
container.add(jlblTopic);

//带滚动条的文本框,聊天框
jtxaChatContent=new JTextArea();
jscpChatContent=new JScrollPane(jtxaChatContent);
jtxaChatContent.setFont(normalFont);
jscpChatContent.setBounds(1575/15,670/15,7815/15,6690/15);
container.add(jscpChatContent);

//在线好友
jlblFriendList=new JLabel("好友列表");
jlblFriendList.setFont(normalFont);
jlblFriendList.setBounds(315/15,525/15,960/15,240/15);
container.add(jlblFriendList);

dimFriendList=new DefaultListModel();
jlstFriendList=new JList(dimFriendList);
jscpFriendList=new JScrollPane(jlstFriendList);
jlstFriendList.setFont(normalFont);
jscpFriendList.setBounds(75/15,825/15,1440/15,5820/15);
container.add(jscpFriendList);
//系统消息
jlblSystemInformation=new JLabel("系统消息");
jlblSystemInformation.setFont(normalFont);
jlblSystemInformation.setBounds(9690/15,525/15,960/15,240/15);
container.add(jlblSystemInformation);

dimSystemInformation=new DefaultListModel();
jlstSystemInformation=new JList(dimSystemInformation);
jscpSystemInformation=new JScrollPane(jlstSystemInformation);
jlstSystemInformation.setFont(normalFont);
jscpSystemInformation.setBounds(9450/15,825/15,1440/15,5820/15);
container.add(jscpSystemInformation);

jlblCurrentFriendTopic=new JLabel("当前好友");
jlblCurrentFriendTopic.setFont(normalFont);
jlblCurrentFriendTopic.setBounds(315/15,6750/15,960/15,240/15);
container.add(jlblCurrentFriendTopic);

jlblCurrentFriend=new JLabel("00所有人");
jlblCurrentFriend.setFont(normalFont);
jlblCurrentFriend.setBounds(60/15,7050/15,1470/15,240/15+8);
container. add(jlblCurrentFriend);

jlblNickName=new JLabel("用户昵称");
jlblNickName.setFont(normalFont);
jlblNickName.setBounds(90/15,7575/15,1470/15,245/15+8);
container. add(jlblNickName);

//输入框
jtxtMessage=new JTextField();
jtxtMessage.setFont(normalFont);
jtxtMessage.setBounds(1575/15, 7600/15, 9240/15, 390/15);
container. add(jtxtMessage);
//退出
jbtnExit=new JButton("退出");
jbtnExit.setBounds(150/15,7950/15,990/15,465/15);
jbtnExit.setFont(normalFont);
container.add(jbtnExit);
//发送
jbtnSend=new JButton("发送");
jbtnSend.setBounds(9830/15,7950/15,990/15,465/15);
jbtnSend.setFont(normalFont);
container.add(jbtnSend);
}
public void reinitFrame()
{
jscpChatContent.setBorder(BorderFactory.createTitledBorder("聊天记录"));
jlblCurrentFriend.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jlblNickName.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jlblCurrentFriend.setHorizontalAlignment(JLabel.CENTER);
jlblNickName.setHorizontalAlignment(JLabel.CENTER);
dimFriendList.addElement("00所有人");
jlblNickName.setText(nickName);
dimSystemInformation.addElement("您已进入聊天室,请文明聊天");
dimSystemInformation.addElement("祝你聊天愉快");

}
public void saygoodbye()
{
try 
{
out.writeUTF("bye\n");
showMessage(jfrmMain, "您已退出聊天室");
jfrmMain.dispose();
} catch (IOException e1) 
{
// TODO 自动生成的 catch 块
e1.printStackTrace();
}

}
public void dealAction()
{
jbtnSend.addActionListener
(
new ActionListener()
{

@Override
public void actionPerformed(ActionEvent e) 
{
String currentFriend=jlblCurrentFriend.getText();
String commandServer;
String speaker;
String speakerIndex;
String receiver;
String receiverIndex;
String messageToServer;
speakerIndex=index+"\n";
speaker=(index+101+"").substring(1)+" "+nickName+"\n";
if(currentFriend.equals("00所有人"))
{
commandServer="all\n";
messageToServer=commandServer+speaker+jtxtMessage.getText();
jtxaChatContent.append("你向所有人喊道:"+jtxtMessage.getText()+"\n");
}

else
{
commandServer="sigle\n";
receiver=jlblCurrentFriend.getText()+"\n";
receiverIndex=receiver.substring(0, 2);
receiverIndex=(Integer.parseInt(receiverIndex)-1)+"\n";
messageToServer=commandServer+speakerIndex+speaker+receiverIndex+receiver+jtxtMessage.getText();
jtxaChatContent.append("你对"+currentFriend+"说:"+jtxtMessage.getText()+"\n");
}

try 
{
out.writeUTF(messageToServer);

jtxtMessage.setText("");
} catch (IOException e1) 
{
// TODO 自动生成的 catch 块
e1.printStackTrace();
}

}

}
);
jtxtMessage.addCaretListener
(
new CaretListener()
{

@Override
public void caretUpdate(CaretEvent e)
{
if(jtxtMessage.getText().trim().length()<=0)
jbtnSend.setEnabled(false);
else 
jbtnSend.setEnabled(true);

}

}
);
jlstFriendList.addListSelectionListener
(
new ListSelectionListener()
{

@Override
public void valueChanged(ListSelectionEvent e) 
{
String selectedFriend;
selectedFriend=jlstFriendList.getSelectedValue().toString();
jlblCurrentFriend.setText(selectedFriend);
}

}
);
jfrmMain.addWindowListener
(
new WindowListener()
{
public void windowClosing(WindowEvent e) 
{
saygoodbye();
}

@Override
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowOpened(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}

}
);
//退出
jbtnExit.addActionListener
(
new ActionListener()
{

@Override
public void actionPerformed(ActionEvent e) 
{
//进行下线操作
saygoodbye();

}

}
);
}

class Listenner extends Thread
{
private boolean goon=true;
public  Listenner()
{
goon=true;

this.start();
}
private void dealMessageFromServer(String mess) 
{
String[] splitMess;
String command;

splitMess=mess.split("\n");
command=splitMess[0];
System.out.print(command);
if(command.equals("youare"))
{
index = Integer.parseInt(splitMess[1]);

}
else if(command.equals("Friend"))
{
String friendInformation=splitMess[1];

dimFriendList.addElement(friendInformation);
}
else if(command.equals("New"))
{
String newFriend=splitMess[1];

dimFriendList.addElement(newFriend);

dimSystemInformation.addElement(newFriend+"上线了");
}
else if(command.equals("off"))
{
String offFriend=splitMess[1];

dimFriendList.removeElement(offFriend);

dimSystemInformation.addElement(offFriend+"下线了");
}
else if(command.equals("all"))
{
jtxaChatContent.append(splitMess[1]+"对所有人说:"+splitMess[2]+"\n");
}
else if(command.equals("sigle"))
{
jtxaChatContent.append(splitMess[1]+"对你说:"+splitMess[2]+"\n");
}
else if(command.equals("bye"))
{
goon=false;
try 
{
in.close();
out.close();
socket.close();

//这里是否还需要处理
jfrmMain.dispose();
} catch (IOException e) 
{

e.printStackTrace();
}
}
}

public void run()
{
String mess=null;

while(goon)
{
try 
{
mess=in.readUTF();

dealMessageFromServer(mess);

} catch (IOException e) 
{
// 服务端异常关闭
goon=false;

}
}
}

}

public static void main(String[] args)
{
chatClient chat;
chat=new chatClient("22");

}
}

java 嘻嘻哈哈聊天室相关推荐

  1. JAVA版聊天室小软件

    这是一篇关于JAVA的聊天室室小软件,用的swing的技术同时也用到了socket.今天发布出来,希望能帮到大家. 文章目录 开发环境 项目结构 下载地址: 一.运行画面展示 二.代码部分 1.客户端 ...

  2. Java+Swing聊天室

    Java+Swing聊天室 一.系统介绍 二.系统展示 1.发送消息 2.清屏 三.系统实现 四.其他 1.其它系统 2.获取源码 一.系统介绍 本系统实现了简单的聊天室功能:发送消息.清屏.退出系统 ...

  3. 2020暑假集训项目——Java简易聊天室

    经过一周的学习与搬砖,我成功的完成了暑假集训的第一个项目--Java简易聊天室,这里对整个项目做一个总结.(文末附下载地址) 本项目支持的功能: 1.可同时开启多个客户端进行多人聊天: 2.可与在线的 ...

  4. 基于java的聊天室系统设计与实现(项目报告+开题报告+答辩PPT+源代码+部署视频)

    项目报告 Java网络聊天室系统的设计与实现 计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有 ...

  5. Java网络聊天室---个人博客

    Java网络聊天室 ---个人博客 一.项目简介 功能描述: 使用图形用户界面和socket通信,能实现一个聊天室中多人聊天,可以两人私聊,可以发送文件. 实现类似QQ用户注册.登录.聊天等功能. 参 ...

  6. java webscoket聊天室

    java webscoket聊天室 http://www.whohelpme.com/chats/index.html 欢迎使用 核心代码 package com.summer.whm.web.con ...

  7. 当年的聊天室,今天的我(java实现聊天室群聊功能)

    预备小知识连接: 小小聊天室,慢慢的回忆啊!(TCP 通信实现) 先看效果 主要可以分为三个层:服务端层,客户端层,还有就是工具层: 服务断层:包括接收数据,以及转发数据(数据输出输入流): 客户端层 ...

  8. java仿聊天室项目总结_Java团队课程设计-socket聊天室(个人总结)

    Java团队课程设计-socket聊天室(个人总结) 一.团队课程设计博客链接 二.本人负责模块或任务说明 任务1 服务端对socket线程的接受以及对客户端的数据转发操作 任务2 数据库的查找,添加 ...

  9. java netty聊天室_netty实现消息中心(二)基于netty搭建一个聊天室

    前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...

最新文章

  1. pandas使用groupby函数和cumsum函数计算每个分组内的数值累加值、并生成新的dataframe数据列( cumulative sum of each group in dataframe
  2. Ubuntu16.04中的可重定位目标文件
  3. 华为、阿里员工在听的英语资源,即将过期,请自取
  4. c 语言中浮点数舍入,浮点数在C中舍入,我不明白为什么
  5. SAP fiori上直接连接到操作系统层面 然后进行相关操作的需求
  6. C++中STL的一些用法的补充
  7. 使用Spring配置LogBack日志记录
  8. js aes加密_某高考咨询网js逆向分析笔记
  9. dva源码解析(一)
  10. java 开发者异常处理_Java异常处理和设计
  11. 判断一个对象是否存在
  12. Redis 如何存储上亿级别的用户状态?
  13. Java关于md5+salt盐加密验证
  14. C语言:字符数字转int
  15. Linux学习--CentOS可视化配置网络
  16. 任正非亲自参与,2021数字化转型再造华为!
  17. 在matlab中讲矩阵一次性检验,层次分析法原理和matlab代码实现
  18. 为什么任何数的0次方都是1
  19. 印章识别--笛卡尔坐标系转换成极坐标系
  20. 基于JAVA东理咨询交流论坛计算机毕业设计源码+系统+数据库+lw文档+部署

热门文章

  1. 魅族6支持html吗,不知道你们发现了么,魅族Flyme6 超好用的隐藏功能
  2. Twinmotion 2020 视频教程-学习笔记
  3. 使用李跳跳·自动关闭运动校园广告
  4. Unity零基础到入门 ☀️| 近万字教程 对 Unity 中的 动画系统基础 全面解析+实战演练,你确定要错过吗?
  5. 《智慧识人术》读书笔记
  6. 你不知道的浏览器页面渲染机制
  7. 电脑选购指南(内含各价位型号最新推选)
  8. 2D 横向对抗射击游戏之美
  9. 本以为java语言很难学,其实就学完下面这些知识,就能理解了
  10. 瑞格科技IPO被终止:曾拟募资5.6亿 江振翔三兄弟为实控人