网络程序设计之聊天室

qq_45237600 2022-01-16 21:33:06

项目简介

本项目借助vue + express 实现了在线chatroom的demo。

通过注册页面每个用户都能注册自己的身份并进入一个在线聊天室进行聊天。聊天室不仅仅只能发送文字,还可以在emoj列表中选取表情发送。

相关工具介绍

  • Vue:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用(SPA)提供驱动。
  • Express:Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用。Express 不对 node.js 已有的特性进行二次抽象,我们只是在它之上扩展了Web应用所需的功能。丰富的HTTP工具以及来自Connect框架的中间件随取随用,创建强健、友好的API变得快速又简单。

设计方案

  • 本项目是一个前后端分离的项目,前端负责页面渲染,一共有login、home、list和chatRoom四个页面。Login负责创建用户,home是首页可以进行账户管理,list是应用的列表(此项目中就只有聊天室),chatRoom是聊天室,是项目的核心页面。后端的server通信是基于socket.io进行实现的。后端部分的架构编写以及前端部分的路由分发实现是另一位同学的实现的,我主要负责前端页面的编写。
  • 后端部分介绍链接:https://bbs.csdn.net/topics/604281453

项目演示

  • 登陆界面

 

  • 聊天界面

 

  • 发送文字消息页面

 

  • 发送表情页面

 

  • 退出登录页面

  • 后端显示监听开始页面

 

 

 

代码实现

下面我将着重介绍几个重要的文件,文件中的样式设计的比较简单,不赘述。

1.main.js文件

main.js是vue的入口文件,比较重要的操作是在文件中定义了socket绑定后端服务器,如果是部署在服务器上,请更换ip地址和端口号。

import Vue from 'vue'
import App from './App.vue'
import router from '@/router/index'
import '@/style/global.css'
import '@/style/index.sass'
import io from "socket.io-client"


Vue.config.productionTip = false;

let socket = io.connect("127.0.0.1:8081", {
  'force new connection': true,
  reconnect: true,  // 开启重连
  'reconnection delay': 200,
  'max reconnection attempts': 10
});
Vue.prototype.$socket = socket;


new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

2.home目录下的index.vue

此文件主要生成home页面模块。此页面主要功能是显示当前账号和退出登录。账号名称是存放在localStorage的Account中。退出登录是用outLogin方法实现并绑定给”退出登录”button,退出登录的逻辑是重定向并且给与服务器断开连接,后端收到该信息后会发送给其他用户该用户登出的消息。

<template>
    <div class="home">
        <div class="account">当前名称:{{ account }}</div>
        <van-button class="outLogin" type="warning" @click="outLogin">退出登录</van-button>
    </div>
</template>
<script>
import { Button } from 'vant';
export default {
    name: 'Home',
    components: {
        vanButton: Button,
    },
    data() {
        return {
            account: ""
        }
    },
    created() {
        const a = localStorage.getItem('Account');
        this.account = a;
    },
    methods: {
        outLogin() {
            localStorage.removeItem('Account');
            this.$router.push('/login');
            this.$socket.close();
        }
    }
}
</script>

3. list目录下的index.vue

此文件渲染了list页面模块,展示聊天室应用,用户可以点击“点击进入”进入到聊天室,逻辑实现就是一个页面跳转,比较简单不再赘述。

<template>
    <div class="list">
        <van-cell is-link to="/chatRoom" value="点击进入">
            <template #title>
                <van-tag size="large" type="primary">聊天室</van-tag>
            </template>
        </van-cell>
    </div>
</template>
<script>
import { Cell, Tag } from 'vant';
export default {
    name: 'List',
    components: {
        vanCell: Cell,
        vanTag: Tag
    }
}
</script>

4.login目录下的index.vue

此文件生成了login页面模块,主要功能是创建账号,由createAccount函数实现,将昵称装入localStorage并跳转至list页面。

<template>
    <div class="login">
        <div class="formBox">
            <div class="formBox-title">创建账号</div>
            <van-field left-icon="smile-o" v-model="name" maxlength="4" placeholder="请输入昵称...(4字以内)" />
            <van-button round type="info" size="small" class="formBox-btn" @click="createAccount">创建</van-button>
        </div>
    </div>
