基于Java多线程的聊天室程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
,,服务器端程序
public class ChartServer{ private HashSet<Socket>clients=new
Socket>();//存放客户端Socket
HashSet<
public ChartServerO{
try{
ServerSocket SS=new ServerSocket(6666);
~~ ~ 一一 ~~ 一一 ~一 一 一 实~ 用一 第一
一~ ~ 一~ ~一 一 一~ ~一
一智 一慧 一密 ~集
. .一. .一
基于Java多线程的聊天室程序
刘 玉 胡 晖仇宾
摘要:聊天室是网络上常见的一项服务。大多都采用B/S结构,本文用Java语言实现了一个C/ S结构的聊天室。该程序综合利用了多种Java知识与技术。 关键词:Java;多线程;聊天室;Socket
name=new JLabel(”): JPanel jP=new JPanel();
jP.setLayout(new FlowLayout()); jP.add(name); jp.add(jtf); jp.add(jb); jb.addActionListener(new SendMessage()); this.setLayout(new BorderLayou“}): this.add(jta.BorderLayout.CENTER); this.add(jp,BorderLayout.SOUTH); getMessage();//调用方法 this.setVisible(true);
e.pr.ntStackTrace《}; }catch(IOException e){
e.printStackTrace0; }
name.setText(JOptionPane.showlnputDialog(this,’ 请输入你的姓名‘))://登录后在输入客户姓名
} ∥线程,接收服务器发来的信息并显示到jta上 class ClientThread extends Thread{
l ∥建立socket与服务器连接,并启动线程 public void getMessage(){
try{ S=new Socket(。1 27.0.0.1‘.6666);
pw=new PrintWriter(s.getOutputStream());
new ClientThread0。start(); }catch(UnknownHostException e){
(1)Socket:网络套接字,让两个应用程序通过一个双向 的网络通信链接实现数据交换。即服务器和客户端的应用程序 各有一个Socket,这两个Socket把服务器和客户端的程序连接 起来并交换数据。
(2)多线程:因为一个服务器要连人多个客户端.要让服 务器程序同时为多个客户服务,就需要为每个客户端开辟一 个线程,专门负责处理该客户的信息。此外,客户端程序不 仅要发送信息给服务器,还要不断接收服务器转发过来的信 息,因此也需要开辟一个线程专门负责接收服务器的信息。
public void run(){ while(true){
try{ br=new BufferedReader(new ln-
putStreamReader(s.getlnputStream0)); jta.append(br.readLine()+'、n。}:
)catch《IOException e}{ e.printStackTrace();
}
}catch《IOException e}{
e.printStackTraceO;
}
}
,/给每个客户发送一份信息
private void sendMessage(String str}{
ቤተ መጻሕፍቲ ባይዱ渤'醅20万髓1方0.数蛹据21与≤菇白
……·PROGRA啊LANGUAGE……………………………………………………·………………………………………·
fIa93=Ieftfst r|ngkh,3) fla92=integer(mid(stringkh,4,2))
else
//女日果前三位相同,判断后两位是否连续 ∥如果连续,则加上“一,否则进入下一个判断 if fla92+1=integer(mid(stringkh,4,2))then
fla92=fla92+l endkh=’一‘+stringkh else /,女口果endkh的左边第一个字符为”一”则添加startkh和endkh jf Ieft(endkh.1}=’一‘then
f)rivate JTextArea ita; })rivate JTextField Itf; f)rivate JButton jb: f)n’vate JLabel name; 【)rt‘vate Socket s: 【)n。vate PrintWriter pw; 【)n‘vate BufferedReader br; 【)n。vate DateFormat format: f)n’vate Date date=new Date(); //构造方法,建立界面,初始化工作 public ChartClient0{
(下转第24页)
嘏二簟蠹黼迦
万方数据
一 一~ ~~ ~一 一 ~~ ~~ ~ 实一 用~ 第一
Integer Ii-i string startkh,endkh,fla93,stringkh,temp integer fla92 li=dw_2.rowcount() //dw_1.scrolltorow(1) startkh=” endkh=”
} l } } /,事件,单击按钮则把文本框的信息发送给服务器 class SendMessage implements ActionListener{ public void actionPerformed(ActionEvent e){ format=DateFormat.getTimelnstance(Date- Format.LONG);//设置当前时间显示格式 String time=format.format(date); ,,获取当前时间
thiS.clients=clients;
}
public void run(){
try{ BufferedReader br=new Buffere-
dReader(new InputStreamReader(s.getlnputStreamO));
while(true){
sendMessage(br.readLineO+“、n”):
e.printStackTraceO;
}
)
,,线程,负责接收客户信息并转发给其他客户
class ServerThread extends Thread{ private Socket s: private HashSet clients;
public ServerThread(Socket s,HashSet clients){ this.S=s:
temp=temp+startkh temp=temp+endkh+’‘
startkh=strlnakh
fla92=integer(mid(stringkh,4,2)} else endkh=”
temp=temp+startkh temp=temp+endkh+’‘
startkh=stringkh fla92=integer(mid(stringkh,4.2)) end if
1 引言
网上各个网站提供的聊天室基本都是B/S结构的.现在用 Java实现一个C/S结构的聊天室程序。C/S结构包括两个方面: 一个运行在服务器;一个运行在客户端。
2工作原理
服务器程序运行后就等待客户端程序连入,客户端根据服 务器的IP地址和端口号连入。这样服务器和客户端就建立了 一个连接,而且可以有多个客户端同时连人一个服务器。连接 建立好之后,每个客户端的发言都发送给服务器.服务器接收 后再转发给所有连入的客户端,这样每个客户端就都能收到其 他客户发出的信息了。这就是C/S结构聊天室的工作原理.其 实现主要使用如下两种技术:
3.2客户端 建一个ChartCiient类作为客户端程序。运行后如图1所示。 首先构建好界面。然后定义Socket。指明服务器的IP地址
图1聊天室客户端 和端口号.这样就建立起了客户端到服务器的连接。连接建立 之后服务器和客户端就可以互相发送数据信息了。接下来启动 一个线程专门负责接收服务器发送来的信息并显示到聊天室里。 最后,还要写一个事件,负责把客户的发言发送给服务器,让 发送按钮注册该事件.这样单击按钮就可以发送信息了。在这 个过程里。信息的发送和接收都是通过I/O实现的。代码如下: 一 ,/客户端程序 public class ChartClient extends JFrame{
5输出考试安排表格
打印考室座位标签.分发给监考人员贴在桌子上。如图4所 示.在PowerBuilder中利用合适的数据窗口.这种标签很容易就 做到了.最后按座位号排序。点击打印按钮,所有考室的座位标 签就全部可以打印出来.当然也可以选择单个的考室打印。
打印安排表,复印多份,张贴在教室里,让学生可以快速 到找到自己的考室。
.一. .一
智慧密集
end汗 end if next temp=temp+startkh temp=temp+endkh+’‘ update testroomplan set人数=:眦号码段=:temp where 考室号=:room; commit; dw_3.retrieve() temp=”” next messagebox(“提示“,“考场安排表生成完毕!”}
,,建立Socket
while(true){
Socket S=SS.accept(); ,,等待并接收客户端请求
clients.add(s);
,/把收到的客户端Socket保存
new ServerThread(s.clients).StartO;
,/启动一个线程接收该客户信息
}
)catch《IOException e){
this.setSize(300,350);
this.setTitle(。聊天室’):
this.setDefau|tCIoseOperation(JFrame.EXIT—ON—CLOSE); jta=new JTextArea(1 5,20): jtf=new JTextField(1 5): jb=new JButton(。发送。}:
3程序实现
3.1 服务器端 建一个类,名称为ChartServer,代表服务器程序。在该类
中,首先定义一个ServerSocket,并指明端口号,这样服务器 端的Socket就建立好了。然后去接收客户端的请求。并且把客 户端传来的Socket放人一个HashSet中保存(HashSet集合中 保存所有客户的Socket,以便服务器),最后启动一个线程负 责该客户,在线程中不断接收该客户发送的信息并转发给 HashSet中所有的客户。代码如下:
Iterator it=clients.iterator(); while(it.hasNext()){
Socket temp=(Socket)it.next(); try{ PrintWriter pw=new PrintWriter(temp.getOutputStream());
pw.println(str); pw.flush(); }catch(IOException e){ e.printStackTraceo); } l } ) public static void main(String[】args){ new ChartServer(); } }
fla93=” fla92=O
stringkh=” for I-1 t0 I.
1陬蔫号
stringkh=dw 2.getitemstring(i,”考号”) //女u果前三位与定义的起始号段的前三位不同则 .f left(stringkh,3)<>Ieft(startkh,3)then
,/添加此号段到temp temp=temp+startkh temp=temp+endkh+’‘ startkh=stringkh endkh=”