线程练习题---简易多人聊天室
时间:2022-05-05
本文章向大家介绍线程练习题---简易多人聊天室,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 package Day_1;
2
3 import java.io.DataInputStream;
4 import java.io.DataOutputStream;
5 import java.io.EOFException;
6 import java.io.IOException;
7 import java.net.ConnectException;
8 import java.net.Socket;
9 import java.net.SocketException;
10 import java.net.UnknownHostException;
11 import java.util.Scanner;
12
13 /*
14 * 对于聊天室而言,不需要进行单线程进行即可。
15 * 和Socket编程
16 * */
17 public class Client {
18
19 private DataInputStream Dis = null;
20 private DataOutputStream Dos = null;
21 private boolean connect = false;
22 Socket sc = null;
23
24 public static void main(String args[]) {
25 new Client().start();
26 }
27
28 private void send(String str) {
29 try {
30 Dos.writeUTF(str);
31 } catch (IOException e) {
32 // TODO Auto-generated catch block
33 e.printStackTrace();
34 }
35 }
36
37 private void sec() {
38 try {
39 System.out.println("这是来自服务器:" + sc.getInetAddress() + ": "
40 + Dis.readUTF());
41 } catch (EOFException e) {
42 System.out.println("该客户端退出了!");
43 } catch (IOException e) {
44 // TODO Auto-generated catch block
45 e.printStackTrace();
46 }
47 }
48
49 public void start() {
50 try {
51 // 建立连接
52 sc = new Socket("127.0.0.1", 8888);
53 Dos = new DataOutputStream(sc.getOutputStream());
54 Dis = new DataInputStream(sc.getInputStream());
55 connect = true; // 可以开始通话了
56 } catch (ConnectException e) {
57 System.out.println("服务器,木有打开!");
58 } catch (IOException e) {
59 // TODO Auto-generated catch block
60 e.printStackTrace();
61 }
62 while (connect) {
63 Scanner read = new Scanner(System.in);
64 while (read.hasNext()) {
65 String st = read.next();
66 if (st.equals("exit")) {
67 try {
68 if (Dos != null)
69 Dos.close();
70 if (Dis != null)
71 Dis.close();
72 if (sc != null)
73 sc.close();
74 } catch (IOException e) {
75 // TODO Auto-generated catch block
76 e.printStackTrace();
77 }
78 connect=false;
79 break;
80 }
81 this.send(st);
82 this.sec();
83 }
84 }
85 }
86 }
1 package Day_1;
2
3 import java.io.DataInputStream;
4 import java.io.DataOutputStream;
5 import java.io.EOFException;
6 import java.io.IOException;
7 import java.net.BindException;
8 import java.net.ServerSocket;
9 import java.net.Socket;
10 import java.util.ArrayList;
11 import java.util.Deque;
12 import java.util.List;
13 import java.util.concurrent.ExecutorService;
14 import java.util.concurrent.Executors;
15
16
17 public class GetPicture {
18
19 /**
20 * @param args
21 * 聊天室有n个人在聊天,聊天服务器就应该为每个进入聊天室的人创建一个对应的线程,
22 * 该线程监听对应的聊天者是否有消息传来。如果有,则向所有的聊天者广播该消息。
23 * 实现该网络聊天系统、
24 */
25 private boolean started =false;
26 private boolean connect=false;
27 //放置一个链表来存放新建的客户端
28 List<NewClient> list=new ArrayList<NewClient>() ;
29 //设定一个无限制大小的线程池
30 ExecutorService es = Executors.newCachedThreadPool();
31 public static void main(String[] args) {
32 // TODO Auto-generated method stub
33 new GetPicture().start();
34 }
35
36 public void start(){
37 final int port=8888;
38 ServerSocket ss = null ;
39 try {
40 //创建套接字
41 ss = new ServerSocket(port);
42 connect = true;
43 }catch(BindException e)
44 {
45 //不做任何处理
46 }
47 catch (IOException e) {
48 // TODO Auto-generated catch block
49 e.printStackTrace();
50 }
51 //如果连接上,则表示不断的创建客户端对象
52 try {
53 while(connect){
54 //表示不断的监听
55 Socket st = ss.accept();
56 //将套接字放进 NewClient类中
57 NewClient nc = new NewClient(st);
58 //将NewClient类放进线程中,创建多线程
59 // new Thread(nc).start(); //创建线程
60 //放进线程池中
61 es.execute(new Thread(nc));
62 //将newClient放进链表中
63 list.add(nc);
64 System.out.println("客戶端接收成功");
65 } }catch (IOException e) {
66 // TODO Auto-generated catch block
67 e.printStackTrace();
68 }
69 }
70
71
72 //创建一个新的客户端类
73 class NewClient implements Runnable
74 {
75 DataInputStream Dis = null;
76 DataOutputStream Dos = null;
77 Socket sc=null;
78 boolean started=false; //初始断开
79 public NewClient(Socket st){
80 this.sc=st;
81 try {
82 //获得对方发过来的缓存数据流
83 Dis = new DataInputStream(st.getInputStream());
84 Dos = new DataOutputStream(st.getOutputStream());
85 //如果正常说明,已经接收到了对方的发送过来的数据、
86 started =true;
87 } catch (IOException e) {
88 // TODO Auto-generated catch block
89 e.printStackTrace();
90 }
91 }
92 public void send(String str)
93 {
94 try {
95 // 将数据写入到对方的内存中
96 Dos.writeUTF(str);
97 }
98 catch(EOFException e){
99 System.out.println("对方客户端退出了!");
100 } catch (IOException e) {
101 // TODO Auto-generated catch block
102 e.printStackTrace();
103 }
104 }
105 @Override
106 public void run() {
107 // TODO Auto-generated method stub
108 //如果连接上了,就可以提取相应的数据
109 String str=null;
110 try {
111 while(started){
112 //采用UTF-8的编码格式进行流的输入输出
113 str = Dis.readUTF();
114 /*for(int i=0;i<list.size() ;i++){
115 list.get(i).send(str);
116 }*/
117 for( NewClient sc : list )
118 sc.send(str);
119 }
120 }catch(EOFException e){
121 //绑定异常,说明退出了
122 System.out.println("该客户端退出了!");
123 }catch (IOException e) {
124 // TODO Auto-generated catch block
125 e.printStackTrace();
126 }finally{
127 //当该线程消亡的时候,给予相应流的关闭
128 try {
129 if(Dos!=null)Dos.close();
130 if(Dis!=null)Dis.close();
131 if(sc!=null)sc.close();
132 } catch (IOException e) {
133 // TODO Auto-generated catch block
134 e.printStackTrace();
135 }
136 }
137 }
138 }
139 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ubuntu下让python脚本可直接运行的实现方法
- 在linux (centos)上使用puppeteer实现网页截图功能
- centOS7.4 安装 mysql 5.7.26的教程详解
- linux最快的文本搜索神器ripgrep(grep的最好代替者)
- Ubuntu安装MySQL5.7并配置数据存储路径的方法步骤
- 在centos7上搭建mysql主从服务器的方法(图文教程)
- Linux部署python爬虫脚本,并设置定时任务的方法
- centos6编译及安装ZLMediaKit解析
- CentOS7.5安装配置Harbor1.7的全过程
- Linux CentOS 定时运行脚本配置的方法
- 从Centos7升级到Centos8的教程(图文详解)
- Linux(Centos7)下redis5集群搭建和使用说明详解
- CentOS7下安装yum源及上传下载命令rz、sz安装方法(图解)
- C#实例:四路激光测距雷达数据采集和波形图绘制
- Linux 中有效用户组和初始用户组的实现