Socket 学习实例
整理一份Socket代码,整理前辈的代码
http://www.cnblogs.com/yellowapplemylove/archive/2011/04/19/2021586.html
直接贴代码
一、客户端
/// <summary>
/// Client客户端
/// </summary>
public partial class ClientForm : Form
{
private IPAddress serverIp ;
private IPEndPoint serverFullAddr;
private Socket sock;
public ClientForm()
{
InitializeComponent();
this.Load += (e, v) =>
{
txtIP.Text = "127.0.0.1";
txtPort.Text = "";
};
}
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
serverIp = IPAddress.Parse(txtIP.Text.Trim());
serverFullAddr = new IPEndPoint(serverIp, int.Parse(txtPort.Text.Trim()));
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(serverFullAddr);//建立与远程主机的连接
//启动新线程用于接收数据
Thread t = new Thread(new ThreadStart(ReceiveMsg));
t.Name = "接收消息";
//一个线程或者是后台线程或者是前台线程。后台线程与前台线程类似,区别是后台线程不会防止进程终止。
//一旦属于某一进程的所有前台线程都终止,公共语言运行库就会通过对任何仍然处于活动状态的后台线程调用 abort 来结束该进程。
t.IsBackground = true;
t.Start();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void ReceiveMsg()
{
try
{
while (true)
{
byte[] byterec = new byte[];
this.sock.Receive(byterec);
string strrec = System.Text.Encoding.UTF8.GetString(byterec);
if (this.txtReceive.InvokeRequired)
{
this.txtReceive.Invoke(new EventHandler(ChangerText), new object[] { strrec, EventArgs.Empty });
}
}
}
catch (Exception ex)
{
MessageBox.Show("接收服务器消息发生错误" + ex.Message);
}
}
private void ChangerText(object obj, EventArgs e)
{
string s = Convert.ToString(obj);
this.txtReceive.AppendText(s + Environment.NewLine);
}
private void btnSend_Click(object sender, EventArgs e)
{
byte[] byteSend =System.Text.Encoding.UTF8.GetBytes(this.txtSend.Text.ToCharArray());
try
{
sock.Send(byteSend);
}
catch
{
MessageBox.Show("向服务器发送数据错误");
}
}
private void btnClose_Click(object sender, EventArgs e)
{
try
{
this.sock.Shutdown(SocketShutdown.Receive);
this.sock.Close();
Application.Exit();
}
catch
{
MessageBox.Show("关闭连接发生错误");
}
}
}
二、服务器端
public partial class ServerForm : Form
{
private IPAddress serverIp ;//IP地址
private IPEndPoint serverFullAddr;//完整终端地址
private Socket sock;
private System.Timers.Timer timer;
private ArrayList allStocksList;//当建立了多个连接时用于保存连接
public ServerForm()
{
InitializeComponent();
this.Load += (e, v) =>
{
txtIP.Text = "127.0.0.1";
txtPort.Text = "";
};
}
private void btstart_click(object sender, EventArgs e)
{
serverIp = IPAddress.Parse(txtIP.Text.Trim());
serverFullAddr = new IPEndPoint(serverIp, int.Parse(txtPort.Text.Trim()));
//构造socket对象,套接字类型为“流套接字”,指定五元组中的协议元
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
//指定五元组中的本地二元,即本地主机地址和端口号
sock.Bind(serverFullAddr);
//监听是否有连接传入,指定挂起的连接队列的最大值为20
sock.Listen();
allStocksList = new ArrayList();
//构造定时器,时间间隙为1秒,即每隔一秒执行一次accept()方法,以获取连接请求队列中//第一个挂起的连接请求
timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Enabled = false;
//执行accept(),当挂起队列为空时将阻塞本线程,同时由于上一语句,定时器将停止,直//至有连接传入
Socket acceptSTock = sock.Accept();
//将accept()产生的socket对象存入arraylist
allStocksList.Add(acceptSTock);
// 构造threading.timer对象,这将导致程序另启线程。线程将执行回调函数,该委托限制//函数参数须为object型。
//threading.timer构造器的第二个参数即传入回调函数的参数;第//三个参数指定调用回调函数之前的延时,取0则立即启动;
//最后一个参数指定调用回调函数//的时间间隔,取0则只执行一次。
System.Threading.Timer ti = new System.Threading.Timer(new TimerCallback(receivemsg), acceptSTock, , );
timer.Enabled = true;
} private void receivemsg(object obj)
{
Socket acceptStock = (Socket)obj;
try
{
while (true)
{
byte[] byteArray = new byte[];
acceptStock.Receive(byteArray);//接收数据
//将字节数组转成字符串
string strrec = System.Text.Encoding.UTF8.GetString(byteArray);
if (this.txtReceive.InvokeRequired)
{
this.txtReceive.Invoke(new EventHandler(this.ChangerText), new object[] { strrec, EventArgs.Empty });
}
}
}
catch (Exception ex)
{
acceptStock.Close();
MessageBox.Show("接收客户端消息错误" + ex.Message);
}
}
private void ChangerText(object obj, EventArgs e)
{
string s = Convert.ToString(obj);
this.txtReceive.AppendText(s + Environment.NewLine);
}
private void btnSend_Click(object sender, EventArgs e)
{
Socket sc = null;
byte[] byteSend =System.Text.Encoding.UTF8.GetBytes(this.tbsend.Text.ToCharArray());
try
{
//向所有的客户端发送数据
for (int i = ; i < allStocksList.Count; i++)
{
sc = allStocksList[i] as Socket;
sc.Send(byteSend);
}
}
catch (Exception ex)
{
if (sc != null)
{
sc.Close();
} MessageBox.Show("向客户端发送信息错误" + ex.Message);
}
} private void btnClose_Click(object sender, EventArgs e)
{
try
{
Application.Exit();
}
catch (Exception ex)
{
MessageBox.Show("关闭连接发生错误" + ex.Message);
}
}
}
Socket 学习实例的更多相关文章
- 网络协议栈学习(一)socket通信实例
网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服 ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- 你也可以写个服务器 - C# Socket学习2
前言 这里说的服务器是Web服务器,是类似IIS.Tomcat之类的,用来响应浏览器请求的服务. Socket模拟浏览器的Url Get请求 首先浏览器的请求是HTTP协议.我们上一篇说过,HTTP是 ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- Ant学习实例
ant 目录(?)[+] Ant学习实例 安装Ant 基础元素 project元素 target元素 property元素 完整示例 Ant学习实例 1.安装Ant 先从http://ant. ...
- Socket 学习(三).4 UDP 穿透 客户端与客户端连接
效果图: 使用方法: 先 修改WinClient\bin\Debug 下面的 ip.ini,写上 服务器 IP地址. 客户端 与 客户端 通讯 之前 ,点击发送打洞消息 按钮,然后过一会再发送消息 ...
- 在windows下用C语言写socket通讯实例
原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #in ...
- Socket学习总结系列(二) -- CocoaAsyncSocket
这是系列的第二篇 这是这个系列文章的第二篇,要是没有看第一篇的还是建议看看第一篇,以为这个是接着第一篇梳理的 先大概的总结一下在上篇的文章中说的些内容: 1. 整理了一下做IM我们有那些途径,以及我们 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
随机推荐
- 再谈LRU双链表内存管理
N年前我写了个双链表也发了博客,还添了代码.但是那个代码不但复杂,而且还有有问题的,一直懒得整理,放在空间误导别人.最近在写服务端,今天抽点空补一篇. 关于LRU网上随便搜,有过后端经验的人应该很多都 ...
- CentOS 6上安装xfce桌面环境
[日期:2012-01-30] 在新的CentOS 6上默认没有包含xfce的桌面环境,使用yum也找不到这些包,但是自己又喜欢这种简单的桌面环境,此时可以使用下面的方法来安装 [plain] $ ...
- 解决php中echo出来的汉子乱码
问的人太多了,就列出来展示给大家! 需要了解的概念: Content-Type:用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据 MIME:MIME类型就是设定某种扩展 ...
- Android NDK 学习之传递类对象
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- 【cs229-Lecture15】奇异值分解
PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的. 内容: PCA (主成份分析)是一种直接的降维方法,通过求解特征值与特征向量,并选取特征值较大的一些特征向量来达到降 ...
- 2014 网选 5011 Game(Nim游戏,数学题)
/* 题意:Nim游戏! 思路:通过异或,判断将n个数表示成二进制的形式之后,是否对应位的数字1 的个数是偶数! */ #include<iostream> using namespace ...
- Awk by Example--转载
原文地址: http://www.funtoo.org/Awk_by_Example,_Part_1?ref=dzone http://www.funtoo.org/Awk_by_Example,_P ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- Android上的事件流操作数据库
最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在Android端实现一个. 根据文章的介绍,将每次数据的变更事件,像是插入,删除或者更新等,记为一个不可变的事件,让数 ...
- 下载image或者其他文件
public void SaveDownLoadAsPNG(Image img, string filePath) { try { WebRequest request = WebRequest.Cr ...