聊天软件实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

聊天软件实验报告
篇一:简单聊天程序的设计与实现实验报告
实验
2.7 简单聊天程序的设计与实现
班级:计科1301 学号:201350080105姓名:张蓉
一、实验目的
1,掌握Socket 程序设计方法
2,掌握基于Socket 的聊天程序设计方法
3,进一步熟悉C语言或其他程序设计语言
二、实验设备
硬件:运行Windows操作系统的计算机
软件:C语言或其他程序设计语言开发环境
三、实验内容
1,使用基于Socket 的程序设计方法设计聊天客户端和服务器客户端程序2,程序应能实现传输文字信息和聊天功能
四、基本原理
聊天程序是指能提供两人或多人聊天的应用程序,QQ 程序采用的是C/S通信模式,服务器跟客户之间主要有一对多和多对多模式,一对多模式是在服务器和客户端之间用客户端程序登录,验证用户密码,获取在线好友等信息,多对多模式则是在客户端与客户端之间,在线好友直接通信聊天,每个客户端上有实现服务端和客户端两个功能的部分,前者用于接收聊天数据,后者用于发送聊天数据。

用C/S模式进行通信时,作为客户端在请求与服务器连接时需要知道服务器端的IP地址和端口号,腾讯公司的服务器有固定公用网址,客户能很容易的回去服务器的相关信息,在客户端与客户端之间通信时,可以通过登录QQ,让QQ服务器端获得该用户的IP地址和端口号信息,然后通知其他要与该用户进行通信的用户,其他用户就可以连接该用户并与之通信。

五、程序实现
本程序采用基于面向无连接的UDP协议。

需要用到的函数有bind()、sendto()、recvfrom()等
设计一个基本的网络服务器有以下几个步骤:
1、初始化Windows Socket
2、创建一个监听的Socket
3、设置服务器地址信息,并将监听端口绑定到这个地址上
4、开始监听
5、接受客户端连接
6、和客户端通信
7、结束服务并清理Windows Socket和相关数据,或者返回第4步客户端程序框架类似
程序源代码:
(1)服务器端代码:
#include <stdio.h>
#include <WINSOCK2.H>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, wsaData );
if (err != 0 )
{
return;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6666); //设置端口号为6666
bind(sockSrv, (sockaddr*)addrSrv, sizeof(sockaddr));
char sendBuf[100];
char recvBuf[100];
char tempBuf[200];
int len = sizeof(sockaddr);
SOCKADDR_IN addrClient;
while(1)
{
recvfrom(sockSrv, tempBuf, strlen(tempBuf), 0,
(sockaddr*)addrClient, len);
if('q' != tempBuf[0])
{
sprintf(recvBuf, "%s say:%s", inet_ntoa
(addrClient.sin_addr), tempBuf);
printf("%s\n", recvBuf);
printf("please input your data:");
gets(sendBuf);
sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr*) addrClient, len);
}
else // 若接收到'q',则退出聊天
{
printf("%s request to quit the chat platform.\n",
inet_ntoa(addrClient.sin_addr));
sendto(sockSrv, "q", strlen("q") + 1, 0, (sockaddr*) addrClient, len);
break;
}
}
closesocket(sockSrv);
WSACleanup();
}
(2)客户端代码:
#include <stdio.h>
#include <WINSOCK2.H>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, wsaData);
if (err != 0)
{
return;
}
if(LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1 )
{
WSACleanup();
return;
}
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //htonl htons inet_addr inet_ntoa
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6666); //设置同样的端口号6666 char sendBuf[100];
char tempBuf[200];
char recvBuf[100];
int len = sizeof(sockaddr);
while(1)
{
printf("please input your data:");
gets(sendBuf);
sendto(sockClient, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr*) addrSrv, len);
recvfrom(sockClient, tempBuf, strlen(tempBuf), 0, (sockaddr*) addrSrv, len);
if('q' != tempBuf[0])
{
sprintf(recvBuf, "%s say:%s", inet_ntoa
(addrSrv.sin_addr), tempBuf);
printf("%s\n", recvBuf);
}
else// 若接收到'q',则退出聊天
{
printf("the server has been closed!\n");
sendto(sockClient, "q", strlen("q") + 1, 0, (sockaddr*) addrSrv, len);
break;
}
}
closesocket(sockClient);
WSACleanup();
}
六、实验结果分析
篇二:QQ模拟聊天系统实验报告
题目:Q Q模拟聊天系统
学院:
班级:指导教师:
姓名:
学号:
学年、学期:
目录
1.引
言................................................................................................... . (3)
1.1 需求分析................................................................................................... . (3)
1.2聊天室程序的开发背景................................................................................................... .. (3)
1.3聊天室的设计目标................................................................................................... . (4)
2.总体设计................................................................................................... . (4)
2.1 功能要求................................................................................................... (4)
2.2系统主要功能和主要功能描述:............................................................................................... . (5)
3.详细设计...................................................................................................
(6)
3.1设计流程图................................................................................................... .. (6)
3.2客户端的实现.................................. ................................................................ (7)
3.3服务端的实现................................................................................................... (14)
4.运行结果................................................................................................... . (21)
4.1 客户端................................................................................................... . (21)
4.2 服务器端................................................................................................... (22)
4.3 客户端登陆到服务器端................................................................................................... .. (22)
4.4 进行对话................................................................................................... (23)
4.5 退出服务器端与客户端................................................................................................... .. (23)
5.心得体会................................................................................................... (26)
6.参考文献................................................................................................... .. (26)
1. 引言
计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。

