创建服务端程序

public class Server {public static void main(String[] args) {new Thread(new ServerTask()).start(); //执行服务任务}
}/**
*创建服务任务类
*/
class ServerTask implements Runnable {private ServerSocket serverSocket; //服务端口private List<Socket> clients; //客户端列表,用于保存所有客户端的socketpublic ServerTask() {try {serverSocket = new ServerSocket(6666); //初始化服务端口} catch (IOException e) {e.printStackTrace();}if (serverSocket.isBound()) {System.out.println("服务器端口开启成功......");}}@Overridepublic void run() {clients = new ArrayList<>(); //初始化客户端列表try {while (true) {//这里使用循环,一直处理用户请求Socket socket = serverSocket.accept(); //开始接收连接对象,没有用户请求挂起,阻塞。clients.add(socket); //有用户请求后,将该客户端的socket加入客户端列表new Thread(new HandlingClientCheat(socket)).start(); //开启线程处理聊天任务}} catch (Exception e) {e.printStackTrace();}}/*** 定义处理客户端信息的内部类*/class HandlingClientCheat implements Runnable {private Socket socket; //该客户端的socketpublic HandlingClientCheat(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));   //获得网络输入流SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");     Date date = new Date();  //创建一个日期对象,可以显示信息时间String str;while ((str = reader.readLine()) != null) {date.setTime(System.currentTimeMillis());//获取当前时间str = simpleDateFormat.format(date) + "\n" + str;//格式化当前时间System.out.println(str); //服务端输出聊天信息//给其他客户端转发此客户端的信息for (Socket client : clients)if (client != socket) {PrintWriter writer = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));writer.println(str);writer.flush();}}} catch (IOException e) {e.printStackTrace();}}}}

创建客户端程序 | 搭建客户端界面

