用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 ...
随机推荐
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
废了半天劲才解决... 就三步:菜单栏,Tools -> Adnroid -> enable ADB integration
- numpy教程:快速傅里叶变换模块numpy.fft
http://blog.csdn.net/pipisorry/article/details/51050297 快速傅里叶变换 NumPy中,fft模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...
- (六十七)Xcode导入XMPPFramework框架
首先下载XMPPFramework框架,将Vendor内容导入到工程中,其中KissXML需要额外的框架,需要通过Xcode设置. 选择工程选项中TARGETS的General标签,最下侧有Linke ...
- 分布式进阶(二)Ubuntu 14.04下安装Dockr图文教程(一)
当前,完全硬件虚拟化技术(KVM.Xen.Hyper-V 等)能在一个物理主机上很好地运行多个互相独立的操作系统,但这也带来一些问题:性能不佳,资源浪费,系统反应迟缓等.有时候对用户来说,完全的硬件虚 ...
- Mybatis接口编程原理分析(二)
在上一篇博客中 Mybatis接口编程原理分析(一)中我们介绍了MapperProxyFactory和MapperProxy,接下来我们要介绍的是MapperMethod MapperMethod:它 ...
- javascript综合小案例,校验用户注册信息提交
完成这个综合小案例,对于html.css.javascript的大部分内容复习快结束了. 这里做一个小案例--要实现的功能,以一张图片的形式给出: 首先,写出提交数据之后进入的页面代码: <!D ...
- 十大常见Java String问题
翻译人员: 铁锚 翻译时间: 2013年11月7日 原文链接: Top 10 questions of Java Strings 本文介绍Java中关于String最常见的10个问题: 1. 字符串比 ...
- RabbitMQ安装使用详解
1.下载相应的版本安装:http://www.rabbitmq.com/download.htmleg:http://www.rabbitmq.com/releases/rabbitmq-server ...
- Java 截取中英文混合字符串
题目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入&q ...
- 【一天一道LeetCode】#27. Remove Element
一天一道LeetCode系列 (一)题目 Given an array and a value, remove all instances of that value in place and ret ...