</template>
<script>
import { Field, Button, Toast } from 'vant';
export default {
    name: 'login',
    components: {
        vanField: Field,
        vanButton: Button
    },
    data() {
        return {
            name: ''
        }
    },
    methods: {
        createAccount() {
            if (this.name === '') {
                Toast.fail('名字不能为空!');
            } else {
                Toast.success('创建成功!');
                localStorage.setItem('Account', this.name);
                this.$router.push('/')
            }

        }
    }
}
</script>

5.chatRoom下的index.vue文件

这是此项目的核心文件,渲染了聊天室页面。聊天室中主要功能是返回到list页面、展现群聊内容和发送自己的消息。群聊消息由list列表管理,消息类型分为自己的和他人的,两者样式不同。

该模块渲染后会进行初始化,包括得到自己的昵称,创建socket身份和一些基本的初始化例如开启监听。关键代码是模块中的mouted函数。

mounted() {
    const a = localStorage.getItem("Account");
    this.account = a;
    if (!this.$socket.connected) this.$socket.connect(); // 重连socketio
    this.$socket.emit("join", { name: a }); //创建socket身份
    this.init();
  },

接下里着重讲解一些重要的函数实现的细节。

 发送消息

        在用户选择发送消息后,会将聊天输入框和文件列表中的内容添加到发送列表sendList中,再调用sendMsg函数向服务器发送列表中的内容,别忘了在最后还原发送框等元素以便于下次输入。

//发送事件
    send() {
      if (this.value) {
        this.sendList.push({
          value: this.value,
          type: "text",
          name: this.account,
        });
      }
      if (this.fileList.length > 0) {
        this.sendList.push({
          value: this.fileList[0].content,
          type: "img",
          name: this.account,
        });
      }
      this.sendMsg();
    },
//发送消息
    sendMsg() {
      for (let i = 0; i < this.sendList.length; i++) {
        this.$socket.emit("client", this.sendList[i]);
      }
      this.value = "";
      this.isMedia = false;
      this.isWhrite = false;
      this.isEmoji = false;
      this.fileList = [];
      this.sendList = [];
    },

接收消息

        getMsg函数从服务器接收广播消息,并添加到list列表中,由于vue是由数据驱动页面,会直接显示接收的消息。一个小细节是在最后调用scrollToBottom函数将页面滚动到底部。

//接受消息
    getMsg() {
      let _this = this;
      this.$socket.on("message", function (message) {
        _this.list.push(message);
        _this.scrollToBottom();
      });
    },

监听群员登录退出

        每当群员加入退出时,会收到服务器的消息,消息中带有该群员的昵称,接收到消息后会在页面上提示。

//群员加入监听
    joinNoticeOther() {
      this.$socket.on("joinNoticeOther", function (socket) {
        const { name } = socket;
        Notify({
          message: name + " 加入聊天室",
          color: "#fff",
          background: "#01c1fd",
        });
      });
    },

    //群员退出监听
    disconnection() {
      this.$socket.on("disconnection", function (socket) {
        const { name } = socket;
        Notify({
          message: name + " 离开聊天室",
          color: "#000000",
          background: "#dddddd",
        });
      });
    },

聊天室模块完整代码如下:

