多人聊天程序课程设计报告

多人聊天程序课程设计报告
多人聊天程序课程设计报告

合肥学院

计算机科学与技术系

课程设计报告

2011~2012学年第二学期

课程Java语言程序设计

课程设计名称多人聊天程序

专业班级09网络工程(2)班

姓名胡永雷

指导教师张贯虹张艳明

2012年9月

一、需求分析

聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客户机/服务器架构模式。通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能。用多线程可完成多点对多点的聊天。

主要有两个应用程序,分别为服务器程序和客户端程序。服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。该聊天系统实现私聊,群聊,用户登陆,退出聊天系统等功能。

二、设计

1.设计思想:

课程设计中利用JAVA实现基于C/S模式的聊天程序。聊天室共分为服

务器端和客户端两部分,服务器端程序主要负责侦听客户发来的消息,客

户端登录到服务器端才可以实现正常的聊天功能。

图1-1

开始

启动服务器

判断启动信息

启动客户端

判断登录信息

登录聊天室

退出聊天室

结束

注册用户

退出服务器

图1-2

2.功能设计

(1)服务器端的主要功能如下。

在特定端口上进行侦听,等待客户端连接。用户可以配置服务端的侦

听端口,默认端口为8888.

向已经连接到服务端的用户发送系统消息。 统计在线人数。

当停止服务时,断开所有用户连接。 (2)客户端的主要功能如下。

连接到已经开启聊天服务的服务端。

用户可以配置到连接服务器的IP地址和端口号。

用户可以配置连接后显示的用户名。

当服务器端开启的话,用户可以随时登录与注销。

用户可以向所有人或者某一个人发送消息。

3.详细设计

聊天室服务器端设计

聊天室服务器主要包括7个文件,他们功能如下。

(1)ChatServer.java

包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用ServerListen 类来实现服务端用户上线与下线侦听,调用ServerReceive类来实现服务器端的消息收发。

(2)ServerListen.java

该类实现服务端用户上线与下线的侦听。该类对用户上线下线的侦听通过调用用户链表来实现,当用户上线与下线情况发生的时候,该类会对主类的界面进行相应的修改。

(3)ServerReceive.java

该类是实现服务器消息收发的类,该类分别定义了向某用户及所有人发送消息的方法,发送消息会显示在主界面类的界面上。

(4)Portconf.java

该类继承自JDialog,是用户对服务器端侦听端口进行配置的的类。

(5)Node.java

用户链表的节点类,定义了链表中的用户。

(6)UserLinkList.java

用户链表节点的具体实现类,该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这五个方法。

(7)Help.java

服务器端的帮助类。

聊天室客户端设计

聊天室客户端主要包括5个文件,他们的功能如下。

(1)Chatclient.java

包含名为 Chatclient的Public类,其主要功能为定义客户端的界

面,添加事件侦听与事件处理。该类定义了Connect()与Disconnect()

方法实现与服务器连接与断开连接。当SendMessege()方法来向其他用户

发送带有表情的消息或者悄悄话。

(2)ClientReceive.java

该类是实现服务器端与客户端消息收发的类。

(3)ConnectConf.java

该类继承自Jdialog,是用户所要连接的服务器IP及侦听端口进行修

改配置的类。

(4)UserConf.java

该类继承自Jdialog,是用户对连接到服务器时所显示的用户名进行

修改配置的类。

(5)Help.java

客户端程序的帮助类。

三、调试及测试

1、调试过程中遇到的主要问题及解决方法

程序中主要问题为:

(1)套接字的通信问题

网络上两个程序通过一个双向的通信链接实现数据交换,每一端都建立一个Socket,通过对Socket的读写操作实现网络的通信功能。Socket通信程序的基本结构的基本结构主要有创建Socket、打开连接到Socket的输入流和输出流、按照一定的协议对Socket进行读写操作、关闭Socket这四个步骤。为了完成Socket通信,https://www.360docs.net/doc/7013316997.html, 包中提供了Socket 和ServerSocket这两个类,他们分别用来表示双向连接的客户端和服务器。构造函数如下:

Socket(Inetaddress address,,int port)

Socket (Inetaddress address, int port, Boolean stream)

Socket (String host ,int port)

Socket (String host ,int port, Boolean stream)

ServerSocket (int port)

ServerSocket ( int port, int count)

通信模型中首先在客户机和服务器之间定义一套通信协议,并创立一个Socket 类,利用这个类建立一条可靠的链接;客户端发出请求,服务器端监听来自客户机的请求,并为客户端提供响应服务。要是实现套接字的服务器端,要使用SocketServer类。它允许程序绑定一个端口等待客户端的请求,一旦产生客户端请求,它将接受这一请求,同时产生一个完整的Socket连接对象。服务器绑定端口必须公开,以便让客户端程序知道如何连接这个服务器。同时作为服务器,它必须能够接受多个客户的请求,这就需要为服务器设置一个请求队列。由于存在单个服器与多个客户程序通信,所以服务程序响应客户程序不应花很多时间,否则客户程序在得到服务前有可能花很多时间来等待通信的建立,然而服务程序和客户程序的会话可能很长,因此为加快对客户程序连接请求的响应,典型的方法是服务器主机运行一个后台线程,这个后台线程处理服务程序和客户程序的通信。

(2)数据报通信问题

Java通过DatagramPacket和DatagramSocket两个类来实现UDP协议顶层的数据报。DatagramPacket生成的对象表示一个数据报,而DatagramSocket 是用来发送和接受数据包的类。

生成DatagramPacket对象可以通过四个构造函数:

DatagramPacket( byte data [ ],int size )

DatagramPacket( byte data [ ],int offset, int size)DatagramPacket( byte data [ ],int size, InetAddress ipAddress, int port )

DatagramPacket( byte data [ ], int offset, int size, InetAddress ipAddress, int port)

对于DatagramPacket内部状态,可以使用如下方法获得:

InetAddress getAddress()

返回目标文件InetAddress,一般用于发送。

int getPort()

返回端口号。

byte [ ] getData()

返回包含在数据包中的字节数组数据。

int getLength()

返回包含在将从getData()方法中返回字节数组的有效数据长度。DatagramSocket类用来发送和结束数据包。需要首先建立DatagramSocket对象来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体。

DatagramSocket类常用的构造函数:

DatagramSocket()

DatagramSocket(int port)

DatagramSocket(int port,InetAddress ipAddress)

DatagramSocket接收数据报要用receive(DatagramSocket p)方法,而发送数据报则使用send(DatagramSocket p)方法。要发送一个数据报首先要创建一个DatagramPacket,指定要发送的数据、数据长度、数据要发送到哪个主机和端口,然后在用DatagramSocket的send()方法发送数据包;接收一个数据报必须创建一个在本地主机的特定端口上侦听的DatagramSocket,此套接字只能接收发送至特定端口上的数据包。

