【Java】Socket实现的C/S模式半UI多人聊天程序
前言
这个程序也是以前写的,大概是一个命令行的S端支持几个半UI的C端进行网络聊天的程序。
还有很多使用上的问题,萌新读者若能把本例作为一个壳子改装改装,作出你的作品,就是我幸运之至。
S端程序
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
//import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;public class ChatSeverEdition {// 服务器端是否启动private boolean isStarted = false;private ServerSocket serverSocket = null;private List<Client> clients = new ArrayList<>();public static void main(String[] args) {new ChatSeverEdition().start();}public void start() {try {serverSocket = new ServerSocket(8888);isStarted = true;} catch (BindException e) {// 多次启动服务器System.out.println("端口使用中。。。。");System.out.println("请关掉相关程序,并重新运行服务器!");System.exit(0);} catch (IOException e) {e.printStackTrace();} try {while (isStarted) {// 客户端是否连接Socket socket = serverSocket.accept();// main()方法是static方法,不能在其中new动态类ClientClient client = new Client(socket);// 线程启动new Thread(client).start();// 将当前启动的客户端保存下来clients.add(client);System.out.println("new Client成功!");System.out.println("A Client connected!");}} catch (IOException e) {e.printStackTrace();} finally {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}class Client implements Runnable {private Socket socket;private DataInputStream dataInputStream = null;private boolean isConnected = false;private DataOutputStream dataOutputStream;public Client(Socket socket) {this.socket = socket;try {dataInputStream = new DataInputStream(socket.getInputStream());dataOutputStream = new DataOutputStream(socket.getOutputStream());isConnected = true;System.out.println("有一个新的客户端程序在运行");} catch (IOException e) {e.printStackTrace();}// 一个客户端连接成功以后,一直在执行该while部分的代码,其他客户端无法连接/*** 解决方法: * 1.异步解决方法:一直监听接收,其他在另外的地方执行 * 2.使用单独的线程: 线程:接受客户端连接* 另外的单独的线程:处理通讯*/}public void sendString(String str) {try {dataOutputStream.writeUTF(str);} catch (IOException e) {clients.remove(this);System.out.println("对方退出了!!!我从List中去掉了!!!");}}public void run() {Client client = null;// 注意这部分的包围关系try {while (isConnected) {String string = dataInputStream.readUTF();System.out.println(string);for (int i = 0; i < clients.size(); i++) {client = clients.get(i);client.sendString(string);}}} catch (EOFException e) {System.out.println("Client closed!");} catch (IOException e) {e.printStackTrace();System.exit(0);} finally {try {if (dataInputStream != null) {dataInputStream.close();}if (socket != null) {socket.close();}} catch (IOException e) {e.printStackTrace();}}}}}
C端程序
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;public class ChatClientEdition extends Frame {private static final long serialVersionUID = 1L;private TextField textField = new TextField();private TextArea textArea = new TextArea();private Socket socket = null;private DataOutputStream dataOutputStream = null;private DataInputStream dataInputStream = null;private boolean isConnected = false;public static void main(String[] args) {new ChatClientEdition().launchFrame();}/*** 加载窗口*/public void launchFrame() {setLocation(400, 300);this.setSize(300, 300);this.setTitle("在线聊天时--Quiana");add(textField, BorderLayout.SOUTH);add(textArea, BorderLayout.NORTH);pack();// 窗口关闭的时间监听this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {disconnect();System.exit(0);}});textField.addActionListener(new TFListener());this.setVisible(true);connect();new Thread(new RecvThread()).start();}// 文字处理的时间监听private class TFListener implements ActionListener {// 敲击回车时,文字的变化事件@Overridepublic void actionPerformed(ActionEvent arg0) {String s = textField.getText().trim(); // 去掉两端的空格textField.setText("");try {dataOutputStream.writeUTF(s);dataOutputStream.flush();} catch (IOException e) {e.printStackTrace();}}}/*** 连接到服务器*/public void connect() {try {// 连接到服务器socket = new Socket("127.0.0.1", 8888);isConnected = true;dataOutputStream = new DataOutputStream(socket.getOutputStream());dataInputStream = new DataInputStream(socket.getInputStream());System.out.println("连接到服务器!!!");} catch (BindException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 断开连接*/public void disconnect() {try {dataOutputStream.close();System.out.println("dataOutputStream成功关闭");socket.close();System.out.println("客户端socket成功关闭");} catch (IOException e) {e.printStackTrace();}}private class RecvThread implements Runnable {public void run() {try {while (isConnected) {String string = dataInputStream.readUTF();if (textArea.getText().length() == 0) {textArea.setText(string);} else {textArea.setText(textArea.getText() + "\n" + string);}}} catch (SocketException e) {System.out.println("退出了,ByeBye!");} catch (EOFException e) {System.out.println("退出了,ByeBye!");} catch (IOException e) {e.printStackTrace();}}}}
运行示例
先启动S端:
此时不能启动另外的S端(因为这个系统只支持一个服务器),启动之后会被提示端口使用中然后被terminated掉:
我们这时使用S端发东西是没用的,它只是服务器,更何况是没联客户端的服务器。
然后启动C端:
UI显示C端程序界面,命令行提示S端连接了。
我们可以开启两个,进行talk:
这里极大的一个不足是不能提示谁发的消息,只是一个记录的传输(S端也会有记录,这个并未加密)。
下图是在某一个C端发消息:
两个C端和S端都会有记录:
停掉一个C端程序:UI只剩一个(未terminated的),已经停掉的C端提示结束:
S端会显示又一个C端用户退出了,这时如果用户继续发消息,会发现没人陪聊,此时会传给S端消息表示从自己聊天列表中去掉了(只剩一个C端用户了,所以就没得玩),剩下的一个可以继续发给S端,只是没啥用(因为没人收啊),这毕竟是一个实时聊天系统……:
退出List以后,继续发完全没问题,顶多只是尬聊客服机器(更何况此处客服不会聊天):
别尬聊了,就当这孩子生气了吧,所以他也不陪聊了,撤——此时C端一个也没开启,但S端还得跑(真勤奋):
S端还是需要继续发光放热、榨干自己的,所以还要开一个C端:
这次我们不停C端,我们停掉S端,嘿嘿,C端必是懵了:
此时最尴尬,它不论干啥都没用,只能心甘情愿的退出~~
程序就彻底Over了……
结语
分析了很多种运行情况,但毕竟很久没玩了,感兴趣的Reader可以自己改造改造,让它发光放热!
【Java】Socket实现的C/S模式半UI多人聊天程序相关推荐
- java毕业设计——基于java+Socket+sqlserver的远程监控系统软件设计与实现(毕业论文+程序源码)——远程监控系统
基于java+Socket+sqlserver的远程监控系统软件设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+sqlserver的远程监控系统软件设计与实现,文章 ...
- 【java毕业设计】基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码)——坦克大战游戏
基于java+Socket+Eclipse的坦克大战游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+Eclipse的坦克大战游戏设计与实现,文章末尾附有本毕业设 ...
- 用c语言编写一个1V1聊天程序,socket多人聊天程序C语言版(二)
1V1实现了,1V多也就容易了.不过相对于1V1的程序,我经过大改,采用链表来动态管理.这样效率真的提升不少,至少CPU使用率稳稳的在20以下,不会飙到100了.用C语言写这个还是挺费时间的,因为什么 ...
- Java NIO SocketChannel+Buffer+Selector 详解(含多人聊天室实例)
一.Java NIO 的核心组件 Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解 简单来说 N ...
- Java——网络编程(实现基于命令行的多人聊天室)
2019独角兽企业重金招聘Python工程师标准>>> 目录: 1.ISO和TCP/IP分层模型 2.IP协议 3.TCP/UDP协议 4.基于TCP的网络编程 5.基于UDP的网络 ...
- TCP多人聊天程序Java实现(群聊,私聊,在线用户,踢出用户)
本程序在程序 https://blog.csdn.net/joffy/article/details/18079331 的基础是上添加了私聊,踢出用户两个功能. 由客户端和服务器端构成程序,程序借助J ...
- socket多人聊天程序C语言版(一)
==> 学习汇总(持续更新) ==> 从零搭建后端基础设施系列(一)-- 背景介绍 socket编程client和server直接通信是很简单的,就是一个发送一个接收就完了,但这却是基础. ...
- 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能
多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能.多人聊天只需要将A客户端发来的消息,转发给除A客户 ...
- java毕业设计——基于java+Socket+sqlserver的办公自动化系统设计与实现(毕业论文+程序源码)——办公自动化系统
基于java+Socket+sqlserver的办公自动化系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+sqlserver的办公自动化系统设计与实现,文章末尾 ...
最新文章
- R语言points作图
- C语言中文件的基本操作函数fprintf和fscanf实例介绍
- 云原生 - Istio可观察性之监控(四)
- 视觉SLAM常用的数据集集合【3】
- NLP(新闻文本分类)——基于机器学习的文本分类
- # 畸变矫正_边缘投影法对文本图像矫正——python
- 唏嘘!暴风影音官网、APP挂掉,办公地人去楼空,官方心酸回应...
- python和java哪个好找工作-Python和java哪个就业前景好些?
- Atitit 软件程序的定义 软件广义定义 程序代码,文档 ,数据 方法,规则, 狭义定义 软件=程序+数据+文档 软件(英文:Software)是一系列按照特定顺序组织的计算机数据和指
- 在python中编写socket服务端模块(二):使用poll或epoll
- python手动垃圾回收_Python3学习笔记,F,垃圾,回收
- linux 添加声卡驱动,Linux操作系统下声卡驱动的详细加载方法
- java经纬度转平面坐标_经纬度到平面坐标的相互转换
- 微信怎样诞生:张小龙给马化腾的一封邮件
- 帝都地铁隧道里的动态广告是什么原理?
- oracle中间人投毒漏洞,ORACLE远程投毒漏洞修复(RAC环境)
- html 套壳成桌面应用
- 如何批量将 pptx 格式的 PPT 演示文稿转换为 ppt 格式
- 20行Python代码爬取网站美女图,哇太多了,我U盘装满了
- 网络报表学习体会心得!
热门文章
- SpringMvc三大组件详解
- mac 下开发golang 配置
- 【分布式】Zookeeper在大型分布式系统中的应用
- 【心情】最近实在是太忙了,没有心情写东西!
- Vue入门 ---- 组件式开发
- 火箭技术术语_仿真优化火箭发动机 3D 打印制造工艺
- 燕山大学计算机学院官网,燕山大学信息科学与工程学院(专业学位)计算机技术保研夏令营...
- less简介、less安装、编译、less语法之变量、嵌套、类混入、函数混入、运算、less文件导入
- ElasticSearch快速入门(一)介绍
- ElasticSearch下载安装启动详细图解