[置顶] 【C#】 Socket通讯客户端程序
这段时间一直在优化Socket通讯这块,经常和Socket打交道,现在分享给大家一个小的案例,
代码如下:
byte[] m_dataBuffer = new byte [10];
IAsyncResult m_result;
public AsyncCallback m_pfnCallBack ;
private System.Windows.Forms.Button btnClear;
public Socket m_clientSocket;
//关闭连接
void ButtonCloseClick(object sender, System.EventArgs e)
{
if ( m_clientSocket != null )
{
m_clientSocket.Close ();
m_clientSocket = null;
}
Close();
}
//连接服务器
void ButtonConnectClick(object sender, System.EventArgs e)
{
// See if we have text on the IP and Port text fields
if(textBoxIP.Text == "" || textBoxPort.Text == ""){
MessageBox.Show("IP Address and Port Number are required to connect to the Server\n");
return;
}
try
{
UpdateControls(false);
// Create the socket instance
m_clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
// Cet the remote IP address
IPAddress ip = IPAddress.Parse (textBoxIP.Text);
int iPortNo = System.Convert.ToInt16 ( textBoxPort.Text);
// Create the end point
IPEndPoint ipEnd = new IPEndPoint (ip,iPortNo);
// Connect to the remote host
m_clientSocket.Connect ( ipEnd );
if(m_clientSocket.Connected) {
UpdateControls(true);
//Wait for data asynchronously
WaitForData();
}
}
catch(SocketException se)
{
string str;
str = "\nConnection failed, is the server running?\n" + se.Message;
MessageBox.Show (str);
UpdateControls(false);
}
}
//发送消息
void ButtonSendMessageClick(object sender, System.EventArgs e)
{
try
{
string msg = richTextTxMessage.Text;
// New code to send strings
NetworkStream networkStream = new NetworkStream(m_clientSocket);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
streamWriter.WriteLine(msg);
streamWriter.Flush();
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
//等待接收数据
public void WaitForData()
{
try
{
if ( m_pfnCallBack == null )
{
m_pfnCallBack = new AsyncCallback (OnDataReceived);
}
SocketPacket theSocPkt = new SocketPacket ();
theSocPkt.thisSocket = m_clientSocket;
// Start listening to the data asynchronously
m_result = m_clientSocket.BeginReceive (theSocPkt.dataBuffer,
0, theSocPkt.dataBuffer.Length,
SocketFlags.None,
m_pfnCallBack,
theSocPkt);
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
public class SocketPacket
{
public System.Net.Sockets.Socket thisSocket;
public byte[] dataBuffer = new byte[1024];
}
public void OnDataReceived(IAsyncResult asyn)
{
try
{
SocketPacket theSockId = (SocketPacket)asyn.AsyncState ;
int iRx = theSockId.thisSocket.EndReceive (asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
System.String szData = new System.String(chars);
richTextRxMessage.Text = richTextRxMessage.Text + szData;
WaitForData();
}
catch (ObjectDisposedException )
{
System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
private void UpdateControls( bool connected )
{
buttonConnect.Enabled = !connected;
buttonDisconnect.Enabled = connected;
string connectStatus = connected? "Connected" : "Not Connected";
textBoxConnectStatus.Text = connectStatus;
}
void ButtonDisconnectClick(object sender, System.EventArgs e)
{
if ( m_clientSocket != null )
{
m_clientSocket.Close();
m_clientSocket = null;
UpdateControls(false);
}
}
//----------------------------------------------------
// This is a helper function used (for convenience) to
// get the IP address of the local machine
//----------------------------------------------------
String GetIP()
{
String strHostName = Dns.GetHostName();
// Find host by name
IPHostEntry iphostentry = Dns.GetHostByName(strHostName);
// Grab the first IP addresses
String IPStr = "";
foreach(IPAddress ipaddress in iphostentry.AddressList){
IPStr = ipaddress.ToString();
return IPStr;
}
return IPStr;
}
转载于:https://www.cnblogs.com/kevinGao/archive/2011/12/20/2776051.html
[置顶] 【C#】 Socket通讯客户端程序相关推荐
- 请教如何改善C#中socket通信机客户端程序的健壮性
请教如何改善c#中socket通信机客户端程序的健壮性 我是做socket的新手,最近做了一个socket客户端程序,连接server的时候,如果server存在,并且允许连接的话,程序无错,正常执行 ...
- 窗口置顶(置于桌面所有程序之上)VC/MFC 怎么将窗口置顶
软件界面全屏显示后,需要把窗体置于其他桌面程序之上,但总是置于其他弹出框之下,会造成用户忽略了导致用户不明什么原因. 百度查了好多方法总是失败. 后来查到了CSND的一个帖子http://bbs.cs ...
- [置顶] Java Socket实战之一 单线程通信
本文地址:http://blog.csdn.net/kongxx/article/details/7259436 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可 ...
- [置顶] Android仿人人客户端(v5.7.1)——应用主界面之左侧面板UI实现
转载请标明出处:http://blog.csdn.net/android_ls/article/details/8749188 声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用, ...
- Qt笔记-窗口程序在任务栏中隐藏及永久置顶
这里主要是因为想搞个水印的程序. 感觉视频加水印比较麻烦,不如自己写个加水印的程序. 如下的效果: 这里有两点要注意,一个是在任务栏中隐藏: 主要是 Qt::Tool setWindowFlags(Q ...
- 窗口置顶器 TopWindow
N年前写的陈年老物...但是却很有用 最近改进下,不用全局钩子了,用全局热键. 对管理员权限创建的程序窗口,本程序也需要管理员权限才能对其操作 Ctrl + F2 置顶当前激活窗口 Ctrl + F3 ...
- [置顶] C#中Socket服务端代码分享
最近在对项目中Socket通讯中的服务端代码进行优化,保证能接受尽可能多的客户端的连接,并且不会丢掉连接,不会掉数据包.经过一段时间的反复测试和修改,终于达到了这一要求.服务端代码采用了异步通讯的方式 ...
- 微信小程序与Node服务器 Socket通讯
Socket通讯概述 多应用在软件开发中两个应用程序之间的通讯,俗称Socket通讯. 用于在两个的应用程序之间相互通信,socket是属于TCP\IP的上一层.最早出现在UNIX系统中,是UNIX系 ...
- linux c socket 服务器 客户端 简单通讯
1.socket简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是"孔"或"插座".作为 ...
最新文章
- 2、Ktor学习-自动重新加载;
- [scala-spark]7. list 与 map
- 了解下广告计费模式CPC、CPA和CPM
- Java程序猿面试体会,还没找到工作的“猿猿们”看过来!
- iframe 父页面与子页面之间的方法、属性的相互调用
- xmp文件格式怎么导入ps?ACR预设安装方法
- 【linux】linux下修改鼠标指针
- 怎么把PDF文件拆分开来?教你两种拆分方法
- 水逆了一整年的王源,2020年年初能靠《大主宰》翻身吗?
- 【C基础】11 指针与数组
- EduSoho网校系统产品更新:PPT动画转码
- 百度二年级手工机器人_小学二年级手工科技制作方案
- 麻省理工成立计算机学院,麻省理工学院斥资10亿美元建新计算机学院
- TigerGraph首将模式匹配与高效图计算相结合,为欺诈检测、网络安全保护、人工智能等应用增砖加瓦!
- c语言九三字符串的字母个数,C语言判断闰年和平年
- 便携式打印机连接蓝牙方式
- 代驾行业开发APP需要注意哪些
- js实现简单的掷骰子效果
- 这些比较前沿的设计网站,你知道吗?
- c语言字符数组英文倒序输出,字符串中的每个单词倒序输出问题
热门文章
- Mongoose源码剖析:外篇之web服务器
- linux qt creator git,Building Qt Creator from Git/zh
- python爬取网页上的特定链接_python3下scrapy爬虫(第三卷:初步抓取网页内容之抓取网页里的指定数据)...
- php笔试判断题,php笔试题收藏
- 远程桌面计算机让输入密码,解决Windows远程桌面连接每次都提示输入密码的问题...
- 刷新序号公共方法 公司内部用
- html中看到php代码_如何在HTML中嵌入PHP代码
- assign深拷贝_经典前端面试题: Object.assign 是浅拷贝还是深拷贝?实现深拷贝的方法有哪些?...
- 奇数页分节符什么意思_删除分节符问题
- php windows应用开发,开发老手谈Windows平台的PHP应用开发