2、对设计和编码的回顾讨论和分析

在本程序中,用户的存储时通过链表来实现的。用了UserLinkList定义了链表及其操作,Node定义了用户链表节点。

用户链表的结点类:

public class Node {

String username = null;

Socket socket = null;

ObjectOutputStream output = null;

ObjectInputStream input = null;

Node next = null;

}

用户链表

public class UserLinkList {

Node root;

Node pointer;

int count;

构造用户链表

public UserLinkList(){

root = new Node();

root.next = null;

pointer = null;

count = 0;

}

添加用户

public void addUser(Node n)

删除用户

public void delUser(Node n)

返回用户数

public int getCount()

根据用户名查找用户

public Node findUser(String username)

根据索引查找用户

public Node findUser(int index)

3、程序运行的时空效率分析

本程序应用了线程对端口进行侦听。线程一直后台开启,长期占用系统资源,但又能及时的实现端口监听和消息的收发。

4、测试数据集

服务器端程序主界面:

图1-3 服务器侦听端口的配置:

图1-4 服务器端帮助窗口:

图1-5 服务器端启动时的界面:

图1-6 确认停止服务器:

图1-7 客户端用户名配置界面:

图1-8客户端帮助界面:

图1-9 客户端程序运行主界面:

图1-10

服务端关闭界面:

图1-11

四、经验和体会

经过一个学期的JAVA课程学习了解了JAVA的基础理论知识,通过这次程序设计,进一步巩固、加深了我们所学专业课程的基本理论知识,理论联系实际,进一步培养了综合分析问题,解决问题的能力,进一步加强了JAVA的实际应用能力。通过本次Java语言课程设计,我对面向对象的程序设计有了更深程度的掌握,它将重点放在对象与对象的接口上。在通过对题目进行需求分析,考虑一些编程中可能遇到的问题。其次开始界面设计、类的设计、类功能的连接等等实现。在遇到问题解决问题的过程中

不断完善功能。同时在老师和同学的帮助下,不断完善自己的成果,不断

改进,不断进步。这次Java课程设计不仅考查了对Java语言基本理论知

识的学习程度还考核了我们综合运用以及学习新知识的能力。我也在和同

学老师的交流中感觉到一个人的力量或许很渺小,而Java程序设计不仅

仅是一个人能够解决所有问题的,当我们走出学校,面向社会的时候,我

们需要更多的去与人交流,融入一个团体中,大家位一个共同的目标奋斗。这次课程设计不仅仅让我在掌握课本上的知识里更进一步,也让我体会到

很多以后必须面对的问题。在以后的学习以及未来的工作生活中我们都要

好好把握我们需要去掌握的东西,能让我们更好去适应社会需求的知识我

们一定不要错过。

五、附录(主要功能代码)

package com.Client;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

import java.io.*;

import https://www.360docs.net/doc/7013316997.html,.*;

/*

* 聊天客户端的主框架类

*/

public class ChatClient extends JFrame implements ActionListener{ //,其主要功能为定义客户端的界面,添加事件侦听与事件处理。该类定义了Connect()与Disconnect()方法实现与服务器连接与断开连接。

//当SendMessege()方法来向其他用户发送带有表情的消息或者悄悄话。

String ip = "127.0.0.1";//连接到服务端的ip地址

int port = 8888;//连接到服务端的端口号

String userName = "胡永雷";//用户名

int type = 0;//0表示未连接,1表示已连接

Image icon;//程序图标

JComboBox combobox;//选择发送消息的接受者

JTextArea messageShow;//客户端的信息显示

JScrollPane messageScrollPane;//信息显示的滚动条

JLabel express,sendToLabel,messageLabel ;

JTextField clientMessage;//客户端消息的发送

JCheckBox checkbox;//悄悄话

JComboBox actionlist;//表情选择

JButton clientMessageButton;//发送消息

JTextField showStatus;//显示用户连接状态

Socket socket;

ObjectOutputStream output;//网络套接字输出流

ObjectInputStream input;//网络套接字输入流

ClientReceive recvThread; //建立菜单栏

JMenuBar jMenuBar = new JMenuBar(); //建立菜单组

JMenu operateMenu = new JMenu ("操作(O)"); //建立菜单项

JMenuItem loginItem = new JMenuItem ("用户登录(I)");

JMenuItem logoffItem = new JMenuItem ("用户注销(L)");

JMenuItem exitItem=new JMenuItem ("退出(X)");

JMenu conMenu=new JMenu ("设置(C)");

JMenuItem userItem=new JMenuItem ("用户设置(U)");

JMenuItem connectItem=new JMenuItem ("连接设置(C)");

JMenu helpMenu=new JMenu ("帮助(H)");

JMenuItem helpItem=new JMenuItem ("帮助(H)");

//建立工具栏

JToolBar toolBar = new JToolBar();//建立工具栏中的按钮组件JButton loginButton;//用户登录

JButton logoffButton;//用户注销

JButton userButton;//用户信息的设置

JButton connectButton;//连接设置

JButton exitButton;//退出按钮

//框架的大小

Dimension faceSize = new Dimension(400, 600);

JPanel downPanel ;

GridBagLayout girdBag;

GridBagConstraints girdBagCon;

public ChatClient(){

init();//初始化程序

//添加框架的关闭事件处理

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.pack();

//设置框架的大小

this.setSize(faceSize);

//设置运行时窗口的位置

Dimension screenSize =

Toolkit.getDefaultToolkit().getScreenSize();

this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2,

(int) (screenSize.height -

faceSize.getHeight()) / 2);

this.setResizable(false);

this.setTitle("聊天室客户端"); //设置标题

//程序图片

icon = getImage("icon.gif");

this.setIconImage(icon); //设置程序图标

show();

//为操作菜单栏设置热键'V'

operateMenu.setMnemonic('O');

//为用户登录设置快捷键为ctrl+i

loginItem.setMnemonic ('I');

loginItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_I,InputEvent.CTRL_MASK));

//为用户注销快捷键为ctrl+l

logoffItem.setMnemonic ('L');

logoffItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_L,InputEvent.CTRL_MASK));

//为退出快捷键为ctrl+x

exitItem.setMnemonic ('X');

exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK));

//为设置菜单栏设置热键'C'

conMenu.setMnemonic('C');

//为用户设置设置快捷键为ctrl+u

userItem.setMnemonic ('U');

userItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_U,InputEvent.CTRL_MASK));

//为连接设置设置快捷键为ctrl+c

connectItem.setMnemonic ('C');

connectItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_C,InputEvent.CTRL_MASK));

//为帮助菜单栏设置热键'H'

helpMenu.setMnemonic('H');