<template>
  <div class="chatRoom">
    <van-nav-bar
      title="聊天室"
      left-text="返回"
      left-arrow
      @click-left="goBack"
    />
    <div class="center" @click="closeMedia">
      <div class="message" ref="message">
        <div v-for="(item, index) in list" :key="index">
          <div
            class="message-list"
            :class="item.name === account ? 'mine' : 'other'"
          >
            <div class="name" v-if="item.name !== account">{{ item.name }}</div>
            <div class="msg">
              <div v-if="item.type === 'text'">{{ item.value }}</div>
              <van-image
                width="100"
                v-else
                fit="cover"
                :max-zoom="3"
                :min-zoom="'1/3'"
                :src="item.value"
                @click="viewImg(item.value)"
              />
            </div>
            <div class="name" v-if="item.name === account">{{ item.name }}</div>
          </div>
        </div>
      </div>
    </div>
    <div class="bottom">
      <div class="bottom-input">
        <Field
          v-model="value"
          maxlength="40"
          @input="whrite"
          @focus="closeMedia"
          placeholder="请输入内容...(40字以内)"
        />
        <van-button
          icon="smile"
          class="btn"
          type="default"
          @click="emojiOrMenu"
        />
        <van-button
          type="info"
          icon="upgrade"
          class="btn"
          @click="send"
          v-on:keyup.enter="sent"
          v-if="isWhrite"
          @oversize="onOversize"
        />
        <van-button
          icon="add"
          class="btn"
          type="default"
          @click="menuOrEmoji"
          v-else
        />
      </div>
      <div class="bottom-media" v-if="isMedia">
        <VEmojiPicker class="emoji" @select="selectEmoji" v-if="isEmoji" />
        <van-uploader
          v-else
          :after-read="afterRead"
          multiple
          :max-count="1"
          :max-size="700 * 1024"
          v-model="fileList"
          style="margin: 10px"
          @oversize="onOversize"
        />
      </div>
    </div>
  </div>
</template>
<script>
import {
  Button,
  Field,
  Notify,
  NavBar,
  Uploader,
  Image as VanImage,
  ImagePreview,
} from "vant";
import { VEmojiPicker } from "v-emoji-picker";

export default {
  name: "ChatRoom",
  components: {
    vanButton: Button,
    Field,
    vanNavBar: NavBar,
    vanUploader: Uploader,
    vanImage: VanImage,
    VEmojiPicker,
  },
  data() {
    return {
      value: "",
      account: "",
      isMedia: false,
      isWhrite: false,
      isEmoji: false,
      list: [],
      fileList: [],
      sendList: [],
    };
  },
  mounted() {
    const a = localStorage.getItem("Account");
    this.account = a;
    if (!this.$socket.connected) this.$socket.connect(); // 重连socketio
    this.$socket.emit("join", { name: a }); //创建socket身份
    this.init();
  },
  methods: {
    init() {
      this.joinNoticeOther();
      this.disconnection();
      this.getMsg();
      this.scrollToBottom();
      this.enterKeyup();
    },

    //发送事件
    send() {
      if (this.value) {
        this.sendList.push({
          value: this.value,
          type: "text",
          name: this.account,
        });
      }
      if (this.fileList.length > 0) {
        this.sendList.push({
          value: this.fileList[0].content,
          type: "img",
          name: this.account,
        });
      }
      this.sendMsg();
    },

    //图片上传后
    afterRead() {
      this.isWhrite = true;
    },

    //预览图片
    viewImg(value) {
      ImagePreview({
        images: [value],
        closeable: true,
      });
    },

    //图片上传大小校验
    onOversize() {
      Notify({
        message: "图片上传不能超过700kb",
        type: "warning",
      });
    },

      //输入监听
    whrite() {
      if (this.value || this.fileList.length > 0) return (this.isWhrite = true);
      return this.isWhrite = false;
    },
    
      //关闭功能区和Emoji
    closeMedia() {
      if (!this.isEmoji) return( this.isMedia = false,this.isEmoji = false);
    },

    //munu按钮点击逻辑
    emojiOrMenu() {
      if (!this.isMedia && !this.isEmoji) return (this.isMedia = true, this.isEmoji = true);
      if (this.isMedia && !this.isEmoji) return (this.isEmoji = true);
      if (this.isMedia && this.isEmoji) return (this.isMedia = false, this.isEmoji = false);
    },

    //emoji按钮点击逻辑
    menuOrEmoji() {
      if (!this.isMedia || (this.isMedia && this.isEmoji)) return (this.isMedia = true), (this.isEmoji = false);
      if (this.isMedia && !this.isEmoji) return (this.isMedia = false, this.isEmoji = false);
    },

    // 选择emoji
    selectEmoji(emoji) {
      this.value = this.value + emoji.data;
      this.isWhrite = true;
    },

    //发送消息
    sendMsg() {
      for (let i = 0; i < this.sendList.length; i++) {
        this.$socket.emit("client", this.sendList[i]);
      }
      this.value = "";
      this.isMedia = false;
      this.isWhrite = false;
      this.isEmoji = false;
      this.fileList = [];
      this.sendList = [];
    },

    //接受消息
    getMsg() {
      let _this = this;
      this.$socket.on("message", function (message) {
        _this.list.push(message);
        _this.scrollToBottom();
      });
    },

    //群员加入监听
    joinNoticeOther() {
      this.$socket.on("joinNoticeOther", function (socket) {
        const { name } = socket;
        Notify({
          message: name + " 加入聊天室",
          color: "#fff",
          background: "#01c1fd",
        });
      });
    },

    //群员退出监听
    disconnection() {
      this.$socket.on("disconnection", function (socket) {
        const { name } = socket;
        Notify({
          message: name + " 离开聊天室",
          color: "#000000",
          background: "#dddddd",
        });
      });
    },

    //滚动到底部
    scrollToBottom() {
      if (this.$refs.message) {
        //解决scrollHeight是undefinde的问题
        this.$nextTick(() => {
          let div = this.$refs.message;
          div.scrollTop = div.scrollHeight;
        });
      }
    },

    //回车键事件
    enterKey(event) {
      const code = event.keyCode
        ? event.keyCode
        : event.which
        ? event.which
        : event.charCode;
      if (code == 13) return this.send();
    },

    //添加监听页面回车事件
    enterKeyup() {
      document.addEventListener("keyup", this.enterKey);
    },

    //取消监听回车事件
    enterKeyupDestroyed() {
      document.removeEventListener("keyup", this.enterKey);
    },

    //退出聊天室
    goBack() {
      this.$router.go(-1);
      this.$socket.close(); // 关闭socket链接
      this.enterKeyupDestroyed();
      this.$destroy(); // 销毁页面
    },
  },
  // updated() {
  //   this.scrollToBottom()
  // }
};
</script>

