基于Socket编程的网络聊天室
可行性分析
(1)操作可行性
聊天室是提供给网民一个交友与娱乐的场所。在聊天室里,网民可选择自己的聊天对象,与其进行对话交流,是网民之间相互沟通、交流情感的最佳方式之一。
利用聊天室,用户可以通过网络在线与距离遥远的其他一位或多位用户进行信息交流。既可以一对一,又可以一对多,还可以形成小组进行多对多讨论,方便网民在线私聊与群聊,是现行网络最流行、最被广泛应用的通讯工具。
(2)技术可行性
-
采用C/S模式,基于Socket编程的方式,使得各个用户通过服务器转发实现聊天的功能;
-
分为两大模块:客户端模块和服务器端模块;
-
客户端模块的主要功能
- 登陆功能:用户可以注册,然后选择服务器登入聊天室;
- 显示用户:将在线用户显示在列表中;
- 接收信息:能接收其他用户发出的信息;
- 发送信息:能发出用户要发出的信息;
- 自定义颜色:可以个性化字体颜色;
- 退出功能:用户离线,进行通知;
- 连接设置:显示连接的IP地址和端口号。
-
服务器端模块的主要功能
- 检验登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确,就允许用户登陆;
- 显示在线状态:将该用户的状态发给各在线用户;
- 转发聊天信息:将消息转发给所有在线的用户;
- 端口服务:输入要侦听的端口,默认为9590;
- 启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;
- 停止服务:关闭服务器,侦听结束。客户端用户不能再聊天;
- 服务器IP:输入要监听的IP;
- 退出服务器:退出程序,并停止服务。
(3)经济可行性
-
成本方面:本系统主要在实验室开发,相应资料已具备,开发成本和运行成本能够满足。
-
效益方面:人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。一个操作简单,界面友好、运行稳定的聊天室,对于小型局域网的用户可以起到很好的交流作用。
设计原理
聊天协议的应答
-
聊天状态:CLOSED和CONNECTED状态
-
执行CONN命令后进入CONNECTED状态,执行下列命令:
- CONN:连接聊天室服务器
- JOIN:加入聊天(通知其他用户本人已经加入聊天室服务器)
- LIST:列出所有的用户(向客户端发送全部的登录用户名字)
- CHAT:发送聊天信息(公开的聊天信息)
- PRIV:进行私聊(三个参数:私聊信息用户;接收私聊信息用户;发送信息)
- EXIT:客户端向服务器发送离开请求;
- QUIT:退出聊天,服务器向客户端发送退出命令(执行QUIT命令聊天状态变为CLOSED)。
服务器协议解析
当有客户端连接聊天室服务器后,服务器立刻为这个客户建立一个数据接收的线程(多用户程序必备)。在接收线程中,如果收到聊天命令,就对其进行解析处理,服务器可以处理五种命令:CONN\LIST\CHAT\PRIV\EXIT。
服务器接收到CONN命令,就向其他用户发送JOIN命令告诉有用户加入,然后把当前的全部用户信息返回给刚刚加入的用户,以便在界面上显示用户列表。当接收到EXIT命令后,就清除当前用户的信息,然后向其他用户发送QUIT命令,告诉其他用户退出了,这些用户的客户端把离开的用户从用户列表中删除。
客户端协议解析
当客户端连接到服务器后,服务器立刻建立一个数据接收的独立线程。在接收线程中,如果收到了聊天命令,就对其进行解析处理。客户端一共处理的命令有五种:OK\ERR\LIST\JOIN\QUIT命令。
具体实现
编写实体Bean
编写一个独立的类即Client类,封装了客户端的信息与连接,每一个客户进入聊天室,就创建一个Client对象,用于保存该用户的信息并接收用户数据和发送信息到客户端
Client.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
namespace Server
{public class Client{private string name;//保存用户名private Socket currentSocket = null;//保存与当前用户连接的Socket对象private string ipAddress;//保存用户的IP地址private FrmServer server;//保留当前连接的状态://closed --> connected --> closedprivate string state = "closed";public Client(FrmServer server, Socket clientSocket){this.server = server;this.currentSocket = clientSocket;ipAddress = getRemoteIPAddress();}//获得连接客户端的IP地址,并转换成一个字符串private string getRemoteIPAddress(){return ((IPEndPoint)currentSocket.RemoteEndPoint).Address.ToString();}//306.客户端线程方法,每连入一个客户端,会启动这个方法public string Name{get{return name;}set{name = value;}}public Socket CurrentSocket{get{return currentSocket;}set{currentSocket = value;}}//ServiceClient()函数为服务器接收客户数据的线程主体,主要用来接收用户发送来的数据,并处理聊天命令public void ServiceClient(){string[] tokens = null;byte[] buff = new byte[1024];bool KeepConnect = true;//用循环来不断的与客户端交互,直到客户端发出EXIT命令while (FrmServer.ServiceFlag && KeepConnect){tokens = null;try{//如果没有信息达到服务器端,则休息if (currentSocket == null || currentSocket.Available < 1){Thread.Sleep(200);continue;}//接收数据并存入buff数组中int len = currentSocket.Receive(buff);//将字符数组转化为字符串string clientCommand = System.Text.Encoding.Default.GetString(buff, 0, len);//tokens[0]中保存了命令标志符(CONN、CHAT、PRIV、LIST或EXIT)tokens = clientCommand.Split(new Char[] { '|' });if (tokens == null){Thread.Sleep(150);continue;}}catch (Exception ex){server.updateUI("发生异常:" + ex.Message);}if (tokens[0] == "CONN"){//此时接收到的命令格式为://命令标志符(CONN)|发送者的用户名|,//tokens[1]中保存了发送者的用户名this.name = tokens[1];if (FrmServer.clients.Contains(this.name)){SendToClient(this, "ERR|User " + this.name + " 已经存在");}else{Hashtable syncClients = Hashtable.Synchronized(FrmServer.clients);syncClients.Add(this.name, this);//更新界面server.AddUser(this.name);//对每一个当前在线的用户发送JOIN消息命令和LIST消息命令,//以此来更新客户端的当前在线用户列表System.Collections.IEnumerator myEnumerator =FrmServer.clients.Values.GetEnumerator();while (myEnumerator.MoveNext()){Client client = (Client)myEnumerator.Current;SendToClient(client, "JOIN|" + tokens[1] + "|");Thread.Sleep(100);}//更新状态state = "connected";SendToClient(this, "ok");//向客户端发送LIST命令,以此更新客户端的当前在线用户列表string msgUsers = "LIST|" + server.GetUserList();SendToClient(this, msgUsers);}}else if (tokens[0] == "LIST"){if (state == "connnected"){//向客户端发送LIST命令,以此更新客户端的当前在线用户列表string msgUsers = "LIST|" + server.GetUserList();SendToClient(this, msgUsers);}else{//send err to serverSendToClient(this, "ERR|state error,Please login first");}}else if (tokens[0] == "CHAT"){if (state == "connected"){//此时接收到的命令的格式为://命令标志符(CHAT)|发送者的用户名:发送内容|//向所有当前在线的用户转发此信息System.Collections.IEnumerator myEnumerator =FrmServer.clients.Values.GetEnumerator();while (myEnumerator.MoveNext()){Client client = (Client)myEnumerator.Current;//将“发送者的用户名:发送内容”转发给用户SendToClient(client, tokens[1]);}server.updateUI(tokens[1]);}else{//send err to serverSendToClient(this, "ERR|state error,Please login first");}}else if (tokens[0] == "PRIV"){if (state == "connected"){//此时接收到的命令格式为://命令标志符(PRIV)|发送者用户名|接收者用户名|发送内容|//tokens[1]中保存了发送者的用户名string sender = tokens[1];//tokens[2]中保存了接收者的用户名string receiver = tokens[2];//tokens[3]中保存了发送的内容string content = tokens[3];string message = sender + " ---> " + receiver + ": " + content;//仅将信息转发给发送者和接收者if (FrmServer.clients.Contains(sender)){SendToClient((Client)FrmServer.clients[sender], message);}if (FrmServer.clients.Contains(receiver)){SendToClient((Client)FrmServer.clients[receiver], message);}server.updateUI(message);}else{//send err to serverSendToClient(this, "ERR|state error,Please login first");}}else if (tokens[0] == "EXIT"){//此时接收到的命令的格式为:命令标志符(EXIT)|发送者的用户名//向所有当前在线的用户发送该用户已离开的信息if (FrmServer.clients.Contains(tokens[1])){Client client = (Client)FrmServer.clients[tokens[1]];//将该用户对应的Client对象从clients中删除Hashtable syncClients = Hashtable.Synchronized(FrmServer.clients);syncClients.Remove(client.name);server.RemoveUser(client.name);//向客户端发送QUIT命令string message = "QUIT|" + tokens[1];System.Collections.IEnumerator myEnumerator =FrmServer.clients.Values.GetEnumerator();while (myEnumerator.MoveNext()){Client c = (Client)myEnumerator.Current;SendToClient(c, message);}}//退出当前线程break;}Thread.Sleep(200);}}//SendToClient()方法实现了向客户端发送命令请求的功能private void SendToClient(Client client, string msg){System.Byte[] message = System.Text.Encoding.Default.GetBytes(msg.ToCharArray());client.CurrentSocket.Send(message, message.Length, 0);}}
}
聊天室服务器端设计
使用Label,TextBox,Button,ListBox,RichTextBox等控件完成服务器端UI
启动服务之前,我们要先对服务端IP和端口号进行设置,设置完成后点击启动服务按钮,对已设置端口进行监听
当服务使用完成后,点击结束服务按钮,停止对端口的监听
界面和功能实现FrmServer.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
using System.Windows.Forms;namespace Server
{public partial class FrmServer : Form{internal static Hashtable clients = new Hashtable();//clients数组保存当前在线用户的Client对象private TcpListener listener;//该服务器默认的监听端口号static int MaxNum = 100;//服务器可以支持的客户端最大连接数internal static bool ServiceFlag = false;//开始服务的标志public FrmServer(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}//服务器监听的端口号通过getValidPort()函数获得private int getValidPort(string port){int lport;//测试端口号是否有效try{//是否为空if (port == ""){throw new ArgumentException("端口号为空,不能启动服务器");}lport = System.Convert.ToInt32(port);}catch (Exception e){Console.WriteLine("无效的端口号:" + e.ToString());this.rtbMessage.AppendText("无效的端口号:" + e.ToString() + "\n");return -1;}return lport;}private void FrmServer_Load(object sender, EventArgs e){string strHostName = Dns.GetHostName();IPAddress strAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];this.txtIPAddress.Text = strAddress.ToString();}private void btnStart_Click(object sender, EventArgs e){//确认端口号是有效的,根据TCP协议,范围应该在-65535之间int port = getValidPort(txtPort.Text);if (port < 0){return;}string ip = txtIPAddress.Text;try{IPAddress ipAdd = IPAddress.Parse(ip);listener = new TcpListener(ipAdd, port);//创建服务器套接字listener.Start(); //开始监听服务器端口this.rtbMessage.Text = "";this.rtbMessage.AppendText("Socket服务器已经启动!\n正在监听"+ ip+ "\n端口号:" + this.txtPort.Text + "\n");//启动一个新的线程,执行方法this.StartSocketListen,//以便在一个独立的进程中执行确认与客户端Socket连接的操作FrmServer.ServiceFlag = true;Thread thread = new Thread(new ThreadStart(this.StartSocketListen));thread.Start();this.btnStart.Enabled = false;this.btnStop.Enabled = true;}catch (Exception ex){this.rtbMessage.AppendText(ex.Message.ToString() + "\n");}}//在新的线程中的操作,它主要用于当接收到一个客户端请求时,确认与客户端的链接//并且立刻启动一个新的线程来处理和该客户端的信息交互private void StartSocketListen(){while (FrmServer.ServiceFlag){try{if (listener.Pending()){Socket socket = listener.AcceptSocket();if (clients.Count >= MaxNum){this.rtbMessage.AppendText("已经达到了最大连接数:" + MaxNum + ",拒绝新的连接\n");socket.Close();}else{//启动一个新的线程,执行方法this.ServiceClient,处理用户相应的请求Client client = new Client(this, socket);Thread clientService = new Thread(new ThreadStart(client.ServiceClient));clientService.Start();}}//这句话能使系统性能大大提高Thread.Sleep(200);}catch (Exception ex){this.rtbMessage.AppendText(ex.Message.ToString() + "\n");}}}private void txtPort_TextChanged(object sender, EventArgs e){if (this.txtPort.Text != ""){this.btnStart.Enabled = true;}}private void btnStop_Click(object sender, EventArgs e){FrmServer.ServiceFlag = false;Thread.Sleep(300);rtbMessage.Text += txtIPAddress.Text + "的服务已经停止!" + "\r\n";//204. 控制按钮的可用性this.btnStart.Enabled = true;this.btnStop.Enabled = false;}public void AddUser(string username){this.rtbMessage.AppendText(username + "已经加入\n");//将刚连接的用户加入到当前在向用户列表中this.userlist.Items.Add(username);this.usernum.Text = Convert.ToString(clients.Count);}public void RemoveUser(string username){this.rtbMessage.AppendText(username + "已经离开\n");//将刚连接的用户加入到当前在向用户列表中this.userlist.Items.Remove(username);this.usernum.Text = Convert.ToString(clients.Count);}public string GetUserList(){string rtn = "";for (int i = 0; i < userlist.Items.Count; i++){rtn += userlist.Items[i].ToString() + "";}return rtn;}public void updateUI(string msg){this.rtbMessage.AppendText(msg + "\n");}private void FrmServer_FormClosing(object sender, FormClosingEventArgs e){FrmServer.ServiceFlag = false;}}
}
聊天室客户端设计
客户端主要完成界面、聊天和传输文件功能的设计,用到以下控件:Label,TextBox,Button,ListBox,RichTextBox,OpenFileDialog,CheckBox。
连接、登陆以前,要对服务器IP、端口号和用户名进行设置, 为调试方便,窗体的Load事件将服务器IP设置为本机IP并对端口6666进行监听,一旦有其他客户端向本客户端发送消息可以选择接收。
接下来就可以进行对话了,在下面的TextBox中输入要发送的信息,点击发送对所有在线人发送信息,若选择私聊CheckBox和在线用户的用户名,则是仅对该用户发送信息,为了体现个性化,系统增加了改变字体颜色的功能。
观察服务器端消息转发情况
界面和功能实现FrmClient.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Client
{public partial class FrmClient : Form{TcpClient tcpClient;//与服务器的连接private NetworkStream Stream;//与服务器交互的流通道private static string CLOSED = "closed";private static string CONNECTED = "connected";private string state = "closed";private bool stopFlag;private Color color;//保存当前客户端显示的颜色public FrmClient(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}private void btnLogin_Click(object sender, EventArgs e){if (state == CONNECTED)return;if (this.username.TextLength == 0){MessageBox.Show(" 请输入你的昵称!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);this.username.Focus();//为控件设置焦点return;}try{//创建一个客户端套接字,他是Login的一个公共属性tcpClient = new TcpClient();tcpClient.Connect(IPAddress.Parse(txtHost.Text), Int32.Parse(txtPort.Text));//向指定的IP地址服务器发出连接请求Stream = tcpClient.GetStream(); //获得与服务器数据交互的流通道 NetworksStream//启动一个新的线程,执行方法this.ServerResponse(),以便来响应从服务器发回的信息Thread thread1 = new Thread(new ThreadStart(this.ServerResponse));thread1.Start();//向服务器发送CONN请求命令//此命令的格式与服务器端的定义的格式一致//命令格式为:命令标志符CONN|发送者的用户名string cmd = "CONN|" + this.username.Text + "|";//将字符串转化为字符数组Byte[] outbytes = System.Text.Encoding.Default.GetBytes(cmd.ToCharArray());Stream.Write(outbytes, 0, outbytes.Length);}catch (Exception ex){MessageBox.Show(ex.Message);}}private void btnSend_Click(object sender, EventArgs e){try{if (!this.cbPrivate.Checked){//此时命令的格式是:命令标识符CHAT|发送者的用户名:发送内容|string message = "CHAT|" + this.username.Text + ":" + tbSendContent.Text;tbSendContent.Text = "";tbSendContent.Focus();byte[] outbytes = System.Text.Encoding.Default.GetBytes(message.ToCharArray()); //将字符串转化为字符数组Stream.Write(outbytes, 0, outbytes.Length);}else{if (lstUsers.SelectedIndex == -1){MessageBox.Show("请在列表中选择一个用户", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);return;}string receiver = lstUsers.SelectedItem.ToString();//消息的格式是:命令标识符PRIV|发送者的用户名|接收者的用户名|发送内容string message = "PRIV|{" + this.username.Text + "|" + receiver + "|" + tbSendContent.Text + "|";tbSendContent.Text = "";tbSendContent.Focus();byte[] outbytes = System.Text.Encoding.Default.GetBytes(message.ToCharArray()); //将字符串转化为字符数组Stream.Write(outbytes, 0, outbytes.Length);}}catch{this.rtbMsg.AppendText("网络发生错误!");}}//this.ServerResponse()方法用于接收从服务器发回的信息,根据不同的命令,执行相应的操作private void ServerResponse(){//定义一个byte数组,用于接收从服务器端发来的数据//每次所能接受的数据包的最大长度为1024个字节byte[] buff = new byte[1024];string msg;int len;try{if (Stream.CanRead == false){return;}stopFlag = false;while (!stopFlag){//从流中得到数据,并存入到buff字符数组中len = Stream.Read(buff, 0, buff.Length);if (len < 1){Thread.Sleep(500);continue;}//将字符数组转化为字符串msg = System.Text.Encoding.Default.GetString(buff, 0, len);msg.Trim();string[] tokens = msg.Split(new char[] { '|' });//tokens[0]中保存了命令标志符LIST JOIN QUITif (tokens[0].ToUpper() == "OK"){//处理响应add("命令执行成功!");}else if (tokens[0].ToUpper() == "ERR"){add("命令执行错误:" + tokens[1]);}else if (tokens[0] == "LIST"){//此时从服务器返回的消息格式:命令标志符LIST|用户名1|用户名2|。。(所有在线用户名)//add(“获得用户列表”),更新在线用户列表lstUsers.Items.Clear();for (int i = 1; i < tokens.Length - 1; i++){lstUsers.Items.Add(tokens[i].Trim());}}else if (tokens[0] == "JOIN"){//此时从服务器返回的消息格式:命令标志符JOIN| 刚刚登入的用户名add(tokens[1] + "已经进入了聊天室");this.lstUsers.Items.Add(tokens[1]);if (this.username.Text == tokens[1]){this.state = CONNECTED;}}else if (tokens[0] == "QUIT"){if (this.lstUsers.Items.IndexOf(tokens[1]) > -1){this.lstUsers.Items.Remove(tokens[1]);}add("用户:" + tokens[1] + "已经离开");}else{//如果从服务器返回的其他消息格式,则在ListBox控件中直接显示add(msg);}}//关闭连接tcpClient.Close();}catch{add("网络发生错误");}}//将“EXIT”命令发送给服务器,此命令格式要与服务器端的命令格式一致private void FrmClient_FormClosing(object sender, FormClosingEventArgs e){btnExit_Click(sender, e);}//设置字体颜色//向显示消息的rtbMsg中添加信息是通过add函数完成的private void add(string msg){if (!color.IsEmpty){this.rtbMsg.SelectionColor = color;}this.rtbMsg.SelectedText = msg + "\n";}private void btnExit_Click(object sender, EventArgs e){if (true){string message = "EXIT|" + this.username.Text + "|";//将字符串转化为字符数组byte[] outbytes = System.Text.Encoding.Default.GetBytes(message.ToCharArray());Stream.Write(outbytes, 0, outbytes.Length);this.state = CLOSED;this.stopFlag = true;this.lstUsers.Items.Clear();}}private void btnColor_Click(object sender, EventArgs e){ColorDialog colorDialog1 = new ColorDialog();colorDialog1.Color = this.rtbMsg.SelectionColor;if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&colorDialog1.Color != this.rtbMsg.SelectionColor){this.rtbMsg.SelectionColor = colorDialog1.Color;color = colorDialog1.Color;}}}
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 微信小程序版博客——开发汇总总结(附源码)
花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结。整体效果对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或者直接访问我的小程序一些体会四月份的空余时间都在折腾自己的微信小程…...
2024/3/29 4:38:26 - 关于java.awt.datatransfer包的一些讲解
众所周知,这个包主要是与系统剪切板相关的的软件包(还有就是与JFC里的拖曳编程相关),这个包的核心类当然是Clipborad类(个人认为),这个类我们就看成是一个剪切板,它具有储存的内容,我们可以取得和设置它的内容.它的内容被封装在Transferable里,我们最终要取得的数据,就是在它里…...
2024/3/7 22:55:46 - 你的编程语言是何门派?
IT界就像一个武林,各种各样的编程语言就像各门各派一样,各自有各自的特色。 就像我学的java这个语言门派算是前三吧,古有武当少林,今有java,C++。刚接触程序语言时的兴奋,觉得一切都很神奇,为什么几行代码就能够显示出那些文字,或者一个点击操作,为什么就能按…...
2024/3/7 22:55:45 - java从入门到精通第四版明日科技书籍简介及下载
Java从入门到精通(第4版)(附光盘) 平装 –2016年10月20日 《Java从入门到精通(第4版)(附光盘)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。全书分为28章,包括初识Java,熟悉Eclipse开发工具,Java语言基础…...
2024/3/7 22:55:43 - 一键生成发布百度小程序、微信小程序、支付宝和今日头条小程序
一键生成百度、微信小程序。快人一步,助力企业企业高速发展。双核智能小程序助力企业收割亿级流量小程序的战场硝烟滚滚,具体战况扑朔迷离,谁都不能以胜利者的姿态袖手旁观。App的争夺战基本结束,互联网下半场,超级app+小程序,成为巨头的新战场。自2年多前,微信推出小程…...
2024/3/7 22:55:43 - Spring Boot+Spring Data Jpa+DBCP2数据源
Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repository极大地减少了JPA作为数据访问方案的代码量。pom.xml文件父类pom<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"…...
2024/3/29 4:38:19 - 币圈江湖:如果交易所在金庸小说中,会是什么门派?
在金庸武侠小说里,有这么一句话,叫做“有人的地方就有江湖”,而币圈这些年来何尝不是一个江湖。在币圈,交易所的地位与金庸武侠小说中的武林门派一样重要,掌握着代币的“生杀大权”,是币友们进行数字货币交易的最主要场所。如果把交易所比作金庸小说中的武林门派,你觉得…...
2024/3/29 4:38:26 - HTML/CSS button换背景方法
本文实例讲述了js实现按钮加背景图片常用方法。分享给大家供大家参考。具体实现方法如下:方法一:复制代码代码如下:<input type="submit" onMouseOver="style=background:url(imgs/jb51.gif)"/>方法二: 复制代码代码如下:<input type="butt…...
2024/3/28 20:47:35 - 用Perl语言进行Socket网络编程
网络编程是一门神秘且复杂的艺术,当然也十分有趣。Perl语言提供了丰富的TCP/IP网络函数,所有这些函数都直接于C语言的socket库函数网络编程是一门神秘且复杂的艺术,当然也十分有趣。Perl语言提供了丰富的TCP/IP网络函数,所有这些函数都直接于C语言的socket库函数。由于Perl…...
2024/3/28 20:47:35 - 可商用的微信名片小程序源码,JAVA语言SSM框架
用微信名片小程序替代传统的纸质名片风靡一时,销售为了获取客户,每天会去发传单和名片,而得到的回应屈指可数,他人接到名片如果用不到就扔了,能用到的事后却找不到了。而销售也不晓得自己的名片是否北留村,失去了名片的价值。 而名片小程序给与了赋能,销售人员也能够知道…...
2024/3/28 20:47:34 - 原创游戏,金庸群侠传X 0.5发布
首先说一下背景,我个人从小特别爱玩游戏,对小时候一款游戏《金庸群侠传》DOS版更是情有独钟,自己工作以后,利用业余时间自己整了一个原创的改编版丢网上(找图片、音乐、写剧情更是虐心之极,耗时之极),居然挺受玩家欢迎。收到莫大鼓舞,于是各种业余时间在家自娱自乐写着…...
2024/3/28 20:47:32 - SOCKET 编程(自学资料整理)
基于网络的开发 互联网 广域网 局域网 城域网 www.baidu.com域名 广域网通过域名访问协议:重点的内容 别人规定 自定义协议 计算机和计算机之间进行数据传输的通道 协议 协议:TCP/IP:广域网协议 IP地址 动态的 固定的IP地址段 一定的规律可循 SP 服务提供商 增值业务 IP…...
2024/3/28 20:47:33 - ArcGIS调用DataInteroperabilityTools导出数据
ArcGIS Engine调用DataInteroperabilityTools导出数据最近需要开发一个功能,在ArcGIS Engine中导出MapInfo的TAB数据以及Google的KML数据。我先是考虑将ArcGIS图层中的数据提取出来,然后根据TAB和KML的格式分别生成数据。后来考虑到这种方法做起来十分复杂,而ArcGIS的扩展模…...
2024/3/28 20:47:30 - html中button标签reset用法
reset是input的一个类型,而input必须与form一起用才有效果。比如<form><input type="text" value="" /><button type="reset" value="重置按钮"></button></from>...
2024/3/28 20:47:30 - PostgreSQL数据库从入门到精通
阿里云大学:PostgreSQL数据库从入门到精通PostgreSQL被誉为“世界上功能最强大的开源数据库”,是以加州大学伯克利分校计算机系开发的POSTGRES 4.2为基础的对象关系型数据库管理系统。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图…...
2024/3/28 20:47:28 - 新版小程序登录授权
首先近期工作中需要做小程序框架升级,升级成美团开源的mpvue框架;然后因为微信小程序API的改版,所以也顺便将授权登录的逻辑重新设计了。授权登录的逻辑参考了多个小程序,希望能找到最优的模式。下面会配合代码详细讲解整个流程。模式概览由于微信小程序的改版导致直接弹出…...
2024/3/29 4:38:55 - 2017年度总结
2018年的1月都过去了,我的2017年总结才来,那么就切入正题吧,至姗姗来迟的年度总结: 读书 因为遇到了京东读书,这一年从7月开始,读完了20本书,其中还包括三体和巨人的陨落这样的长篇。之前为了减少通勤的时间,租房子都在公司附近,每天上下班步行15min以内足矣。通勤的时…...
2024/3/29 4:40:06 - C++ socket编程
概要: sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。 服务器端编程的步骤: 1:加载套接字库,创建套接字(WSAStartup()/socket()); 2:绑定套接字到一个IP地址和…...
2024/3/4 7:30:32 - @Data注解的作用
@Data注解是lombok.jar包下的注解,该注解通常用在实体bean上,不需要写出set和get方法,但是具备实体bean所具备的方法,简化编程提高变成速度。注意:项目中一定要引入lombok.jar!!例子:1、定义的实体bean:import lombok.Data;@Data public class DataAnnotation {private i…...
2024/3/12 13:17:26 - 源码-PL/SQL从入门到精通-第十六章-动态SQL语句-Part 2
--代码16.10 定义并打开动态SQL语句游标 DECLARETYPE emp_cur_type IS REF CURSOR; --定义游标类型emp_cur emp_cur_type; --定义游标变量v_deptno NUMBER(4) := &deptno; --定义部门编号绑定变量v_empno NUMBER(4); …...
2024/3/7 22:55:32
最新文章
- openGauss MySQL一键式迁移工具gs_rep_portal
MySQL一键式迁移工具gs_rep_portal 可获得性 本特性自openGauss 5.0.0版本开始引入。 特性简介 gs_rep_portal是一个用Java编写的,在linux系统上运行的,集成了全量迁移、增量迁移、反向迁移、数据校验的工具。gs_rep_portal支持以上工具的一键式安装…...
2024/3/29 12:33:32 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - python宿舍管理系统flask-django-php-nodejs
随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建宿舍管理系统。系统分为多个功能模块:学生、宿舍管理、楼宇信息、宿舍信息、宿舍安排、缺勤信息等。通过系统测试&…...
2024/3/27 16:03:21 - 2024.3.15 ARM
思维导图...
2024/3/25 6:13:38 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/3/27 10:21:24 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/3/24 20:11:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/3/29 2:45:46 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/3/24 20:11:23 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/3/29 5:19:52 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/3/28 17:01:12 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/3/29 11:11:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/3/29 1:13:26 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/3/29 8:28:16 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/3/29 7:41:19 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/3/24 20:11:18 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/3/29 9:57:23 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/3/29 0:49:46 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/3/24 20:11:15 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/3/27 7:12:50 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/3/24 20:11:13 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/3/26 11:21:23 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/3/28 18:26:34 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/3/28 12:42:28 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/3/28 20:09:10 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57