//为帮助设置快捷键为ctrl+p

helpItem.setMnemonic ('H');

helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK));

}

/**

* 程序初始化函数

*/

public void init(){

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());//内容面板设置为边界布局

//添加菜单栏,把登陆,注销,用户设置。。。按钮放到菜单栏中

operateMenu.add (loginItem);

operateMenu.add (logoffItem);

operateMenu.add (exitItem);

jMenuBar.add (operateMenu);

conMenu.add (userItem);

conMenu.add (connectItem);

jMenuBar.add (conMenu);

HelpMenu.add (helpItem);

jMenuBar.add (helpMenu);

setJMenuBar (jMenuBar);

//初始化按钮

loginButton = new JButton("登录");

logoffButton = new JButton("注销");

userButton = new JButton("用户设置" );

connectButton = new JButton("连接设置" );

exitButton = new JButton("退出" );

//当鼠标放上显示信息

loginButton.setToolTipText("连接到指定的服务器");

logoffButton.setToolTipText("与服务器断开连接");

userButton.setToolTipText("设置用户信息");

connectButton.setToolTipText("设置所要连接到的服务器信息");

//将按钮添加到工具栏

toolBar.add(userButton);

toolBar.add(connectButton);

toolBar.addSeparator();//添加分隔栏

toolBar.add(loginButton);

toolBar.add(logoffButton);

toolBar.addSeparator();//添加分隔栏

toolBar.add(exitButton);

contentPane.add(toolBar,BorderLayout.NORTH);

checkbox = new JCheckBox("悄悄话");

checkbox.setSelected(false);

actionlist = new JComboBox();//表情按钮

actionlist.addItem("微笑地");

actionlist.addItem("高兴地");

actionlist.addItem("轻轻地");

actionlist.addItem("生气地");

actionlist.addItem("小心地");

actionlist.addItem("悄悄的");

actionlist.setSelectedIndex(0);

//初始时把登陆按钮设置可用,调用setEnabled方法,设置为true

loginButton.setEnabled(true);

logoffButton.setEnabled(false);//开始注销按钮不可用

//为菜单栏添加事件监听器

loginItem.addActionListener(this);

logoffItem.addActionListener(this);

exitItem.addActionListener(this);

userItem.addActionListener(this);

connectItem.addActionListener(this);

helpItem.addActionListener(this);

//添加按钮的事件侦听

loginButton.addActionListener(this);

logoffButton.addActionListener(this);

userButton.addActionListener(this);

connectButton.addActionListener(this);

exitButton.addActionListener(this);

//以下为下列列表框,目前设置为发送至:所有人

combobox = new JComboBox();

combobox.insertItemAt("所有人",0);

combobox.setSelectedIndex(0);

messageShow = new JTextArea();

messageShow.setEditable(false);

//添加滚动条

messageScrollPane = new JScrollPane(messageShow,

JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

messageScrollPane.setPreferredSize(new

Dimension(400,400));

messageScrollPane.revalidate();

//消息窗口设置

clientMessage = new JTextField(23);

clientMessage.setEnabled(false);

//消息按钮

clientMessageButton = new JButton();

clientMessageButton.setText("发送");

//添加系统消息的事件侦听

clientMessage.addActionListener(this);

clientMessageButton.addActionListener(this);

sendToLabel = new JLabel("发送至:");

express = new JLabel(" 表情: ");

messageLabel = new JLabel("发送消息:");

downPanel = new JPanel();

girdBag = new GridBagLayout();

downPanel.setLayout(girdBag);

girdBagCon = new GridBagConstraints();//GridBagConstraints 接口为布局。

girdBagCon.gridx = 0;// 指定包含组件的显示区域开始边的单元格,其中行的第一个单元格为 gridx=0。

girdBagCon.gridy = 0;// 指定位于组件显示区域的顶部的单元格,其中最上边的单元格为 gridy=0。

girdBagCon.gridwidth = 5;//指定在组件显示区域的一列中的单元格数

girdBagCon.gridheight = 2;//指定组件显示区域的某一行中的单元格数

girdBagCon.ipadx = 5;

girdBagCon.ipady = 5;

JLabel none = new JLabel(" ");

girdBag.setConstraints(none,girdBagCon);

downPanel.add(none);

girdBagCon = new GridBagConstraints();//同上

girdBagCon.gridx = 0;

girdBagCon.gridy = 2;

girdBagCon.insets = new Insets(1,0,0,0);

//girdBagCon.ipadx = 5;

//girdBagCon.ipady = 5;

girdBag.setConstraints(sendToLabel,girdBagCon);

downPanel.add(sendToLabel);//把发送加入面板中

girdBagCon = new GridBagConstraints();

girdBagCon.gridx =1;

girdBagCon.gridy = 2;

girdBagCon.anchor = GridBagConstraints.LINE_START;

girdBag.setConstraints(combobox,girdBagCon);

downPanel.add(combobox);//把下列选框加入面板中

girdBagCon = new GridBagConstraints();

girdBagCon.gridx =2;

girdBagCon.gridy = 2;

girdBagCon.anchor = GridBagConstraints.LINE_END;

girdBag.setConstraints(express,girdBagCon);

downPanel.add(express);//把表情的标签加入面板中

girdBagCon = new GridBagConstraints();

girdBagCon.gridx = 3;

girdBagCon.gridy = 2;

girdBagCon.anchor = GridBagConstraints.LINE_START;

//girdBagCon.insets = new Insets(1,0,0,0);

//girdBagCon.ipadx = 5;

//girdBagCon.ipady = 5;

girdBag.setConstraints(actionlist,girdBagCon);

downPanel.add(actionlist);//把标签选择加入面板中

girdBagCon = new GridBagConstraints();

girdBagCon.gridx = 4;

girdBagCon.gridy = 2;

girdBagCon.insets = new Insets(1,0,0,0);

//girdBagCon.ipadx = 5;

//girdBagCon.ipady = 5;

girdBag.setConstraints(checkbox,girdBagCon);

downPanel.add(checkbox);//复选框加入面板中

girdBagCon = new GridBagConstraints();

girdBagCon.gridx = 0;

girdBagCon.gridy = 3;

girdBag.setConstraints(messageLabel,girdBagCon);

downPanel.add(messageLabel);//信息标签加入面板中

girdBagCon = new GridBagConstraints();

girdBagCon.gridx = 1;

girdBagCon.gridy = 3;

girdBagCon.gridwidth = 3;

girdBagCon.gridheight = 1;

girdBag.setConstraints(clientMessage,girdBagCon);

downPanel.add(clientMessage);//客户端信息加入面板中

girdBagCon = new GridBagConstraints();

girdBagCon.gridx = 4;

girdBagCon.gridy = 3;

girdBag.setConstraints(clientMessageButton,girdBagCon);

downPanel.add(clientMessageButton);//客户信息按钮加入面板中

showStatus = new JTextField(35);

showStatus.setEditable(false);

girdBagCon = new GridBagConstraints();

girdBagCon.gridx = 0;

girdBagCon.gridy = 5;

girdBagCon.gridwidth = 5;

girdBag.setConstraints(showStatus,girdBagCon);

downPanel.add(showStatus);//客户状态加入面板中

contentPane.add(messageScrollPane,BorderLayout.CENTER);

contentPane.add(downPanel,BorderLayout.SOUTH);

//关闭程序时的操作

this.addWindowListener(

new WindowAdapter(){

public void windowClosing(WindowEvent e){

if(type == 1){

DisConnect();

}

System.exit(0);

}

}

);

}