  • 客户端程序
public class Client {private ClientSendThread clientSendThread; //客户端发送信息线程private ClientFrame clientFrame; //所属的客户端界面private String username; //用户名public Client(ClientFrame clientFrame,String username){this.clientFrame = clientFrame;this.username = username;try {Socket socket = new Socket("localhost", 6666); //根据主机及端口号开启连接,并获得Socket对象if (socket.isConnected())clientFrame.showText.append("服务器连接成功.....\n\n");clientSendThread = new ClientSendThread(socket);clientSendTask.start();//创建并开启发送信息线程new ClientReceiveThread(socket).start();//创建并开启接收信息线程} catch (IOException e) {clientFrame.showText.append("服务器连接失败,请检查服务器是否开启.....");e.printStackTrace();}}public ClientSendThread getClientSendThread() {return clientSendTask;}/**
*创建一个处理发送信息的内部类
*/class ClientSendThread extends Thread {private Socket socket; //此客户端的socket对象private String message; //此客户端发送的信息public ClientSendThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {PrintWriter writer = new PrintWriter(socket.getOutputStream()); //获取网络输出流while (true) {synchronized (this){wait();  //这里先让此线程等待,知道客户端界面有内容输入就唤醒}writer.println(username+":"+message);//将此用户发送的信息输出给服务端clientFrame.showText.append("\t\t\t\t\t\t\t\t\t我的:\n\t\t\t\t\t\t\t\t\t\t"+message+"\n\n");  //在对应的客户端界面显示信息message = null;  writer.flush(); //刷新输入流}} catch (Exception e) {e.printStackTrace();}}public void setMessage(String message) {this.message = message;}}/**
*创建客户端接收信息的内部类
*/class ClientReceiveThread extends  Thread {private Socket socket; //此客户端的socket对象public ClientReceiveThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //获取网络输入流String str;while ((str = reader.readLine()) != null) {clientFrame.showText.append(str+"\n\n"); //在客户端界面显示clientFrame.showText.setCaretPosition(clientFrame.showText.getText().length());}} catch (Exception e) {e.printStackTrace();}}}}
  • 搭建客户端界面

我这里搭建客户端界面使用的是JavaSwing

class ClientFrame extends JFrame {ClientFrame frame = this;JPanel inputBlock;JTextArea inputText;JTextArea showText;JScrollPane jScrollPane;JButton send;Client client;public static void main(String[] args) {new ClientFrame(); //开启客户端界面}public ClientFrame() {init();String username = JOptionPane.showInputDialog(this, "请输入一个用户名用于聊天", "提示", JOptionPane.INFORMATION_MESSAGE);setTitle("聊天室"+" 用户:"+username);client = new Client(this,username);  //创建客户端处理程序}void init() {//窗口设置setBounds(100, 100, 800, 600);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setLocationRelativeTo(null);setDefaultLookAndFeelDecorated(true);setLayout(new GridLayout(2, 1));Container contentPane = getContentPane();//输入块inputBlock = new JPanel(null);//输入框inputText = new JTextArea(20, 20);inputText.setMargin(new Insets(10, 10, 10, 10));inputText.setFont(new Font("谐体", Font.BOLD, 16));inputText.setBounds(10, 10, 761, 230);//发送按钮send = new JButton("发送");send.setBounds(660, 243, 100, 30);inputBlock.add(inputText);inputBlock.add(send);//显示框jScrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);showText = new JTextArea("聊天记录\n\n");showText.setFont(new Font("宋体", Font.BOLD, 13));showText.setBackground(new Color(43, 43, 44));Border border = BorderFactory. createLineBorder(new Color(60, 63, 65));showText.setBorder(BorderFactory.createCompoundBorder(border, BorderFactory.createEmptyBorder(10, 10, 10, 10)));showText.setEnabled(false);jScrollPane.setViewportView(showText);//插入组件contentPane.add(jScrollPane);contentPane.add(inputBlock);setVisible(true);sendEvent();}//组件的事件绑定public void sendEvent() {//输入域的键盘事件inputText.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyChar() == KeyEvent.VK_ENTER) {sendMessage();}}@Overridepublic void keyReleased(KeyEvent e) {}});//发送按钮的点击事件send.addActionListener(l -> {sendMessage();});}//发送信息的方法public void sendMessage() {String str = inputText.getText().trim();//获取到输入域的文本if (!str.equals("")) {client.getClientSendThread().setMessage(str);//设置客户端发送线程需要发送的信息。synchronized (client.getClientSendThread()) {client.getClientSendThread().notify(); //唤醒客户端发送线程}inputText.setText("");showText.setCaretPosition(showText.getText().length());}}}

运行结果

用户张三

用户李四

用户王五:

服务端

总结:如此一个简单的基于TCP协议的网络聊天室就搭建好了。

基于TCP协议的网络聊天室相关推荐

  1. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  2. 基于阿里云用C/C++做了一个http协议与TCP协议的web聊天室的服务器——《干饭聊天室》

    基于阿里云用C/C++做了一个http协议与TCP协议的web聊天室的服务器--<干饭聊天室> 在这里首先感谢前端小伙伴飞鸟 前端技术请看一款基于React.C++,使用TCP/HTTP协 ...

  3. 用C#实现基于TCP协议的网络通讯

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  4. 基于TCP协议的网络摄像头的设计与实现

    一.摘要 基于TCP协议的网络摄像头的设计大部分和博文"基于UDP协议的网络摄像头的设计与实现"相同,本篇博文采用的TCP协议栈为NicheStack协议栈(同理,可使用LWIP协 ...

  5. 用C#实现基于TCP协议的网络通讯(2)

    2008-09-09 19:36 作者: 出处:www.4oa.com ( 11 ) 砖   ( 12 ) 好  评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...

  6. 用C#实现基于TCP协议的网络通讯(1)

    2008-09-09 19:35 作者: 出处:www.4oa.com ( 11 ) 砖   ( 12 ) 好  评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...

  7. 篡改计算机网络,基于TCP协议的网络数据实时篡改.doc

    基于TCP协议的网络数据实时篡改 基于 TCP 协议的网络数据实时篡改 金 瓯,施 勇,薛 质(上海交通大学信息安全工程学院,上海 200240)[摘 要]首先对网络数据实时篡改作了定义,指出攻击者介 ...

  8. 基于Java socket的网络聊天室的设计与实现

    目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...

  9. 基于TCP协议的网络程序(基础学习)

    下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听 ...

最新文章

  1. 再不参与就晚了!!2020年结束前最后一波内测福利!人人有份!
  2. 迁移学习:领域自适应的理论分析
  3. Android 插件框架实现思路及原理
  4. android+udp传输大小,Android UDP数据包如何接收可变大小的数据包
  5. c++ 01_02 study note
  6. Redis中的lru算法实现
  7. solaris 10 oracle 11g r2安装教程,Oracle 11gR2 on Solaris 10安装技术文档(原版英文)
  8. VM虚拟机安装CentOS 7详解
  9. 团队管理6--管理风格
  10. 计算机十年歌曲,抖音还有多少个十年能勇敢做热血青年是什么歌
  11. vb常用内部函数(四):随机数函数
  12. cocos2d-x 从win32到android移植的全套解决方案
  13. 单目三维重建开源方案MVE和MVG+MVS效果对比
  14. unity particle system 粒子系统 制作闪电放电效果
  15. space sniffer
  16. FNN模糊神经网络——信息系统客户服务感知评价
  17. 一文了解websocket全双工通信java实现socket地址404问题解决
  18. 1,objective-c语言的主要优点和缺陷,Objective-C的陷阱与缺陷
  19. 【BAT面试】JDK8 JVM内存模型
  20. 别浪费自己的高学历!

热门文章

  1. 【MySQL系列教程】
  2. 数控系统的opc服务器,基于OPC UA的828D数控机床群远程监控系统设计
  3. csc_matix函数
  4. MEMORY系列之“eMMC”
  5. 库乐队历史版本怎么下载_库乐队电脑版下载|GarageBand电脑版 V2.4.4 官方最新版 下载_当下软件园_软件下载...
  6. Mac上QQ电话录音
  7. 如果使用 Python3(Flask) 一步一步模拟一个网页微信客户端
  8. 江民在线杀毒充值的痛苦经历
  9. 打印unicode汉字编码字符串为乱码怎么办?
  10. 短视频美颜SDK里的祛痘功能是怎么实现的?