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编写的聊天小程序的更多相关文章

  1. [Socket]Socket聊天小程序

    一个简单是Socket聊天小程序,读写操作在不同的线程中.服务器端采用线程池. 1.Server import java.io.IOException; import java.net.ServerS ...

  2. netty使用以及聊天小程序

    <从零开始搭建游戏服务器>Netty导入创建Socket服务器 Netty入门教程 Netty 聊天小程序

  3. Netty学习——基于netty实现简单的客户端聊天小程序

    Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...

  4. Netty 聊天小程序

    这节讲解基于 Netty 快速实现一个聊天小程序. 一.服务端 1. SimpleChatServerHandler(处理器类) 该类主要实现了接收来自客户端的消息并转发给其他客户端. /** * 服 ...

  5. 类似微信聊天小程序-网易云信,IM DEMO小程序版本

    类似微信聊天小程序-网易云信,IM DEMO小程序版本 代码地址: https://github.com/netease-im/NIM_Web_Weapp_Demo 云信IM DEMO 小程序版本 ( ...

  6. 基于JAVA网络编程的聊天小程序

    package com.neusoft.edu.socket; import java.io.BufferedReader; import java.io.IOException; import ja ...

  7. 微信小程序-----安装,编写第一个小程序和运行到手机端

    第一步: 微信公众平台注册账号,并选择小程序,网址:mp.weixin.qq.com 填写相关信息,如:主体类型(个人或者企业) AppID  在开发中都是用的到的,服务器域名在网络请求也是用的到的. ...

  8. JAVA编写的断点续传小程序

    上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用java语言写了一个断点续传的小程序来分享给大家, 首先要下载个用于网络请求的框架:我这里给出地址,是用的Apache的HttpClient: ...

  9. Windows学习总结(11)——Windows批处理命令编写代码及小程序简介

    批处理(Batch)也称为批处理脚本.顾名思义,就是对某对象进行批量的处理.DOS批处理是基于DOS命令,用来自动地批量地执行DOS命令以实现特定操作的脚本.批处理是一种简化的脚本语言,它应用于DOS ...

随机推荐

  1. iOS 解决键盘挡住输入框的问题

    iOS开发中经常会用到输入框UITextField,所以也常会遇到键盘挡住输入框而看不到输入框的内容. 在这里记录一种方法,用UITextField的代理来实现View的上移来解决这个问题. 首先设置 ...

  2. UNIX环境高级编程——管道和FIFO限制

    系统加于管道和FIFO的唯一限制为: OPEN_MAX     一个进程在任意时刻打开的最大描述符数: PIPE_BUF       可原子的写往一个管道或FIFO的最大数据量. OPEN_MAX的值 ...

  3. C++实现最小堆及插入,调整顺序,删除堆顶元素的操作

    上次用Java实现了最大堆的封装,这次就来写一下最小堆的实现吧 插入函数的思路: 向堆中插入元素有两种情况,一种是堆为空,那么就让插入值作为根节点即可:另一种是堆不为空,那么此时就要进行判断当前节点与 ...

  4. 开始ITGEGE教育社区的视频录制----嵌入式基础知识讲解

    从8月份开始,陆陆续续要对我的第一份兼职工作ITGEGE讲师做教学视频录制了,本人水平有限,我只讲一些开发在工作中的应用,其它细节的东西不做深究,毕竟本人工作经验和精力也有限,白天要上班,特别是最近又 ...

  5. 【Django】优化小技巧之清除过期session

    事情是这样的,大概也就几万注册用户的站点(使用django1.6), session 存储在关系型数据库,这次上线之后发现session表几十万数据了,过期session没有被自动删除 思考 官网 s ...

  6. 4.2、Libgdx各个模块概览

    (原文:http://www.libgdx.cn/topic/34/4-2-libgdx%E5%90%84%E4%B8%AA%E6%A8%A1%E5%9D%97%E6%A6%82%E8%A7%88) ...

  7. ORACLE收集统计信息

    1.     理解什么是统计信息 优化器统计信息就是一个更加详细描述数据库和数据库对象的集合,这些统计信息被用于查询优化器,让其为每条SQL语句选择最佳的执行计划.优化器统计信息包括: ·       ...

  8. Linux 开发环境搭建

    本文多参考自网上资料,在此多谢这些资料的作者的辛勤劳动! 另外,本文所用 Linux 版本为 CentOS 7.1. 终端配置 安装及配置 Zsh 在默认情况下,Linux 下的终端是 bash,但其 ...

  9. viewpager循环滚动和自动轮播的问题

    ViewPager是一个常用的android组件,不过通常我们使用ViewPager的时候不能实现左右无限循环滑动,在滑到边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的Vie ...

  10. (NO.00001)iOS游戏SpeedBoy Lite成形记(三)

    在Xcode中建立新类Player,继承自CCSprite.因为我们之后需要方便的更换玩家的大头贴,所以需要能够以不同的大头贴参数初始化Player对象. 不过别急,想想我们还需要在Player对象初 ...