Java小白版聊天室1.0版本
一个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版本相关推荐
- java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...
基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述 本科生毕业论文(设计) 题 目: 基于Java网页版聊天室的设计与实现 姓 名:学 院: 理学院 专 业: 信息与计算科学 班 级: 信 ...
- java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述(样例3)...
<基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc>由会员分享,可免费在线阅读全文,更多与<基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述& ...
- java web聊天室论文_基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc...
基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc 还剩 52页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价 ...
- Java聊天室2.0版本
仿照了网上的代码和思路对之前的1.0版本进行了修改,按别人的界面和思路来写代码巨难受 设计到的一些知识点 1.swing界面: BorderLayout与FlowLayout的区别 BorderLay ...
- Java小项目——聊天室(多线程版本)
目录 1. 前言 2. 功能实现 3. 模块划分 4. 功能分析 4.1 前期分析 4.2 具体实现 5. 使用技术 6. 代码 1. 前言 之前写过单线程版本的聊天室,这次对之前的版本进行扩展与优化 ...
- html5 websocket java 聊天室_如何利用WebSocket实现网页版聊天室
花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...
- java多人聊天室与网络画板
本篇主要是对本人前一篇通信博客在部分功能和代码结构上的优化,以下为前篇博客的地址: java通信-网络聊天室&网络画板(简陋版) 一.代码结构上的优化: 对前篇博客服务器类中最后流的关闭上代码 ...
- 项目__网页版聊天室
项目内容 使用开源websocket框架mongoose编写网页版本的群聊即时通信工具,使用http+mongoose+session+mysql+jsoncpp的技术构成,从而实现一个网页版的聊天室 ...
- php++仿网页版微信,vue+web端仿微信网页版聊天室功能
一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室- ...
最新文章
- eclipse 重启/打开内置浏览器
- 2019秦皇岛ccpc A题:Angle Beats[计算几何:统计符合直角三角形的个数]+[向量hash+3hash]
- thinkphp框架细节
- 人工智能的炒作_解密人工智能:是炒作还是我们期望太高
- How to Build Your Own Blockchain Part 4.2 — Ethereum Proof of Work Difficulty Explained
- 【CodeForces - 371D】Vessels(思维,元素合并,并查集)
- 关于Zookeeper和Redis实现分布式锁的异同
- Selective Search for Object Recognition解读
- Python Imaging Library: ImageMath Module(图像数学运算模块)
- 自存:微软应用商店appx下载
- android模拟触控power键
- Go游戏服务器开发的一些思考(三十八):MMO游戏移动同步
- C++初学者必练基础编程题【第一期】
- Mac OS 关闭系统更新提示小红点
- tomcat监控脚本(监控进程,测试接口,告警动作为发送邮件)
- Linux下安装google浏览器
- Mybatis 之 二级缓存
- Kernel Trick
- 生产者-消费者问题(有例题!!!)
- jzoj4270. 【NOIP2015模拟10.27】魔道研究