作者:NP599

 

...全文
298 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
◆ 01.htm 1、怎么用mscomm控件检测modem是否与计算机联接正确?2、如何用mscomm挂断modem与别的电话机间的连接?(已接通) ◆ 02.htm CWinInetConnection---一个封装了WinInet API函数的类 ◆ 03.htm MODEM通讯意外处理 ◆ 04.htm MsComm 文字传输 ◆ 05.htm PING一个IP地址(向它发送一个数据包并等待回应) ◆ 06.htm SMTP协议简介 (Simple Mail Transfer Protocol) ◆ 07.htm VB5.0 中远程数据库的访问 ◆ 08.htm VB下如何编写CRC校验程序 ◆ 09.htm VB中Winsock控制的UDP协议的使用 ◆ 10.htm Visual Basic 6中发送邮件的新方法 ◆ 11.htm Visual Basic通信程序设计 ◆ 12.htm Whois 示例程序 ◆ 13.htm Winsock Terminal示例程序 ◆ 14.htm WinSock断开导致客户端问题 ◆ 15.htm 把Outlook信箱中的附件另存为 ◆ 16.htm 保证连网计算机时间同步 ◆ 17.htm 编写网络寻呼机 ◆ 18.htm 编制自已的电话录音小程序 ◆ 19.htm 程序中如何启动默认的拨号连接 ◆ 20.htm 程序中如何启动默认的拨号连接? ◆ 21.htm 打开器并进入指定网址 ◆ 22.htm 打开一个直接到自己主页的器 ◆ 23.htm 得到用户的IP地址 ◆ 24.htm 电话拨号 ◆ 25.htm 电子邮件的标准格式 (RFC 822) ◆ 26.htm 断开拨号网络的连接 ◆ 27.htm 断开与 Internet 的连接 ◆ 28.htm 发送电子邮件附件 ◆ 29.htm 发送电子邮件附件1 ◆ 30.htm 发送电子邮件附件2 ◆ 31.htm 发送电子邮件附件3 ◆ 32.htm 发送电子邮件附件4 ◆ 33.htm 获得用户网络登录名 ◆ 34.htm 基 于Win95 的VB5 串 口 通 信 程 序 ◆ 35.htm 基于Win95的VB5串口通信程序 ◆ 36.htm 几个设置IE的API ◆ 37.htm 检测运程数据传送的断线 ◆ 38.htm 简单的聊天程序 ◆ 39.htm 简单电子邮件发送程序 ◆ 40.htm 建立拨号联接 ◆ 41.htm 将所有窗口最小化 ◆ 42.htm 利用IE控件访问Internet ◆ 43.htm 利用IE控件设计简易器 ◆ 44.htm 利用Mscomm32控件判断MODEM是否打开,或者正在工作,并且判断拨号时是否遇忙音 ◆ 45.htm 利用TAPI进行电话拨号 ◆ 46.htm 利用VB访问Internet ◆ 47.htm 利用VB设计聊天室 ◆ 48.htm 利用Visual Basic实现无线通讯 ◆ 49.htm 利用Winsock控件实现局域网通信 ◆ 50.htm 强制一个本地或远程NT系统关闭 ◆ 51.htm 取得网卡序列号 ◆ 52.htm 如何从 Internet 上取回某一个网页的內容? ◆ 53.htm 如何检测是否已连接到Internet? ◆ 54.htm 如何利用Winsock控件编写自己的Internet程序 ◆ 55.htm 如何每天抓取 Internet 上某一个网页中的图片来更换桌面的壁纸? ◆ 56.htm 如何启动拨号网路中的连线? ◆ 57.htm 如何使用MSCOMM32.OCX发送大于80H的字符,可否给个示例程序 ◆ 58.htm 如何通过VB获取网卡地址 ◆ 59.htm 如何用VB打开默认器或默认发信程序? ◆ 60.htm 如何用Visual Basic编写小型的网络系统 ◆ 61.htm 如何在程序中启动 NT 的【拨号连接】对话框 ◆ 62.htm 如何在程序中启动 NT 的【拨号连接】对话框? ◆ 63.htm 如何在网页上使用 VB5 制作的 ActiveX 控件? ◆ 64.htm 如何中断【拨号网络连接】 ◆ 65.htm 设计Browser及FTP程序 ◆ 66.htm 设计Chat程序 ◆ 67.htm 设计E-mail程序 ◆ 68.htm 设置计算机名称 ◆ 69.htm 使用VB获得一页的HTML代码 ◆ 70.htm 使用VB收发电子邮件 ◆ 71.htm 使用标签控件调出器 ◆ 72.htm 使用超链接和发送Email ◆ 73.htm 使用器的文件复制对话框 ◆ 74.htm 输入/输出篇 ◆ 75.htm 通过WnetEnumResource函数获得网络资源 ◆ 76.htm 通往 Internet 的捷径 ◆ 77.htm 显示计算机的名称 ◆ 78.htm 用 MAPI 控件实现发送邮件 ◆ 79.htm 用 WinSock 控件下载文件 ◆ 80.htm 用 Winsock 实现聊天的程序 ◆ 81.htm 用Internet Transfer编写FTP程序 ◆ 82.htm 用Sockets发送电子邮件 ◆ 83.htm 用VB 创 建 自 己 的 通 信 程 序 ◆ 84.htm 用VB5.0开发通信软件的技巧 ◆ 85.htm 用VB5开发IE ◆ 86.htm 用VB编写网络寻呼 ◆ 87.htm 用VB编写小型的网络系统 ◆ 88.htm 用VB创建自己的通信程序 ◆ 89.htm 用VB构建Internet的应用[微软提供] ◆ 90.htm 用VB开发标准CGI程序 ◆ 91.htm 用VB实现客户——服务器(TCP IP)编程实例 ◆ 92.htm 用VB实现客户服务器(TCP、IP)编程实例 ◆ 93.htm 用VB实现聊天讨论室和点对点会话 ◆ 94.htm 用VB写一个定时PING某IP的程序 ◆ 95.htm 用VB制作器 ◆ 96.htm 用Visual Basic 5.0设计E-mail程序(MAPI) ◆ 97.htm 用Visual Basic6.0编写客户服务器程序 ◆ 98.htm 用Visual Basic创建FTP组件 ◆ 99.htm 用Visual Basic开发数据库器 ◆ 100.htm 用Visual Basic轻松地设计Browser及Ftp程序 ◆ 101.htm 用Winsock控件发信Email ◆ 102.htm 用Winsock控件实现文件的下载 ◆ 103.htm 用Winsock实现点对点通信 ◆ 104.htm 邮件检查程序(二) ◆ 105.htm 邮件检查程序(一) ◆ 106.htm 在VB程序中怎样挂断拨号网络 ◆ 107.htm 在VB中操纵OLE服务器应用程序 ◆ 108.htm 在VB中利用UDP协议编写聊天程序 ◆ 109.htm 在VB中模拟实现邮件传输 ◆ 110.htm 在VB中如何得到网络中某一台电脑(电脑名)的网卡地质? (自己的) ◆ 111.htm 在VB中实现文件上传 ◆ 112.htm 在VB中实现文件上载 ◆ 113.htm 在VB中使用UDP协议 ◆ 114.htm 在VB中用Outlook发电子邮件 ◆ 115.htm 在WindowsNT网络中广播消息 ◆ 116.htm 在程序中打开 Internet 拨号连接窗口 ◆ 117.htm 在一个单位内部或通过广域协议(如X.25)互联的行业内部都有几十或上万台计算机互联,用Intranet虽然可以建立聊天室,但实现点对点实时对话却比较困难。本人用Winsock和VB自制了一套聊天室和对话系统,特拿来供同行们参考。 ◆ 118.htm 在应用中集成器 ◆ 119.htm 在桌面上建立一个 Internet 快捷键 ◆ 120.htm 怎样接收电子邮件(POP3协议简介) ◆ 121.htm 怎样用VB得知系统当前是否处于internet链结状态 ◆ 122.htm 制作自己的网络搜索软件 ◆ 123.htm 自动更新工作站的应用程序 ◆ 124.htm 自己的IE——用VB制作器 ◆ 125.htm HTTP协议(学习笔记) ◆ 126.htm HTTP协议四--关于Chunked编码 ◆ 127.htm IE器完全控制 ◆ 128.htm OICQ服务器系统通讯协议 ◆ 129.htm POP3协议的基本命令 ◆ 130.htm RAS API上的其他Function ◆ 131.htm VB + API 获取 IE 的 “代理服务器” 配制 ◆ 132.htm vb调用winInet API接口post数据到指定的url ◆ 133.htm vb开发通信软件 ◆ 134.htm vb设计数据库电子邮件程序(1) ◆ 135.htm vb设计数据库电子邮件程序(2) ◆ 136.htm vb设计数据库电子邮件程序(3) ◆ 137.htm vb设计数据库电子邮件程序(4) ◆ 138.htm vb设计数据库电子邮件程序(5) ◆ 139.htm vb设计数据库电子邮件程序(6) ◆ 140.htm VB实现应用程序在局域网上自动更新 ◆ 141.htm VB邮件检查程序 ◆ 142.htm vb中从域名得到IP及从IP得到域名 ◆ 143.htm VB中检测是否连网 ◆ 144.htm WebClass实现动态WEB编程之理论篇 ◆ 145.htm Winsocket网络编程谈 ◆ 146.htm Winsock编程框架 ◆ 147.htm Winsock错误代码一览表 ◆ 148.htm 程式自动呼叫拨号网络(RAS API) ◆ 149.htm 打开一个超连接 ◆ 150.htm 得到登入windows 的人的id ◆ 151.htm 访问Internet并调用Explorer ◆ 152.htm 非同步文件下载类 ◆ 153.htm 给Outlook的所有用户发送信件 ◆ 154.htm 获得网卡的MAC地址 ◆ 155.htm 基于WinSock的小型网络管理系统及其实现 ◆ 156.htm 检测是否连接到Internet ◆ 157.htm 检测网络是否连通 ◆ 158.htm 建立Web的超链接树形图 ◆ 159.htm 建立你自己的器-Properties ◆ 160.htm 建立你自己的器-查看源文件 ◆ 161.htm 建立你自己的器-打印 ◆ 162.htm 建立你自己的器-打印设置 ◆ 163.htm 建立你自己的器-发送到FontPage ◆ 164.htm 建立你自己的器-发送到Visual Interdev ◆ 165.htm 建立你自己的器-发送到软盘 ◆ 166.htm 建立你自己的器-复制 ◆ 167.htm 建立你自己的器-另存为 ◆ 168.htm 建立你自己的器-全选 ◆ 169.htm 建立你自己的器-页面设置 ◆ 170.htm 开发通信软件的技术与技巧 ◆ 171.htm 开发网络应用的5个技巧 ◆ 172.htm 利用RAS调用在VB6.0中实现拨号上网 ◆ 173.htm 利用VB提取HTML文件中的EMAIL地址 ◆ 174.htm 枚举出局域网上所有网络资源 ◆ 175.htm 面向Internet的开发工具 ◆ 176.htm 你也可以YAI--VB5中Winsock控件的使用 ◆ 177.htm 判断一个文件是否在IE的缓存中 ◆ 178.htm 启动拨号网络中的连接 ◆ 179.htm 浅谈HTTP协议(二)--返回值 ◆ 180.htm 浅谈HTTP协议(一)--结构 ◆ 181.htm 如何利用 WebBrowser 控件显示 .GIF 动画? ◆ 182.htm 如何映射(中断网络磁盘) ◆ 183.htm 设计E-mail的接收部分 ◆ 184.htm 设置器默认网址 ◆ 185.htm 实现端口对端口的聊天 ◆ 186.htm 使用ASP建立Http组件 ◆ 187.htm 使用VB编写纯ASP程序 ◆ 188.htm 使用vb获取网上邻居里的计算机名 ◆ 189.htm 使用VB建立Web Server ◆ 190.htm 使用Visual Basic开发通讯软件 ◆ 191.htm 使用资源工具包执行本地和远程重新启动 ◆ 192.htm 谈谈远程控制中关于搜索、控制计算机的功能 ◆ 193.htm 压缩 Html ◆ 194.htm 用ASP、VB和XML建立互联网应用程序(1) ◆ 195.htm 用ASP、VB和XML建立互联网应用程序(2) ◆ 196.htm 用ASP、VB和XML建立互联网应用程序(3) ◆ 197.htm 用ASP、VB和XML建立互联网应用程序(4) ◆ 198.htm 用COMMUNICATION控件进行数据采集(学习笔记) ◆ 199.htm 用OLE自动化Outlook ◆ 200.htm ActiveX控件用于DHTML开发 ◆ 201.htm 用VB编写ActiveX DLL实现ASP编程 ◆ 202.htm 用VB编写Windows CGI应用程序 ◆ 203.htm 用VB编写标准CGI程序(上) ◆ 204.htm 用VB编写标准CGI程序(下) ◆ 205.htm 用VB编写收发电子邮件程序 ◆ 206.htm 用VB编写网络监控软件 ◆ 207.htm 用VB编写异步多线程下载程序 ◆ 208.htm 用VB导入导出IE器收藏夹 ◆ 209.htm 用VB定制合路器 ◆ 210.htm 用VB和XML建立集中式应用程序 ◆ 211.htm 用VB将Html转换为文本文件 ◆ 212.htm 用VB开发分布式应用 ◆ 213.htm 用VB设计基于代理服务器的网络计费系统 ◆ 214.htm 用VB制作文件下载程序 ◆ 215.htm 用Visual Basic 实现无线通讯 ◆ 216.htm 用Winsock制作一套聊天室和对话系统 ◆ 217.htm 远程共享显示及声音的实现 ◆ 218.htm 远程启动机器ABC API解决方案 ◆ 219.htm 远程启动机器ABC WMI解决方案 ◆ 220.htm 在VB5中利用Winsock和msDNS控件进行 ◆ 221.htm 找出计算机上当前登录入网的用户 ◆ 222.htm 用VB5 Winsock控件创建TCP(IP)客户机 服务器程序

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