程序设计课程设计实验报告

《程序设计》课程设计姓名: 学号: 班级:软件工程14班 指导教师: 成绩:

1.消除类游戏 【问题描述】 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。 【基本要求】 现在给你一个n行m列的棋盘(1≤n,m≤30),棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。 请注意:一个棋子可能在某一行和某一列同时被消除。 输入数据格式: 输入的第一行包含两个整数n,m,用空格分隔,分别表示棋盘的行数和列数。接下来n行,每行m 个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。 输出数据格式: 输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。 【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可避免每次运行程序时都要从键盘输入数据。 测试数据一 输出说明: 棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。 测试数据二 输出说明: 棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。 【功能实现】 #include #include<> usingnamespacestd;

{ intm,n,i,j; inttemp; cin>>n>>m; temp=m; m=n; n=temp; int*map=newint[m*n]; int*mark=newint[m*n]; int*tmap=map; int*tmark=mark; intdif=0; ount=0; } p rintf("请输入要输入数的个数\n"); s canf("%d",&n);/*输入要输入数的个数*/ f or(i=0;idata1[j+1].number)

基于MFC的聊天程序设计

聊天程序设计报告 ----网络编程设计报告 目录 【1】设计原理————————————————————————1 【2】功能描述————————————————————————1 【3】详细设计————————————————————————2 【4】工作进度————————————————————————7 【5】设计总结————————————————————————8 【6】使用方法————————————————————————9 【7】附录——————————————————————————9 一. 设计原理 计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、中国移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。 此程序主要分为两个模块:服务线程和聊天线程。服务线程用于提供一个网络端口,等待客户线程发出请求,登录到作为服务端的程序,然后进行网络通讯和消息的收发;客户端可通过服务器端的IP地址发送连接请求,然后建立连接,进行通讯。整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。 二.功能描述(需求分析) 1、一对一会话。此程序既可以作为服务器,也可以作为客户端。当发起聊天请求时是客户端,而当接受连接请求时时服务器。通讯基于可靠的TCP连接。

程序设计基础实验报告

《程序设计基础》 实验报告 专业班级: 姓名: 学号:

实验一 面向过程的简单程序设计 1.实验目的要求 (1) 使用C++语言编写简单的计算机程序,掌握C++程序从编辑、编译到运行的全过程, 初步了解C++程序的特点。 (2) 掌握C++语言的数据类型(包括对各种数据类型变量的定义、初始化、赋值等)、运 算符和表达式的使用。 (3) 掌握赋值语句的使用。 (4) 掌握数据的输入输出方法。 2.实验内容 (1)设计简单程序,分别计算下列表达式,式中变量由键盘输入,输出表达式的值。 <1> d c b a x -++ <2> 11 11+++x x <3> sinX+cosX+tan -1 X <4> e x+y +e x-y <5> log 10(1+21x +) <6> 22b a -+??b a - (其中??a 表示取不大于a 的最大整数)。 <1> #include using namespace std; int main() { float x,a,b,c,d,e; cin>>x>>a>>b>>c>>d; e=x+(a+b)/(c-d); cout< #include #include using namespace std; int main() { double x,y; cin>>x; y=sqrt(1+1/(x+1/(x+1)));

cout< #include #include using namespace std; int main() { double x,y; cin>>x; y=sin(x)+cos(x)+1/tan(x); cout< #include #include using namespace std; int main() { double x,y,z; cin>>x>>y; z=exp(x+y)+exp(x-y); cout< #include #include using namespace std; int main() { double x,y; cin>>x; y=log(1+sqrt(1+x*x)); cout< #include #include using namespace std; int main()

C+++网络聊天室设计报告和源程序

目录 1.需求分析 (2) 2.相关知识............................................... - 3 -2.1W INSOCK介绍 (3) 2.2MFC类CA SYNCSOCKET和CS OCKET (3) 2.3利用CS OCKET进行有连接的通信 (4) 3.详细设计................................... 错误!未定义书签。 3.1客户端的实现 (4) 3.2服务端的实现 (8) 4.程序运行结果.......................................... - 13 -4.1服务器端 .. (13) 4.2客户端 (13) 5.参考文献 ................................................................................................................... 错误!未定义书签。

1.需求分析 当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet 的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。 在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。 聊天室适用于网上会议或闲聊的一些场合。聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。 聊天室的设计目标 本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为: 服务器端功能: 1、初始化socket, 创建服务器端。 2、维护一个链表,保存所有用户的IP地址、端口信息。 3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。 4、接受用户传送来的连接判断命令,并向用户发出响应命令。 客户端功能: 客户端界面上的两个文本框,一个用于显示接受的聊天信息,一个用来接受用户输入的聊天信息。当按下“发送”按钮时将信息发送给服务器。 通过本课题的毕业设计,可以比较深入的了解和掌握WINSOCK控件基本属性、方法和事件,理解网络聊天通信的概念,输控制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。并能巩固和扩展大学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。

贪吃蛇游戏程序设计实验报告

Windows编程大作业贪吃蛇设计与实现 学校:武汉轻工大学 院系: 班级: 姓名: 学号: 2015年12月16日

目录 一、题目介绍 二、设计目的 三、详细设计 3.1贪吃蛇本体设计 3.2贪吃蛇食物设计 3.3游戏界面设计 3.3.1游戏初始化 3.3.2游戏开始 3.3.3游戏暂停 3.3.4游戏退出 3.3.5游戏总界面 3.3.6游戏区域与背景 3.3.7关于SNAKE 3.4玩法规则设计 3.5核心设计 四、功能测试 五、总结 六、参考文献

