一个Java初学者写出来的界面简陋,功能及其简单的小白版聊天室,接下来会花一点时间去完善它

1.构思:构建两个main方法,一个为服务端,一个为客户端,客户端向服务端发送消息,服务端创建集合,向集合中的所有客户端发送信息。

2,涉及知识点:流,swing,网络通信,多线程,异常等的入门简单使用

3,代码如下

客户端:

import java.awt.BorderLayout;
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.Socket;
import java.net.SocketException;
import java.rmi.UnexpectedException;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Calendar;import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class ChatClient extends JFrame {Socket s;int x=(int)(Math.random()*100);//给每一个端口随机指定一个端口值DataOutputStream dos=null;DataInputStream dis=null;private boolean bconnect=false;JTextField tfTxt=new JTextField();JTextArea taContent=new JTextArea();public static void main(String[] args) {new ChatClient().launchFrame();
}public void launchFrame() {this.setLocation(400,300);this.setSize(400,400);this.add(tfTxt, BorderLayout.SOUTH);this.add(taContent, BorderLayout.NORTH);this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent arg0){disconnect();//确定关闭后断开连接System.exit(0);}});tfTxt.addActionListener(new TFListener());//添加动作监听this.setVisible(true);connect();//与服务端进行连接new Thread(new RecvThread()).start();//开启多线程
}
public void connect() {try {s=new Socket("127.0.0.1",8888);dos=new DataOutputStream(s.getOutputStream());//获取s端的输出流dis=new DataInputStream(s.getInputStream());//获取s端的输入流bconnect=true;}catch(UnexpectedException e) {e.printStackTrace();}catch(IOException e) {e.printStackTrace();}
}
public void disconnect() {try {dos.close();s.close();}catch(IOException e) {e.printStackTrace();}
}
private class TFListener implements ActionListener{public void actionPerformed(ActionEvent e) {Calendar cal=Calendar.getInstance();String str="Client "+x+" "+LocalDate.now().toString()+LocalTime.now().toString()+":\n"+tfTxt.getText().trim();//trim的作用是去除两边空格//taContent.setText(str);tfTxt.setText("");//将发送后的tfTxt置空try {DataOutputStream dos=new DataOutputStream(s.getOutputStream());dos.writeUTF(str);//dos作为输出流存储输出到服务端的内容dos.flush();//dos.close();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
}
private class RecvThread implements Runnable{public void run() {try {while(bconnect) {String    str = dis.readUTF();System.out.println(str);taContent.setText(taContent.getText()+str+"\n");}} catch(EOFException e) {//异常的捕捉顺序System.out.println("退出1");}catch(SocketException e) {System.out.println("退出2");}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
}

服务端:

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 ChatSerive {boolean started=false;ServerSocket ss=null;List<Client> clients=new ArrayList<>();public static void main(String[] args) {new ChatSerive().start();
}
public void start() {try {ss=new ServerSocket(8888);}catch(BindException e2) {System.out.println("端口使用中。。");System.exit(0);}catch(IOException e) {e.printStackTrace();}try {started=true;while(started) {Socket s=ss.accept();Client c=new Client(s);new Thread(c).start();//线程启动clients.add(c);//将线程添加到集合中}}catch(IOException E) {E.printStackTrace();}finally {try {ss.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}class Client implements Runnable{//创建一个内部类线程Client c;Socket s;DataInputStream dis=null;boolean bconnect=false;DataOutputStream dos=null;public Client(Socket s) {this.s=s;try {dos=new DataOutputStream(s.getOutputStream());dis=new DataInputStream(s.getInputStream());bconnect=true;//判断是否成功读取输入流} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void send(String str){try {dos.writeUTF(str);} catch (IOException e) {// TODO Auto-generated catch blockclients.remove(this);System.out.println("对方退出了");}}public void run() {try {while(bconnect) {String str=dis.readUTF();for(int i=0;i<clients.size();i++) {//判断有几个客户端,向所有客户端发送信息Client c=clients.get(i);c.send(str);}
//System.out.println(str);}}catch(SocketException e) {if(c!=null) clients.remove(this);System.out.println("quit");}catch(EOFException e) {System.out.println(1);e.printStackTrace();}catch(IOException e){System.out.println("Client closed");}finally {try {  if(dis!=null)  dis.close();if(dos!=null)  dos.close();if(s!=null)        s.close();}catch(IOException e1) {e1.printStackTrace();}}}}
}
/*for(Iterator<Client>it=clients.iterator();it.hasNext();) {
Client c=it.next();
c.send(str);
}*///Iterator具有锁定功能,较慢
/*Iterator<Client>it=clients.iterator();
while(it.hasNext()) {
Client c=it.next();
c.send(str);
}*/

集合的遍历输出的另外两种方法

Java小白版聊天室1.0版本相关推荐

  1. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...

    基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述 本科生毕业论文(设计) 题 目: 基于Java网页版聊天室的设计与实现 姓 名:学 院: 理学院 专 业: 信息与计算科学 班 级: 信 ...

  2. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述(样例3)...

    <基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc>由会员分享,可免费在线阅读全文,更多与<基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述& ...

  3. java web聊天室论文_基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc...

    基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc 还剩 52页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价 ...

  4. Java聊天室2.0版本

    仿照了网上的代码和思路对之前的1.0版本进行了修改,按别人的界面和思路来写代码巨难受 设计到的一些知识点 1.swing界面: BorderLayout与FlowLayout的区别 BorderLay ...

  5. Java小项目——聊天室(多线程版本)

    目录 1. 前言 2. 功能实现 3. 模块划分 4. 功能分析 4.1 前期分析 4.2 具体实现 5. 使用技术 6. 代码 1. 前言 之前写过单线程版本的聊天室,这次对之前的版本进行扩展与优化 ...

  6. html5 websocket java 聊天室_如何利用WebSocket实现网页版聊天室

    花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...

  7. java多人聊天室与网络画板

    本篇主要是对本人前一篇通信博客在部分功能和代码结构上的优化,以下为前篇博客的地址: java通信-网络聊天室&网络画板(简陋版) 一.代码结构上的优化: 对前篇博客服务器类中最后流的关闭上代码 ...

  8. 项目__网页版聊天室

    项目内容 使用开源websocket框架mongoose编写网页版本的群聊即时通信工具,使用http+mongoose+session+mysql+jsoncpp的技术构成,从而实现一个网页版的聊天室 ...

  9. php++仿网页版微信,vue+web端仿微信网页版聊天室功能

    一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室- ...

最新文章

  1. eclipse 重启/打开内置浏览器
  2. 2019秦皇岛ccpc A题:Angle Beats[计算几何:统计符合直角三角形的个数]+[向量hash+3hash]
  3. thinkphp框架细节
  4. 人工智能的炒作_解密人工智能:是炒作还是我们期望太高
  5. How to Build Your Own Blockchain Part 4.2 — Ethereum Proof of Work Difficulty Explained
  6. 【CodeForces - 371D】Vessels(思维,元素合并,并查集)
  7. 关于Zookeeper和Redis实现分布式锁的异同
  8. Selective Search for Object Recognition解读
  9. Python Imaging Library: ImageMath Module(图像数学运算模块)
  10. 自存:微软应用商店appx下载
  11. android模拟触控power键
  12. Go游戏服务器开发的一些思考(三十八):MMO游戏移动同步
  13. C++初学者必练基础编程题【第一期】
  14. Mac OS 关闭系统更新提示小红点
  15. tomcat监控脚本(监控进程,测试接口,告警动作为发送邮件)
  16. Linux下安装google浏览器
  17. Mybatis 之 二级缓存
  18. Kernel Trick
  19. 生产者-消费者问题(有例题!!!)
  20. jzoj4270. 【NOIP2015模拟10.27】魔道研究

热门文章

  1. 如何设置tomcat的默认应用。
  2. bootstrap 树形菜单
  3. 自己总结的sql基本操作
  4. Ribbon负载均衡原理,Feign是如何整合Ribbon的?
  5. c语言将pwd结果赋给变量,《网络系统管理linux实训》全套PPT电子课件教案-第4章 shell编程.ppt...
  6. java求一个正整数的位数_java经典问题——求正整数的位数
  7. linux eclipse安装、新建并运行java程序
  8. Java获取请求客户端的真实IP地址
  9. linux时间函数详解
  10. 推荐几个 Go 测试工具和技巧让你在虎年如虎添翼