用Socket编写的聊天小程序
Socket是什么?
是套接字,除此之外我也不太清楚,先略过
直接上实例,首先服务端:
private int ServerPoint = ; //自定义端口号
private string ServerUser = "Tracy"; //自定义昵称
private Socket clientSK;
private delegate void AppendRich(string txt,string user); //定义委托是为了避免在AppendText时出现"richTextBox1不是该线程创建"的错误提示 private void Form1_Load(object sender, EventArgs e)
{
Thread listenThread = new Thread(new ThreadStart(AppInit));
listenThread.Start(); //用多线程是为了防止sk.Listen(10)一直处于监听状态,导致UI界面卡死
}
private void AppInit()
{
Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint endPoint = new IPEndPoint(IPAddress.Any, ServerPoint);
sk.Bind(endPoint); //实例化Socket并绑定端口
sk.Listen(); //开始监听,如果没有客户端连接将一直卡在这 clientSK = sk.Accept(); //客户端连接,把这个有效的Socket连接赋给全局变量clientSK,程序继续走
SendMsg("已成功连接到服务器", "系统消息"); AppendRich dele = new AppendRich(AppendToRich); //实例化一个委托 while (true) //用死循环保持一直通话
{
try
{
byte[] receiveBT = new byte[];
int receiveInt = clientSK.Receive(receiveBT); //获取接收的消息
if (receiveInt == ) //如果接收到空消息,跳出循环
{
break;
}
string receiveStr = Encoding.UTF8.GetString(receiveBT, , receiveInt); //接收的消息转为string
richTextBox1.Invoke(dele, new object[] { receiveStr.Substring(), receiveStr.Substring(, ).Trim() }); //添加到richbox中,这里我自定义了string的格式,分昵称和消息内容
}
catch (Exception ex)
{
break;
}
}
//此时跳出了循环,意味着程序即将关闭
clientSK.Close(); //关闭连接到客户端的Socket
sk.Close(); //关闭实例化的Socket
richTextBox1.Invoke(dele, new object[] { "连接已终止", "系统消息" }); //利用委托向RichTextBox1中添加String
}
private void SendMsg(string txt, string user)
{
string nickName = user;
string sendStr = nickName.PadLeft() + txt;
byte[] bs = Encoding.UTF8.GetBytes(sendStr);
clientSK.Send(bs, bs.Length, );//向客户端发送信息
}
private void AppendToRich(string txt,string user)
{
if (txt == string.Empty)
{
return;
}
if (user == ServerUser) //判断用户,以便区分颜色和字体
{
richTextBox1.SelectionFont = new Font(new FontFamily("宋体"), );
richTextBox1.SelectionColor = Color.Green;
}
else
{
richTextBox1.SelectionFont = new Font(new FontFamily("宋体"), );
richTextBox1.SelectionColor = Color.Blue;
}
richTextBox1.AppendText("\r\n" + user + " " + DateTime.Now.ToString("HH:mm:ss") + "\r\n"); if (user == ServerUser)
{
richTextBox1.SelectionFont = new Font(new FontFamily("楷体"), );
richTextBox1.SelectionColor = Color.FromArgb(, , );
}
else
{
richTextBox1.SelectionFont = new Font(new FontFamily("宋体"), );
richTextBox1.SelectionColor = Color.Black;
}
richTextBox1.AppendText(txt);
richTextBox1.ScrollToCaret();//滚动条保持最底部
textBox2.ResetText();
textBox2.Focus();
}
ServerCode
客户端:
private int ServerPoint = ; //自定义端口号,要与之前服务端一致
private string ClientUser = "诺克萨斯", ClientIP = "127.0.0.1"; //自定义昵称,以及服务端IP
private Socket newclient;
private delegate void AppendRich(string txt, string user); private void Form1_Load(object sender, EventArgs e)
{
Thread listenThread = new Thread(new ThreadStart(AppInit));
listenThread.Start();
} private void AppInit()
{ newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ClientIP), ServerPoint); // 服务器的IP和端口
newclient.Connect(ie); //这里不需要绑定,直接连接到服务端
string hostName= Dns.GetHostName(); //获取客户端主机名
IPHostEntry iphostentry = Dns.GetHostEntry(hostName);
List<IPAddress> ips=iphostentry.AddressList.ToList(); //获取客户端IP SendMsg(ips[].ToString() + " 已连接", "系统消息");
AppendRich dele = new AppendRich(AppendToRich); while (true)
{
try
{
byte[] receiveBT = new byte[];
int receiveInt = newclient.Receive(receiveBT); //获取接收的消息
if (receiveInt == )
{
break;
}
string receiveStr = Encoding.UTF8.GetString(receiveBT, , receiveInt); //接收的消息转为string
richTextBox1.Invoke(dele, new object[] { receiveStr.Substring(), receiveStr.Substring(, ).Trim() }); //添加到richbox中
}
catch(Exception ex)
{
break;
}
}
newclient.Close();
richTextBox1.Invoke(dele, new object[] { "连接已终止", "系统消息" });
}
private void SendMsg(string txt, string user)
{
string nickName = user;
string sendStr = nickName.PadLeft() + txt;
byte[] bs = Encoding.UTF8.GetBytes(sendStr);
newclient.Send(bs, bs.Length, );//发送信息
}
private void AppendToRich(string txt, string user)
{
if (txt == string.Empty)
{
return;
}
richTextBox1.AppendText("\r\n" + user + " " + DateTime.Now.ToString("HH:mm:ss") + "\r\n" + txt);
richTextBox1.ScrollToCaret();//滚动条保持最底部
textBox1.ResetText();
textBox1.Focus();
}
ClientCode
用Socket编写的聊天小程序的更多相关文章
- [Socket]Socket聊天小程序
一个简单是Socket聊天小程序,读写操作在不同的线程中.服务器端采用线程池. 1.Server import java.io.IOException; import java.net.ServerS ...
- netty使用以及聊天小程序
<从零开始搭建游戏服务器>Netty导入创建Socket服务器 Netty入门教程 Netty 聊天小程序
- Netty学习——基于netty实现简单的客户端聊天小程序
Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...
- Netty 聊天小程序
这节讲解基于 Netty 快速实现一个聊天小程序. 一.服务端 1. SimpleChatServerHandler(处理器类) 该类主要实现了接收来自客户端的消息并转发给其他客户端. /** * 服 ...
- 类似微信聊天小程序-网易云信,IM DEMO小程序版本
类似微信聊天小程序-网易云信,IM DEMO小程序版本 代码地址: https://github.com/netease-im/NIM_Web_Weapp_Demo 云信IM DEMO 小程序版本 ( ...
- 基于JAVA网络编程的聊天小程序
package com.neusoft.edu.socket; import java.io.BufferedReader; import java.io.IOException; import ja ...
- 微信小程序-----安装,编写第一个小程序和运行到手机端
第一步: 微信公众平台注册账号,并选择小程序,网址:mp.weixin.qq.com 填写相关信息,如:主体类型(个人或者企业) AppID 在开发中都是用的到的,服务器域名在网络请求也是用的到的. ...
- JAVA编写的断点续传小程序
上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用java语言写了一个断点续传的小程序来分享给大家, 首先要下载个用于网络请求的框架:我这里给出地址,是用的Apache的HttpClient: ...
- Windows学习总结(11)——Windows批处理命令编写代码及小程序简介
批处理(Batch)也称为批处理脚本.顾名思义,就是对某对象进行批量的处理.DOS批处理是基于DOS命令,用来自动地批量地执行DOS命令以实现特定操作的脚本.批处理是一种简化的脚本语言,它应用于DOS ...
随机推荐
- Android开发学习之路--数据持久化之初体验
上班第一天,虽然工作上处于酱油模式,但是学习上依旧不能拉下,接着学习android开发吧,这里学习数据持久化的 知识. 其实数据持久化就是数据可以保存起来,一般我们保存数据都是以文件,或者数据库的形式 ...
- SDL2源代码分析4:纹理(SDL_Texture)
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- 最简单的基于FFmpeg的内存读写的例子:内存播放器
===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...
- Linux驱动基础:MSM平台AP/CP通信机制
点击打开链接 概述 MSM平台AP和CP封装到一个芯片,共享内容.所以之前也说过,高通的MSM解决方案中,CP的代码都是由AP放到指定地址的内存中以供CP运行.那上传完代码,CP开始跑之后,AP/CP ...
- Uva - 12504 - Updating a Dictionary
全是字符串相关处理,截取长度等相关操作的练习 AC代码: #include <iostream> #include <cstdio> #include <cstdlib& ...
- Gradle 笔记——Java构建入门
Gradle是一个通用的构建工具,通过它的构建脚本你可以构建任何你想要实现的东西,不过前提是你需要先写好构建脚本的代码.而大部分的项目,它们的构建流程基本是一样的,我们不必为每一个工程都编写它的构建代 ...
- Oracle PL/SQL Articles
我是搬运工....http://www.oracle-base.com/articles/plsql/articles-plsql.php Oracle 8i Oracle 9i Oracle 10g ...
- VB.NET版机房收费系统---外观层如何写
外观设计模式,<大话设计模式>第103页详细讲解,不记得这块知识的小伙伴可以翻阅翻阅,看过设计模式,敲过书上的例子,只是学习的第一步,接着,如果在我们的项目中灵活应用,把设计模式用出花儿来 ...
- Linux0.11启动过程
从开机加电,到执行main函数之前的过程 好吧,这里应该是有执行3个汇编的文件,但是我不太了解.囧 从main函数,到启动OK(即可以响应用户操作了) 这个步骤做了3件事情: 创建进程0,使之具备在主 ...
- [Django] 单元测试小记
从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合理,单元测试写起来就麻烦的多呀.公司的项目一直都是用Dj ...