各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。

随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《TCP/IP协议与网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。

接下来的课程设计就是针对一个简单的网络聊
天程序,利用MFC为开发工具,实现基本的通讯功能。

1.1 需求分析:
当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet 的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。

在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。

聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。

聊天室适用于网上会议或闲聊的一些场合。

聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。

1.2 聊天室程序的开发背景
近年来,互连网发展日新月异,网络使空间的距离不再成为人们沟通的障碍,世界各个角落的人们可以通过Internet 收发邮件、实时聊天、获取最
新的资讯。

因此本次毕业设计以“面向连接的Winsock网络会话程序开发”为题,制作一个C/S聊天室程序,通过制
作该程序还能更好的学习网络socket编程的相关知识。

1.3 聊天室的设计目标
本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为:
服务器端功能:
1、初始化socket, 创建服务器端。

2、维护一个链表,保存所有用户的IP地址、端口信息。

3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。

4、接受用户传送来的连接判断命令,并向用户发出响应命令。

客户端功能:
客户端界面上的两个文本框,一个用于显示接受的聊天信息,一个用来接受用户输入的聊天信息。

当按下“发送”按钮时将信息发送给服务器。

通过本课题的实训设计,可以比较深入的了解和掌握WINSOCK控件基本属性、方法和事件,理解网络聊天通信的概念,输控制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。

并能巩固和扩展大学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。

2. 总体设计
2.1 功能要求
1、支持多个客户端的连接,在服务器和多个客户端之间进行数据传输;
2、接收客户端发送的消息,并显示在一个列表框中;
3、在用户连接上后有提示,显示出连接的用户名字;
4、发送信息时可以显示聊天的所有记录;
2.2系统主要功能和主要功能描述:
服务器端聊天程序必须能够做3件事情:
1、服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。

2、服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。

对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。

3、服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。

这些要求可以通过CSocket类提供的功能实现。

从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。

服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。

客户套接字的数量是不可预知的,因此需要一个列表来记录。

MFC的
CPtrList类就能实现这种功能。

客户端聊天程序需要完成以下几个功能:
1、客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的
设置尝试与服务器的连接,并且随时检测连接的状态。

2、客户端聊天程序要把用户输入的信息及时发送到聊天服务器。

一般情
况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行
篇三:聊天程序设计实验报告
XX
专业名称
实验室
实验课程
实验名称
姓名学号同组人员
实验日期XXXX大学软件工程2号实验楼201室JA VA高级程序设计聊天程序设计(客户端、服务端)无2013年12月12日
一、实验目的
掌握基于TCP、UDP协议的聊天服务器端与客户端程序设计,掌握Socket, ServerSocket,
DatagramSocket, DatagramPacket类的使用。