一、题目介绍: 编写一个基于MFC的小游戏。 基本要求: 1、实现一个小游戏 2、实现基本游戏控制功能 3、具有游戏数据保存功能 4、界面布局合理、美观; 二、设计目的: 通过使用vc++6.0实现一个小游戏的课程设计,进一步掌握MFC的高级使用方法和锻炼自己动手写程序的能力。了解游戏设计的整个过程,通过熟练使用MFC来设计游戏。程序主要包括:游戏界面设计,游戏菜单栏设计,游戏初始化,游戏控制等。培养和锻炼开发游戏的能力。 三、详细设计 3.1贪吃蛇的本体设计 贪吃蛇的头部拥有一个坐标(x,y),蛇体有一个长度len,蛇有一个运动方向direct,故定义一个结构体如下: struct Snake { int x,y; int len; int direct; }Snake[50]; 3.2贪吃蛇食物设计 贪吃蛇的食物有一个坐标(x,y),此食物有一个标志isfood,当isfood为0时,表示食物还没被吃,为1时,表示被吃。 struct Food { int x; int y; int isfood; }Food; 3.3游戏界面设计 3.3.1游戏初始化 游戏初始蛇体长度为3,颜色为灰色,食物标志为1,因为此时没有显示出食物,需要随机生成后,才置为0;

一对多的聊天程序设计

实习题目:一对多的聊天程序设计 设计要求:实现一个一对多的聊天程序:包含服务器端和客户端;要求具有图 形界面;支持多人聊天;可采用UDP或者TCP协议。 原理概述:本程序是利用java程序实现一对多聊天软件的设计。首先编写服务器端的程序ChatServer,然后编写客户端的程序ChatApplet,客户端程序是可以嵌入到浏览器里的Applet里的小程序,即客户端通过网页登陆。服务器端的程序为每个连入的ChatApplet创建一个对应的线程,该线程监听对应Applet 是否有消息传来,若有消息传来则把信息广播给每个连入的客户端Applet。服务器程序的主入口是main()方法,它负责服务端口的定义和初始化以及接受用户的连入请求并通知所有用户Applet有新用户加入,而且循环监听。监听线程采用的是Runnable接口,线程的执行体是在Run()方法中实现的,调用线程是由main()方法中的语句new Thread(st).start();,另外发送信息采用的是线程同步机制Synchronized()。 设计方案:一.通讯协议的选择 TCP与UDP有各自的优点。TCP是面向连接的协议,能满足大范围的应用程序的要求,能调节网际的动态环境,建立和管理本地通信进程之间的对话,维护TCP在流出和流入传输层TCP的模块的每个用户的状态和信息,拥有窗口流量控制机制和重传机制,实现非常可靠的数据传输,它的安全性和可靠性比UDP要高出很多。UDP是面向非连接的传输协议,UDP的应用程序在高可靠性、低延迟的网络中运行很好,在通讯子网QoS相对低下的情况下,可能无法正常运行,因为在于数据包的频繁丢失。虽然UDP如此不可靠,但是由于它传输的高效率,仍然被广泛采用。在某些场合的一来一往只有两次数据报的交换中,UDP比TCP更加有效,因为TCP的建立连接和撤消连接的开销往往要大得多。 本程序设计在客户端与服务器端的协议采用了UDP,虽然在效率上占了优势,因为依照目前网络通讯的发展,通信子网在其性能上的提高,使得UDP 可以发挥其强大的优势,但是安全性却实在令人担忧。 综合考虑的结果,在本聊天工具的客户端和服务器端的通讯采用TCP协议。而客户与客户端的通讯采用UDP协议。 二.线程技术的选择 在单线程系统中,如果系统进行如网络数据发送等在后台进行工作的应用程序时,程序界面就会处于死锁状态,无法接受用户的输入。但抢占式多任务,每一个进程可以同时执行多个任务,对于本系统,既要保证多用户之间可以进行聊天,又要保持对用户的响应,使用多线程是最佳选择。 三.套接字SOCKET的应用 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通

大学程序设计基础实验报告 (2)

**大学程序设计基础实验报告 实验名称:实验三分支结构 实验目的: 1、掌握IF-ELSE语句使用。 2、掌握ELSE-IF语句使用。 3、熟悉SWITCH语句使用。 实验内容: 在本地电脑中新建一个文件夹,用于存放C程序,文件夹的名字要求是“学号姓名-实验序号”,如E:\ 1920115555张三-03。启动C-Free,完成如下各题。 1、编程题:输入参数a,b,c,求一元二次方程ax2+bx+c=0的根(①a、b、c都为0,②a 和b为0,c不为0,③a为0,b不为0,c任意,④a不为0,且a、b、c满足b2-4ac ≥0,⑤a不为0,且a、b、c满足b2-4ac<0)。 2、编程题:输入职工的月薪salary,计算并输出应缴纳的个人所得税tax。tax=rate * (salary –850),rate的计算方式如下: 当salary <= 850,则rate = 0; 当850 < salary <= 1350,则rate = 5%; 当1350 < salary <= 2850,则rate = 10%; 当2850 < salary <= 5850,则rate = 15%; 当salary > 5850,则rate = 20%;。 3、编程题:根据输入的3个边长a、b、c,判断它们是否能构成三角形,若能构成三 角形,则进一步判断此三角形是哪种类型的三角形(等边三角形、等腰三角形、直角三角形和一般三角形。等腰直角算作等腰)。 4、编程题:输入一个形式如“操作数运算符操作数”的表达式,对2个整数进行乘、 除或求余运算。【请分别用if语句和switch语句实现此题功能】 上交作业的方法: 1.将程序代码及注释和运行程序的窗口复制到实验结果下方对应的题号上,并把这 次实验上机操作中遇到的问题及解决方法、心得等填好完成实验报告。 2.保存以上所有按要求已调试通过,并形成.c(或.cpp)和.exe文件到以自己的“学 号姓名-03”命名的文件夹中,并将以自己的“学号姓名”命名的文件夹压缩后上 交到ftp://10.172.250.252:1161中的“作业上传”文件夹下的“报告上交02”文件 夹下的子文件夹“源文件压缩上交”中,同时把以“学号姓名-03”命名的word 文档上交到“报告上交03”文件夹下的另一子文件夹“word文件上交”中。 特别提醒:每次上传的文件名一定要是“学号姓名-实验序号. doc”(如1720115555张

《基于Android的简单聊天通信软件设计》课程设计报告

目录 摘要 (1) 1.题目 (2) 2.概要设计 (2) 3.实训心得 (14) 4. 附录 (15) 1.题目 基于Android的简单聊天通信软件设计 (1)欢迎界面 (2)登录界面,登录界面中选择对方的IP地址和端口号 (3)与对方实现连接。实现点对点的通信。即点对点的聊天。 (4)聊天界面中,包括显示对方信息、聊天内容显示框、聊天内容输入框,以及发送按钮等(5)扩展1:实现表情的发送和显示,或者实现图片的发送和显示。 (5)扩展2:实现多人聊天。 1.1 需求分析 设计一个基于安卓系统的简单聊天通信软件,软件要实现点对点的通信。 UI:自己设计好符合软件的界面,使软件成熟化。 拓展:如有能力可使软件实现多人聊天,发生图片等。 2.概要设计 2.1 流程图 ↓ ↓

