Java网络编程实践报告Word下载.docx
《Java网络编程实践报告Word下载.docx》由会员分享,可在线阅读,更多相关《Java网络编程实践报告Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
类名:
Server
作用:
服务器的启动
继承的类:
JFrame,构造服务器界面。
定义的对象:
TextArea文本域
Java.awt.List在线客户列表
SeverSocket服务器
Socket客户端
主要成员方法:
voidinit()构造服务器端的界面
publicvoidactionPerformed(ActionEvente)按钮监听器
publicvoidkeyPressed(KeyEvente)键盘监听器
start
启动服务器的线程
继承的类名:
thread
主要的成员方法:
Publicvoidrun()启动服务器的线程
SgService
publicvoidrun()处理单个客户的线程
2)用户登录相关的类:
login
构造登录界面
JFrame
实现的接口:
ActionListener
构造方法:
publiclogin()
publicvoidactionPerformed(ActionEvente)实现登录和取消按钮的监听器
loginStart
主要的方法:
publicvoidrun()
如果登录成功,则弹出客户端聊天窗口,如果登录失败,则打印出登录失败,以告知客户
3)客户端相关的类:
Client
publicClient(PrintStreamout,BufferedReaderin,Stringname)
publicvoidreceive()接受服务端发来的信息
五.主要程序源代码
//聊天室服务器
importjavax.swing.*;
classServerextendsJFrame{
privateTextAreamsgA=newTextArea();
//服务器用来输入用的文本域
privateTextAreaarea=newTextArea();
//服务器显示消息的文本域
privateTextFieldportT=newTextField("
8888"
);
privatejava.awt.Listlist=newjava.awt.List();
//在线客户列表
privateServerSocketserver;
//服务器
privateSocketclient;
//客户端
privateMap<
String,Socket>
container=newHashMap<
();
//HashMap
voidinit(){
Panelp1=newPanel();
Panelp2=newPanel();
Panelp3=newPanel();
Panelp4=newPanel();
Panelp5=newPanel();
Panelp6=newPanel();
Panelp7=newPanel();
Panelp8=newPanel();
Panelp9=newPanel();
Panelp10=newPanel();
//设置两个重要的文本框
Labellb1=newLabel("
服务器界面"
lb1.setBackground(newColor(250,120,150));
Labellb2=newLabel("
port"
BorderLayoutborder1=newBorderLayout();
p1.setLayout(border1);
p1.add(BorderLayout.CENTER,area);
BorderLayoutborder2=newBorderLayout();
p5.setLayout(border2);
p5.add(BorderLayout.NORTH,p3);
p5.add(BorderLayout.CENTER,msgA);
BorderLayoutborder3=newBorderLayout();
p7.setLayout(border3);
p7.add(BorderLayout.CENTER,p1);
p7.add(BorderLayout.SOUTH,p5);
p7.setBackground(newColor(250,150,200));
JButtonstartButton=newJButton("
启动服务"
JButtonsendButton=newJButton("
发送"
JButtonflushButton=newJButton("
刷新列表"
FlowLayoutf1=newFlowLayout(FlowLayout.LEFT);
p8.setLayout(f1);
p8.add(lb2);
p8.add(portT);
p8.add(startButton);
p8.add(sendButton);
p8.add(flushButton);
p8.setBackground(newColor(250,120,150));
BorderLayoutborder4=newBorderLayout();
p9.setLayout(border4);
p9.add(BorderLayout.CENTER,p7);
p9.add(BorderLayout.SOUTH,p8);
p10.setLayout(newBorderLayout());
Labellb3=newLabel("
在线用户"
lb3.setBackground(newColor(250,120,150));
p10.add(lb3,BorderLayout.NORTH);
p10.add(list,BorderLayout.CENTER);
area.setEditable(false);
BorderLayoutborder=newBorderLayout();
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventarg0){
System.exit(0);
}
});
this.setLayout(border);
this.add(BorderLayout.NORTH,lb1);
this.add(BorderLayout.CENTER,p9);
this.setTitle("
聊天服务器"
this.setBounds(100,100,600,550);
this.setVisible(true);
//“启动服务”按钮监听器
startButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Threadt=newStart();
t.start();
//启动服务按钮监听器
//发送按钮监听器
sendButton.addActionListener(newActionListener(){
Stringmsg=msgA.getText();
if(msg!
=null&
&
msg!
="
"
){//如果消息不为空
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+"
:
+mm+"
+ss+"
broadcast(time+"
[系统消息]:
+msg);
//那么广播这条消息
area.append(time+"
+msg+"
\n"
msgA.setText("
}
//end
//刷新按钮监听器
flushButton.addActionListener(newActionListener(){
if(list!
=null){
list.removeAll();
//清空在线用户列表,以便刷新
Set<
Map.Entry<
>
mySet=container.entrySet();
for(Iterator<
it=mySet.iterator();
it.hasNext();
){//刷新列表
Map.Entry<
me=it.next();
StringaClientName=me.getKey();
SocketaClient=me.getValue();
StringaClientAddress=aClient.getInetAddress().getHostAddress();
list.add(aClientName+"
---"
+aClientAddress);
msgA.addKeyListener(newKeyAdapter(){//从键盘监听器---按下Enter发送消息
publicvoidkeyPressed(KeyEvente){
intvalue=e.getKeyCode();
if(value==KeyEvent.VK_ENTER){
Stringmsg=msgA.getText();
}
classStartextendsThread//启动服务器的线程
{
publicvoidrun(){
try{
if(server!
!
server.isClosed()){
area.append("
警告!
服务器已在启动中!
else{
server=newServerSocket(Integer.parseInt(portT.getText()));
//启动服务器
area.append((newDate()).toString()+"
+"
[恭喜!
(*^__^*)嘻嘻……]"
服务器启动成功!
\n\n"
);
while(true){
client=server.accept();
ThreadsgS=newSgService(client);
//为每位登录的客户创建一个线程
sgS.start();
//启动客户线程
catch(Exceptione){
System.out.println("
cuowu1"
e.printStackTrace();
}
//处理单个客户的线程
classSgServiceextendsThread
privateSocketclient=null;
//客户套接字
privateBufferedReaderbr=null;
//输入流
privatePrintStreamps=null;
privateintcounter=0;
//记录是第几次接受用户的信息
privateintmark=0;
//记录用户说不文明用语的次数
privateStringname=null;
SgService(Socketclient){//构造方法
this.client=client;
publicvoidrun(){//run---begin
try{
br=newBufferedReader(newInputStreamReader(client.getInputStream()));
ps=newPrintStream(client.getOutputStream());
Stringmsg=null;
while((msg=br.readLine())!
=null){//无限循环意味着可以和用户进行无限次交互
if(counter==0){
name=msg;
container.put(name,client);
list.add(name+"
+client.getInetAddress().getHostAddress());
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.SECOND);
Stringtime=hh+"
;
broadcast(time+name+"
上线了!
counter++;
}
else{
if(msg.equals("
你是个笨蛋"
)){
mark=mark+1;
if(mark<
3){
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+"
singleCom(time+"
警告,请注意文明用语!
client);
area.append(time+"
+name+"
第"
+mark+"
次使用了不文明用语,特此警告!
}
else{//如果客户第三次说不文明的话,系统就把他踢出聊天室
if(mark==3){
singleCom(time+"
由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!
//告诉他本人
}
removeClient(name,client);
//从系统列表中删除这个人的信息
//并向所有人广播这一消息
broadcast(time+"
area.append(time+name+"
说"
//同时向每个在线客户广播这则消息
catch(Exceptionex){
Calendarca=newGregorianCalendar();
inthh=ca.get(Calendar.HOUR_OF_DAY);
intmm=ca.get(Calendar.MINUTE);
intss=ca.get(Calendar.SECOND);
Stringtime=newString(hh+"
area.append(time+name+"
下线了!
broadcast(time+name+"
list.remove(name+"
container.remove(name);
voidremoveClient(Stringname,Socketclient){
list.remove(name+"
container.remove(name);
voidbroadcast(Stringmsg){//broadcast---begin
Set<
Iterator<
Stringmessage=msg;
while(it.hasNext()){//如果列表中还有客户
SockettempClient=me.getValue();
singleCom(message,tempClient);
//就把消息发给这个客户
//向单个客户发送消息
privatevoidsingleCom(Stringmsg,SocketaClient){//singleCommunition---begin
PrintStreampw=newPrintStream(aClient.getOutputStream());
Stringmessage=msg;
pw.println(msg);
}catch(Exceptionex){
ex.printStackTrace();
publicstaticvoidmain(String[]args){
newServer().init