二、实验原理
TCP和UDP协议的支持。

蓬勃范文网:聊天软件实验报告)t和Socket的使用。

三、实验内容
实验截图
代码
import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import .ServerSocket;
import .Socket;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author
*/
public classextends javax.swing.JFrame {
private ServerSocket server;
private int = 0;
private char[] chatBuf = new char[2048];
private String chatIpAddress = "127.0.0.1";
private final int chatPort = 5200;
private HashMap<String, Vector<IMessage>> chatRecordsMap;
//private HashMap<String, Integer> chatRecordHMap;
public T alkHome() {
initComponents();
chatRecordsMap = new HashMap<String, Vector<IMessage>>();
//chatRecordHMap = new HashMap<String, Integer>();
try {
server = new ServerSocket(Integer.valueOf(chatPort)); } catch (IOException ex) {
Logger.getLogger(T alkHome.class.getName()).log(Level.SE VERE,
null, ex);
}
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Socket socket = server.accept();
BufferedReader sin = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
int tmp_len = -1;
StringBuilder chatStrBuilder = new StringBuilder();
while((tmp_len = sin.read(chatBuf)) != -1) {
chatStrBuilder.append(chatBuf, 0, tmp_len);
}
addMessage(socket.getInetAddress().getHostAddress(), chatStrBuilder.toString(), false);
sin.close();
socket.close();
} catch (IOException ex) {
Logger.getLogger(T alkHome.class.getName()).log(Level.SE VERE, null, ex);
}
}
}
}).start();
}
private void reChatWindow(String ipAddress) {
System.out.println(ipAddress);
Vector<IMessage> chatRecords = chatRecordsMap.get(ipAddress);
jT extArea1.setT ext("");
if(chatRecords == null) {
chatRecords = new Vector<IMessage>();
chatRecordsMap.put(ipAddress, chatRecords);
}
else {
for(IMessage iMess : chatRecords) {
if(iMess.ismyself) {
jT extArea1.append("我
"+iMess.dateString+"
"+iMess.timeString+"\n"+iMess.messStrin g+"\n\n");
}
else {
jT extArea1.append("TA +iMess.dateString+"
"+iMess.timeString+"\n"+iMess.messStrin g+"\n\n");
}
}
}
}
private void addMessage(final String ipAddress, String messString, boolean
ismyself) {
Vector<IMessage> chatRecords = chatRecordsMap.get(ipAddress);
if(chatRecords == null) {
chatRecords = new Vector<IMessage>();
chatRecordsMap.put(ipAddress, chatRecords);
final IMessage iMessage = new IMessage(messString, ismyself);
chatRecords.add(iMessage);
if(ismyself) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket sendMessage = new Socket(ipAddress, chatPort); PrintWriter sendWindow = new
PrintWriter(sendMessage.getOutputStream());
sendWindow.print(iMessage.messString);
sendWindow.flush();
sendWindow.close();
sendMessage.close();
jT extArea1.append("我+iMessage.dateString+"
"+iMessage.timeString+"\n"+iMessage.me ssString+"\n\n");
} catch (IOException ex) {
Logger.getLogger(T alkHome.class.getName()).log(Level.SE VERE, null, ex);
}
}
}).start();
}
else {
jT extArea1.append("TA "+iMessage.dateString+"
"+iMessage.timeString+"\n"+iMessage.me ssString+"\n\n");
}
}
@SuppressWarnings()
private void initComponents() {
jCheckBox1 = new javax.swing.JCheckBox();
jScrollPane2 = new javax.swing.JScrollPane();
jT extArea2 = new javax.swing.JT extArea();
jButton2 = new javax.swing.JButton();
jFormattedT extField1 = new
javax.swing.JFormattedT extField();
jFormattedT extField2 = new javax.swing.JFormattedT extField();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();。

相关文档
最新文档