计算机网络专业课程设计.docx
《计算机网络专业课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络专业课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
计算机网络专业课程设计
大连工业大学课程设计(论文)任务书
专业
计算机、信计
班级
计09(1-3)、信计091
课程名称
计算机网络
题目
设计编写一个基于socket套接字网络通信程序——聊天、文件传输
或电子邮件程序。
指导老师
路莹,肖鹏
答疑老师
路莹,肖鹏
设计时间
6月25日至6月29日共一周
设计要求
设计(论文)任务和基础要求,包含设计任务、查阅文件、方案设计、说明书(计算、图纸、撰写内容及规范等)、工作量等内容。
课程设计要求:
1、采取B/S模式或C/S模式,上机编写代码,实现服务器/用户端网络通信,并调试成功。
推荐题目最少完成一个,编程实现,不得采取现有应用软件。
要求界面美观,系统操作灵活、便于用户使用:
●聊天程序:
完成广播公共聊天平台和单播私人聊天,并应含有简单帐号管
理功效;
●文件传输程序:
完成服务器端可供传输文件浏览、用户端目标路径可选、指定文
件传输等功效;
●电子邮件程序:
完成用户端在线收、发邮件,管理邮件等功效。
●套接字编程任选题目
2、撰写课程设计汇报——题目、目标、方案设计、调试结果、心得体会。
3、周一查阅资料,设计方案;周二至周四上机编写代码,调试实现;周五演示程序、答辩,并上交课程设计汇报。
4、两名同学一组,自由组合,并依据完成任务量情况署名。
5、撰写课程设计汇报:
封皮(设计题目、专业、班级、学生姓名、学生学号、指导老师姓名、起止时间)、具体任务、软件环境、算法设计思想及步骤图、源代码、运行结果、收获及体会、参考文件
成绩评定方法:
按对套接字基础知识掌握程度,选定软件项目标经典性和难度,分析设计方案是否正确,功效实现是否完善,文档说明是否清楚、正确,格式是否规范等步骤评分。
成绩按优、良、中、及格、不及格五级分制评定。
指导老师签字:
路莹肖鹏系(教研室)主任签字:
计算机网络
课程设计汇报
设计题目:
套接字网络通信程序
专业计算机科学和技术
学生1计算机092-09王磊
学生2计算机092-12郑林
指导老师路莹,肖鹏
起止时间.6.25—.6.29
一、需求分析:
编写一个聊天程序,能够实现广播公共聊天平台,并含有简单帐号管理功效。
采取c/s模式,基于winsock套接字网络通信程序,可实现双机通信。
二、概要设计
用户端模块功效:
界面:
显示登录按钮,退出按钮,消息显示框,消息发送框,发送按钮等功效性组件,及用户名,服务器IP,参与者等提醒信息。
登录:
输入用户名,服务器IP,点击登陆按钮,实例化一个当地套接字,然后实例化用户端线程用来建立和服务端连接。
退出:
关闭套接字,停止线程运行,并重新置空值。
消息发送:
使用登录时建立套接字发送消息给服务器。
消息接收显示:
把从服务端传输过来消息显示在聊天内容框。
算法设计:
(1)publicclassChatClient{}模块:
该模块作为创建用户方法,其中包含用户端套接字定义模块,用户端图形界面设计模块,连接服务器模块,接收消息线程体模块,用户端按钮监听模块,监听处理模块等。
(2)用户端套接字定义模块:
经过socket类创建一个socket类对象,连接到服务器端所开放端口。
(3)用户端图形界面设计模块:
经过调用JFrame类方法,设计用户端界面按钮和界面属性。
包含五个文本框,三个按钮(发送、登录、退出)。
(4)连接服务器模块:
经过服务器IP地址和指定端口8888连接到服务器。
(5)接收消息线程体模块:
经过创建多线程接收服务器发送消息,加入异常处理。
(6)用户端按钮监听和处理模块:
经过为每个按钮创建监听器,和为每个监听编写处理方法来处理用户端操作。
比如当点击“发送”按钮时,监听器监测到用户动作,经过调用对应程序向服务器端发送用户端消息。
服务器端模块功效:
服务器端经过创建ServerSocket对象,为用户端提供IP地址和服务器开放端口号,同时服务器还创建了两个列表,一个用来存放用户名,另一个用来存放线程。
服务器端经过监听8888端口,接收来自客服端消息,并将其转发给每个用户端。
算法设计:
(1)publicclassChatServer{}模块:
该模块用来创建ServerSocket对象,开启服务器,经过创建多线程监听开放端口,接收并转发用户端发来消息。
(2)publicvoidstartServer(){}模块:
该模块功效是开启服务器,获取服务器IP,并加入了异常处理功效。
(3)publicvoidrun(){}模块:
该模块是消息接收和转发模块,经过端口接收消息并转发给每一个在线用户端。
系统软件环境:
JDK2.0,NetbeansIDE6.9.1
三、具体设计
用户端代码:
packagejavaapplication27;
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
import.*;
importjavax.swing.*;
importjava.text.*;
importjava.util.*;
/**
*聊天系统用户端
*
*/
publicclassChatClient{
Socketsocket;
DataOutputStreamdos;//数据输出流
DataInputStreamdis;
booleanisConnected=false;
TextAreata1;
TextAreata2;
TextAreata3;
StringuserName;
StringserverIP;
Threadreceiver=newThread(newReceiverThread());
publicChatClient(){
newInterface();
}
//连接到服务器
publicvoidconnect()
{
try
{
socket=newSocket(serverIP,8888);//传入端口号和IP
dos=newDataOutputStream(socket.getOutputStream());//写入数据输出流中
dis=newDataInputStream(socket.getInputStream());
isConnected=true;
}
catch(UnknownHostExceptione)
{
System.out.println("找不到服务器...");
}catch(IOExceptione)
{
e.printStackTrace();
}
}
//接收消息线程体
classReceiverThreadimplementsRunnable
{
Stringstr=null;
publicvoidrun()
{
try
{
while(isConnected)//当连接成功
{
str=dis.readUTF();//读出数据
if(str.startsWith("@"))//假如接收到是在线者名字
{
ta3.setText(str.substring(1,str.length()-1));
}
else
{//假如接收到是聊天内容
ta1.setText(ta1.getText()+"\n"+str);
}
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
publicstaticvoidmain(String[]args){
try{//设置显示风格
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
}catch(Exceptione){
System.out.println("Can'tsetthisLookAndFeel!
");
}
newChatClient();
}
classInterfaceextendsJFrameimplementsActionListener
{//用户端界面
JTextFieldjtf1,jtf2;
publicInterface()
{
JPaneljp1=newJPanel();
jp1.setLayout(null);
ta1=newTextArea("",30,18,TextArea.SCROLLBARS_BOTH);
ta1.setEditable(false);
ta1.setBounds(6,0,420,265);
ta1.setBackground(Color.white);
ta2=newTextArea("",20,18,TextArea.SCROLLBARS_VERTICAL_ONLY);//聊天内容输入区
ta2.setBounds(6,290,420,130);
JButtonjb1=newJButton("发送");
jb1.addActionListener(this);//给发送按钮注册监听器
jb1.setBounds(360,428,60,30);
jp1.add(ta1);
jp1.add(ta2);
jp1.add(jb1);
JPaneljp2=newJPanel();//登录面板
//jp2.setBackground(color);
jtf1=newJTextField(15);
jtf2=newJTextField(15);
JButtonjb2=newJButton("登录");
jb2.addActionListener(this);//给登录按钮注册监听器
JButtonjb3=newJButton("退出");
jb3.addActionListener(this);//给退出按钮注册监听器
ta3=newTextArea("",21,15,TextArea.SCROLLBARS_VERTICAL_ONLY);//在线者显示区
ta3.setEditable(false);
JPaneljp=newJPanel();
//jp.setBackground(color);
jp.add(jb2);
jp.add(jb3);
jp2.setLayout(newBoxLayout(jp2,BoxLayout.Y_AXIS));//指定组件从上到下
jp2.add(newJLabel("用户名"));
jp2.add(jtf1);
jp2.add(newJLabel("服务器IP"));
jp2.add(jtf2);
jp2.add(jp);
jp2.add(newJLabel("参与者"));
jp2.add(ta3);
jp2.add(newJLabel(""));
setBounds(150,150,620,530);
Containerc=getContentPane();
c.setLayout(newBorderLayout());
c.add(jp1,"Center");
c.add(jp2,"East");
setTitle("聊天室");
setResizable(false);//设置窗口大小不可调整
//关闭窗口监听器
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente){
if(userName!
=null)
{
try
{
dos.writeUTF("#"+userName+"\n");
dos.flush();
}
catch(IOExceptione1)
{
e1.printStackTrace();
}
if(socket!
=null)
{
System.out.println("用户:
"+userName+"\n已退出!
");
}
}
System.exit(0);
}
});
setVisible(true);
}
publicvoidactionPerformed(ActionEvente)
{
//发送消息
if(e.getActionCommand().equals("发送"))
{
Stringtime=DateFormat.getDateTimeInstance().format(newDate());//设置时间
Stringmessage=userName+"\t"+time+"\n"+ta2.getText().trim();
ta2.setText("");
if(userName==null||userName.equals("")||serverIP==null||serverIP.equals(""))
{
JOptionPane.showMessageDialog(this,"请先登录","提醒",JOptionPane.WARNING_MESSAGE);
}
else
{
try
{
dos.writeUTF(message);
dos.flush();
}
catch(IOExceptione1)
{
e1.printStackTrace();
}
}
}
//登录
elseif(e.getActionCommand().equals("登录"))
{
userName=jtf1.getText();
serverIP=jtf2.getText();
if(userName.equals(""))
{
JOptionPane.showMessageDialog(this,"请输入用户名","警告",JOptionPane.WARNING_MESSAGE);
}
elseif(serverIP.equals("")){
JOptionPane.showMessageDialog(this,"�请输入服务器IP","警告",JOptionPane.WARNING_MESSAGE);
}
if((!
userName.equals(""))&&(!
serverIP.equals(""))&&(!
isConnected))
{
connect();//连接server
try
{
dos.writeUTF("@"+userName+"\n");//发送登陆者名字
dos.flush();
System.out.println("用户:
"+userName+"\n已登录");
receiver.start();//开启接收消息线程
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
//退出
elseif(e.getActionCommand().equals("退出"))
{
if(userName!
=null)
{
try
{
dos.writeUTF("#"+userName+"\n");//发送退出者名字
dos.flush();
}
catch(IOExceptione1)
{
e1.printStackTrace();
}
if(socket!
=null){
System.out.println("用户:
"+userName+"\n已退出!
");
}
}
System.exit(0);
}
}
}
}
服务器端代码:
packagejavaapplication27;
importjava.io.*;
import.*;
importjava.util.*;
/**
*聊天系统服务器端
*
*
*/
publicclassChatServer{
ServerSocketss;
booleanisStarted=false;
Listclients=newArrayList();//存放线程列表
ListuserNames=newArrayList();//存放用户名列表
Stringactors;
StringuserName;
//开启服务器
publicvoidstartServer()
{Socketsocket=null;
Clientclient=null;
InetAddressserverIP;
try
{ss=newServerSocket(8888);//建立ServerSocket
isStarted=true;
}
catch(IOExceptione)
{e.printStackTrace();
}
try
{
serverIP=InetAddress.getLocalHost();//获取本机IP
System.out.println("服务器IP:
"+serverIP.getHostAddress());
}
catch(Exceptione)
{
System.out.println("Error!
");
}
try
{while(isStarted)
{
socket=ss.accept();
client=newClient(socket);//建立连接,创建一个server端线程和client端通信
newThread(client).start();//开启线程,根本程负责不停监听用户端连接
clients.add(client);//将新线程加入列表
}
}
catch(IOExceptione)
{
e.printStackTrace();
}
finally
{
try
{
ss.close();//关闭socket
}
catch(IOExceptione)
{
e.printStackTrace();
}
}
}
publicstaticvoidmain(String[]args)
{
newChatServer().startServer();
}
//创建一个和client端通信server端线程
classClientimplementsRunnable
{
Sockets;
DataInputStreamdis;
DataOutputStreamdos;
booleanisConnected=false;
publicClient(Sockets)
{
this.s=s;
try
{
dis=newDataInputStream(s.getInputStream());
dos=newDataOutputStream(s.getOutputStream());
isConnected=true;
}
catch(IOExceptione)
{
e.printStackTrace();
}
}
//发送数据
publicvoidsend(Stringstr)
{
try
{
dos.writeUTF(str);
}
catch(IOExceptione)
{
e.printStackTrace();
}
}
publicvoidrun()
{
Stringstr=null;
Clientclient=null;
try
{
while(isConnected)
{
str=dis.readUTF();//接收数据
if(str.startsWith("@"))//接收到是登陆者名
{
actors="@";
userName=str.substring(1,str.length());
System.out.println("用户:
"+userName+"已登录!
");
userNames.add(userName);//把新登录者名加入名字列表
for(inti=0;i{
actors+=userNames.get(i);
}
str=actors;
}
elseif(str.startsWith("#"))//接收到是退出者名字
{
actors="@";
userNa