↓ ↓ ↓ ↓ 2.2详细设计 main.xml: 欢迎界面,延迟2秒左右自动跳转。Hello.java为其响应目录。 password.xml: 登录界面,验证用户输入信息,错误时用户可重新输入,正确后方可进 password.java为其响应目录。 findpassword.xml: 在登录界面中点击“忘记密码”后的跳转页面,可通过注册时的邮箱找回密码,但此功能目前还未实现,只有界面。findpassword.java为其响应目录。 create_id.xml: 在登录界面中点击“创建新账号”后的跳转页面,也还未实现其功能。create_id为其应目录。 main_menu.xml: 登录后的主菜单,包括“聊天”、“联系人”、“查找”等功能,均为图片按 main_menu.java为其响应目录。 chat.xml: 在主菜单中点击“聊天”后的聊天界面,输入IP地址后联系,可与进入相同服务器的用户聊天,聊天内容显示在对话框中。chat.java为其响应目录。 profile.xml: 在主菜单中点击“我的资料”的跳转页面,显示用户的一些信息。profile.java为其响应目录。 feedback.xml: 在主菜单中点击“反馈我们”的跳转页面,用户可在此页面告诉我们一些意见,但此功能目前还未实现。feedback.java为其响应目录。 about.xml: 在主菜单中点击“关于”的跳转页面,显示一些版本信息。about.java为其响应目录。setting.xml: 在主菜单中点击设置按钮后的跳转页面,其内容包括“切换账号”和“退出”。setting.java 为其响应目录。

游戏C语言实验报告

嘉应学院计算机学院 实验报告 课程名称: C程序设计 开课学期: 2015—2016学年第1学期 班级:计算机1505 指导老师:陈广明 设计题目:游戏2048 学生姓名(学号):第3组:钟瞻宇

目录 一、实验目的和要求 .................................................................................................................................................... 二、实验环境、内容和方法 ........................................................................................................................................ 三、程序设计 ................................................................................................................................................................ 四、源代码 .................................................................................................................................................................... 五、调试与运行结果.................................................................................................................................................... 六、总结........................................................................................................................................................................

聊天室程序设计

JA V A网络编程 ------文本传输 学院:通信与信息工程 班级:电子商务1002班 姓名:王鹏飞 学号:1007100222

JAVA 网络聊天室 功能描述 网络聊天室是一种应用广泛网络聊天方式,操作简单,功能丰富,是教学和学习面向对象的编程思想的理想项目。可以使用多种编程语言设计和开发出功能完善的网络聊天室。 本系统采用C/S 架构设计,用JAVA 语言设计和实现,整个项目分为服务器端和客户端。使用了最新的JAVA SE 标准Swing 组件,开发出简洁美观布局合理的客户端和服务器界面;利用Socket 网络开发技术实现客户端和服务器端的连接访问,实现网络通信功能;通过对数据流合理的封装,实现信息发送和接受。同时,采用多线程、多任务的设计思想,令服务器性能稳定,客户端通信流畅,基本实现聊天室的功能。 服务器端功能: 服务器的基本功能有:启动服务器,关闭服务器,监听客户端连接请求,显示在线用户,显示客户端连接信息,发送系统消息等。 服务器 监听客户端请求 显示在线用户列表 显示客户端连接信息 发送系统消息 关闭服务器 启 动服务器 服务器端功能描述: 1. 启动服务器:客户在运行服务端程序后,点击启动服务器,服务器程序创建 并箭筒特定端口的ServerSocket,并启动一个主线程,等待客户端的连接,如

果有客户端连接,服务器向工作线程队列中加入与客户通信的任务,工作线程不断从工作线程中取出任务并执行。同时在服务器消息面板中显示,服务器启动成功。 2.关闭服务器:服务器关闭时,向所有连接的客户端发送消息,告知将服务器 关闭,同时关闭socket,之后服务器界面关闭 3.监听客户端请求:服务器在启动后一直监听客户端的运行情况,比如有新用 户登录,用户退出等。 4.显示在线用户:用户登录后即客户端与服务器连接成功,服务器端用户列表 界面显示出所有登录用户的用户名,用户退出后服务器更新用户列表 5.显示用户连接信息:用户在登录成功后,服务器端服务信息界面显示用户登 录的信息,包括客户端IP地址,端口号。 6.发送系统消息:可以从服务器端广播系统消息,该消息会发送给所有连接的 客户端,此功能可用于服务器管理者向所有用户发送重要的系统消息。 服务器界面如下图所示:

聊天室设计报告

网 络 聊 天 系 统 设 计 报 告 组长:靳子豪 组员:凯强、许玉军、王明明 完成时间:2015年11月3日

一、可行性研究报告 可行性研究报告(ISO标准) 编者说明: 在立项时,应该对项目进行综合分析,探讨项目的经济、社会、技术可行性,从而为决策提供基础。该模板为ISO标准文档模板,其不仅适用于软件项目,对于其它的系统项目也适用。 1.引言 1.1 编写目的 该聊天室项目可行性研究报告是对项目课题的全面考虑,是项目分析员对下一步工作进行的前提,是软件开发人员正确成功开发项目的前提与基础。写可行性研究报告可以使软件开发团体尽可能早的估计研究课题的可行性,较早的认识到系统方案的缺陷,可以少花时间和精力,也可减少成本资金,避免专业性的问题。 1.2 背景 a. 待开发系统的名称:信息交流系统 b 用户:大众 c. 它基于web小浏览器的程序系统的设计与开发, 服务平台:appserv-win 开发语言:PHP 数据库:MY SQL 1.3 定义 技术可行性:分析功能,性能以及限制条件,能否是一个技术上可实现的系统 经济可行性:估计开发费用已及最终从开发成功的系统所获得的收入或利益,衡量比较支出的费用和收到的利益 1.4 参考资料 《软件工程导论》(第6版)清华大学海藩牟永敏编著 可行性研究的前提 2.1 要求 a、聊天室功能 用户的聊天功能,包括数据输入、修改、删除,并要达到界面美观又好、使用方便 b、软件的性能 开发该软件应具有的基本要求与功能是实现用户信息数据包括与用户有关的数据 的管理与操作处理,基于MY SQL的数据库的数据管理使该软件有更优异的性能,软件的基本数据流动为用户数据的输入,用户信息及数据的输出。 c、输出 用户基本信息和聊天容 d、输入 用户根据自身需要,发起聊天 e、安全方面的要求 设置管理员 2.2 目标 该软件的设计目标必须尽量达到人力与设备费用的节省,软件的整个设计过程必须通过生产能力的提高、人员工作效率的提高等等使软件开发成本最小化。 2.3 条件、假定和限制 a、本聊天室建议使用寿命为5-10年 b、法律方面的限制:(1)、严禁危害国家信息安全(2)、严禁损害国家荣誉和利益(3)、严禁传播不良信息(5)、严禁抄袭 2.4 进行可行性研究的方法 成本效益分析、对估算问题的看法、软件的作用围、软件的成本估算、速度安排

Java程序设计实验报告2(弹球游戏)[1]1

《Java语言程序设计》课程设计 实习报告 题目: 班级: 学号: 姓名: 同组人员: 指导老师:张彬

一、实验目的 1、掌握Swing图形用户界面编程以及事件处理等,掌握java绘图技术。 2、掌握多线程编程的基本原理,能使用Runnable、ExecutorService等接口进行 线程的创建、启动等工作。 3、培养独立查找资料,并解决问题的能力。 二、实验任务 1、设计并编程实现弹球游戏: 用户能通过GUI组件指定生成小球的数量,每个小球将从随机的位置出现,并具有随机颜色,随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,小球将依据受力原理改变运动方向(可简化考虑,受力只改变小球的运动方向,小球仍按照初始速度匀速运动,且不考虑小球之间的碰撞)。 鼠标在界面中显示为方块状,玩家需按住鼠标来回移动以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束。 程序需提供计时功能,并最终显示玩家能坚持多少秒。 2、程序要求: (1)具备相应界面,并通过事件编程,实现相应的GUI组件功能。 (2)使用多线程技术,在程序窗口区域绘制小球,并以线程控制小球的移动,实现动画效果。 (3)实现鼠标与屏幕四周,以及与小球的碰撞检测。 三、开发工具与平台 1.开发工具:Eclipse默认是一个和Jbuilder类似的Java开发工具,但它不仅仅只

是Java开发工具,只要装上相应的插件,eclipse也可作为其它语言的开发工具。如C/C++插件(CDT)。 2.开发平台:JDK1.5 四、设计思路 1.界面设计 (1)制作一个简单的面板JFrame,文件保存为bollFrame.java 其中为一public的类bollFrame,其构造方法为: bollFrame(int n){ super(); setTitle("我的弹球小游戏"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();//得到电脑屏幕大小 setSize(450,450); setLocation((dimension.width-game.getWidth())/2-250, (dimension.height-game.getHeight())/2-250);//设置面板显示基中; this.n = n; myBollPanel = new bollPanel(n);//构造一个画板; add(myBollPanel);//将画板放入JFrame createMenu();//创建菜单; setJMenuBar(bar); } (2)构造画板类,文件保存为bollPanel.java 其构造函数如下: bollPanel(int n){ this.n = n; // executorThread = Executors.newCachedThreadPool();//创建线程池; mouse = new mouseThread(mxNow,myNow,groupThread,this);//启动鼠标线程; this.setIsOver(false);//游戏开始线程条件的判断; for(int i =0 ;i

简易聊天应用程序的设计与实现

Java网络程序设计大作业分组报名表

目录 一、团队介绍及人员分工..................................... 错误!未定义书签。 团队介绍 .............................................. 错误!未定义书签。 人员分工 .............................................. 错误!未定义书签。 二、作品概述............................................... 错误!未定义书签。 创作背景 .............................................. 错误!未定义书签。 功能概要 .............................................. 错误!未定义书签。 相关技术 ............................................... 错误!未定义书签。 作品可行性分析 ........................................ 错误!未定义书签。 三、需求分析............................................... 错误!未定义书签。 功能性需求 ............................................ 错误!未定义书签。 非功能性需求 .......................................... 错误!未定义书签。 四、作品实现............................................... 错误!未定义书签。 服务端界面实现 ......................................... 错误!未定义书签。 客户端界面实现 ......................................... 错误!未定义书签。 登录实现 ............................................... 错误!未定义书签。 聊天功能实现 .......................................... 错误!未定义书签。 退出功能实现 .......................................... 错误!未定义书签。 五、作品设计、实现难点分析................................. 错误!未定义书签。 难点分析 .............................................. 错误!未定义书签。 解决方案 .............................................. 错误!未定义书签。 测试结果 .............................................. 错误!未定义书签。

C语言程序设计基础实验报告6【VIP专享】

实验6 数组 一、实验目的 1、掌握一维数组和二维数组的定义、赋值和输入输出的方法; 2、掌握字符数组和字符串函数的使用; 3、掌握与数组有关的算法(特别是排序算法)。 二、实验内容和步骤 编程序并上机调试运行。 1、以下给定程序MODI1.C的功能是: 求一维数组a中所有元素的平均值, 结果保留两位小数。例如,当一维数组a中的元素为:10, 4, 2, 7, 3, 12, 5, 34, 5, 9时,程序的输出应为:The aver is: 9.10 程序中有两处错误,错误都在提示行:/***********found***********/的下面一行。请改正程序中的错误, 使它能得出正确的结果。 注意:程序中的其它地方请不要随意改动,不得增行或删行,也不得更改程序的结构! #include #include void main() { int a[10]={10,4,2,7,3,12,5,34,5,9}, i; /************found************/ /************found************/ s = a[0]; for ( i=1; i<10; i++) s += a[i]; aver = s / i; printf("The aver is: %.2f\n", aver); } 2、以下给定程序MODI1.C的功能是:求二维数组a中的最小值。 例如,当二维数组a中的元素为: 4 2 34 7 3 12 5 6 5 程序的输出应为:The min is: 2 。 程序中有两处错误,错误都在提示行:/***********found***********/的下面一行。请改正程序中的错误, 使它能得出正确的结果。 注意:程序中的其它地方请不要随意改动,不得增行或删行,也不得更改程序的结构! #include #include void main() { int a[3][3]={4,2,34,7,3,12,5,6,5}, i, j, min; clrscr();

聊天系统-程序设计实践报告

程序设计实践 设 计 报 告 课题名称:网络聊天程序的设计和实现学生姓名: 班级: 班内序号: 学号: 日期:

1.课题概述 1.1课题目标和主要内容 课题实现的主要内容:本程序实现一个简单的网络聊天程序,采用客户机/服务器(Client/Server)模式,将客户端和服务端功能在一个程序中实现,运行时在不同的计算机上打开此程序即可进行聊天。程序实现一对多,多对多聊天功能,满足聊天的基本功能。 课题目标:学会使用MFC搭建基本的对话框及基本控件的使用,了解socket套接字相关知识,实现简单聊天程序。通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。 使用的开发平台:Microsoft Visual Studio 2010、windows7 采用的主要工具:计算机、相关图书资料 1.2系统的主要功能 功能列表或功能框图,以及功能的简要说明。

服务器端负责指定ip地址及端口号,建立服务器,有监听、接受、发送消息等功能。客户端通过指定的ip及端口号来连接服务器,有接受和发送消息等功能。 2. 系统设计 2.1 系统总体框架 包括系统框架图或层次逻辑图,设计思想等 首先由服务器在指定的端口开通指定的服务,然后在客户机通过指定服务器地址、端口来连接服务器以获得指定的服务。 服务器端 首先由一个服务器启动一个线程监听来自客户器的Socket连接,当服务器的Socket与客户器的Socket经过TCP协议的3次握手建立了连接后,双方就可以通过这个连接来进行信息的发送和接收,并可以进行文件的传输。在进行程序设计时,对于多个用户连接服务器采用了多线程处理,每个客户端的Socket都启动一个线程来连接服务端的Socket,服务端的Socket接受连接后,通过一个结构体保存已经连接的客户端的地址和套接字,当客户端发送一个信息到服务端,服务器接收信息后,再从结构体中取出已保存的套接字转发所收到

网络编程聊天程序课程设计

课题名称:TCP/IP协议及网络编程技术课程设计子课题:实现简化功能的客户机和服务器聊天程序 院(系):计算机学院 专业:通信工程 班级: 学生姓名:hshengxue 学号:200900402022 指导教师:周坚和 2012年 6 月22 日

目录 摘要 (3) 引言 (3) 一、课程设计的目的和意义 (3) 二、课程设计的内容和要求 (3) 三、课程设计所需了解的相关内容和技术 (4) (一)、套接口 (4) (1)套接口的概念 (4) (2)套接口的分类 (5) (3) Socket工作模式 (6) (二)、所用的关键技术 (6) (三)Winsock API的使用 (7) 四、课程设计过程 (7) (一)设计思路 (7) (1)服务器的主要工作流程 (7) (2)客户机的工作流程.............................................8. (3)服务器的工作流程 (8) 五、编程实现 (9) (一)服务器端的实现 (9) (二)客户端的实现 (11) 六、小结 (15) 七、参考文献 (16)

摘要: 网络应用程序是通过网络使用通信协议实现进程间的通信;本项目采用软件工程的方法,综合运用网络程序设计,以visual c++6.0作为系统前台应用程序开发工具。此局域网聊天工具采用客户端/服务端(C/S)模式和UDP连接。它由两个程序组成:服务器(Server)和客户端(Client),首先需要登录服务器,再登录客户端,需要指定服务器IP地址以便与服务器建立连接。登录后,客户可以在自己的界面上与另一指的定的客户端进行聊天。服务器模块主要用来维护网络用户用户的信息,包括用户IP地址,聊天内容;聊天客户端模块主要包括用户连接,发送信息,接收信息。是一套用于Internet网络使用的网络聊天工具,其操作简单,灵活性好,运用也比较稳定。 关键词:网络,聊天程序,客户端/服务端,UDP传输控制协议。 0、引言 网络应用程序是通过网络使用通信协议实现进程间的通信,UDP 是TCP/IP协议族为传输层设计的两个协议之一,UDP提供的是无连接、不可靠的网络传输协议,在进行网络应用程序设计时,TCP/IP 协议的核心内容被封装在操作系统中。网络应用程序要使用UDP协议来实现自己的功能,只能通过由系统提供给用户的UDP协议编程接口来实现。因此,可以说设计网络应用程序就是利用网络编程接口(API)进行程序设计的过程。在Windows环境下的网络应用程序编程接口叫

网络编程_基于TCP的简易聊天室_实验报告

网络编程 课程设计说明书 题目名称:基于TCP/IP的网络文字聊天程序设计专业:网络工程

班级: 1201班 学号: 1220140105 姓名:蒋星 指导老师:利平 完成日期: 2014年12月13日

目录 一、实验基本信息概要3 1. 题目要求 3 2. 题目容3 3. 开发环境 3 二、流程图4 三、系统简介5 1.界面5 2. 软件功能 5 3. 系统设计 9 4. 优点与缺点9 四、系统详细设计11 1. ChatServer类11 2. ChatClient 类13 3. SocketException类15 5. 命令协议 15 6. 消息格式 16 五、系统测试16 1. 服务器使用错误16 2. 客户端使用错误17 3. 启动服务器17 4. 启动客户端17 5. 关闭客户端17 6. 启动服务器错误提示18 7. 公开聊天 18 8. 私聊 18 9. 错误的私聊19 10. 更名20 11. 帮助20 12. 非法指令20 13. 非法的指令参数20 14. 连接服务器失败21 六、心得体会21 七、完整代码21 Charserverd.cpp 服务器main函数文件 21 ChatServer.h 服务器类头文件 22 ChatServer.cpp 服务器类 23 ClientInfo.h 客户信息类 33 Charclientd.cpp 客户端main函数 34 ChatClient.h 客户端头文件34 ChatClient.cpp 客户端类 35 InitSock.cpp 初始化WINSOCK类41

SockException.h 异常类41八、[参考文献] 42

《程序设计课程设计》实验报告材料

《程序设计》课程设计 姓名: 学号: 班级:软件工程14 班 指导教师: 成绩:

1.消除类游戏 1.1【问题描述】 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。 1.2【基本要求】 现在给你一个n行m列的棋盘(1≤n,m≤30),棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。 请注意:一个棋子可能在某一行和某一列同时被消除。 输入数据格式: 输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。 输出数据格式: 输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。 1.3【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可避免每次运行程序时都要从键盘输入数据。 测试数据一 输出说明: 棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。 棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。 1.4【功能实现】 #include #include using namespace std;

int main() { int m, n, i ,j; int temp; cin >> n >> m; temp = m; m = n; n = temp; int * map = new int[m * n]; int * mark = new int[m * n]; int * tmap = map; int * tmark = mark; int dif = 0; //输入 for ( i = 0 ; i < m ; i++ ) for (j = 0; j < n; j++) cin >> *(tmap + i * n + j); for (i = 0; i < m; i++) for (j = 0; j < n; j++) { //横行 if ((tmap + 2 - map) % n != 0 || (tmap + 1 - map) % n != 0) if (*(tmap) == *(tmap + 1) && * (tmap + 1) == *(tmap + 2)) { dif = tmap - map; *(tmark + dif) = 0; *(tmark + dif + 1) = 0; *(tmark + dif + 2) = 0; } //竖列 if (tmap + 2 * n - map < m * n || tmap + n - map < m * n) if (*(tmap) == *(tmap + n) && * (tmap + n) == *(tmap + 2 * n)) { dif = tmap - map; *(tmark + dif) = 0; *(tmark + dif + n) = 0; *(tmark + dif + 2 * n) = 0; } tmap = map + (j+1) + i * n; } //输出 cout << endl; tmap = map; for (i = 0; i < m; i++)

相关文档
最新文档