C#网络编程简单实现通信小例子-2
1、主界面
2、源代码
Client
public partial class FormClient : Form
{
//声明一个Socket
public Socket newClient;
//判断是否连接成功
public bool isConnected;
//定义一个线程
public Thread myThread;
//定义一个委托
public delegate void MyInvoke(string str);
public FormClient()
{
InitializeComponent();
} private void Connection()
{
//IPAddress ip=null;
//int port=888;
byte[]data=new byte[];
//创建一个新的Socket
newClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获取IP地址
#region GetIP
//if (txtIP.Text == string.Empty)
//{
// MessageBox.Show("远程IP不能为空");
//}
//else
//{
// string pattrn = @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))";
// if (System.Text.RegularExpressions.Regex.IsMatch(txtIP.Text.Trim(), pattrn))
// {
// ip = IPAddress.Parse(txtIP.Text.Trim());
// }
// else
// {
// MessageBox.Show("IP地址格式不正确!");
// }
//} #endregion
//获取端口号
#region GetPort
//if (System.Text.RegularExpressions.Regex.IsMatch(@"^[-]?\d+[.]?\d*$", txtPort.Text.Trim()))
//{
// port = Convert.ToInt32(txtPort.Text.Trim());
//}
//else
//{
// MessageBox.Show("端口号格式不正确");
//}
#endregion
//封装网络端点
IPEndPoint ie = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()),Convert.ToInt32(txtPort.Text.Trim()));
#region Connection
try
{
//建立与远程主机之间的连接
newClient.Connect(ie);
//设置连接服务器控件的属性
// btnConnection.Enabled = false;
//设置连接状况
btnConnection.Text = "停止连接";
//isConnected = true;
}
catch (SocketException ex)
{
MessageBox.Show("连接服务器失败" + ex.Message);
return;
}
#endregion
//启动当前线程用于接收消息
ThreadStart myThreadDelegate = new ThreadStart(ReceiveMessage);
myThread = new Thread(myThreadDelegate);
myThread.Start();
}
/// <summary>
/// 接收消息
/// </summary>
public void ReceiveMessage()
{
while (true)
{
//定义字节数组大小
byte[]data=new byte[];
//获取数组长度
int recv = newClient.Receive(data);
//接收数据
string strData = Encoding.UTF8.GetString(data, , recv);
//显示信息
ShowMessage(newClient.RemoteEndPoint.ToString()+":"+strData+"\r\n");
}
}
/// <summary>
/// 显示消息
/// </summary>
/// <param name="msg">接收的消息,可能来自Client/也可能来自Server</param>
public void ShowMessage(string msg)
{
//如果是在创建该控件以外的线程调用该控件
if (lbMessage.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(ShowMessage);
//lbMessage.Invoke(myInvoke, new object[] { msg });
lbMessage.Invoke(myInvoke,new object[]{"远程主机:"+msg});
}
else
{
lbMessage.Items.Add(msg);
}
} private void btnSend_Click(object sender, EventArgs e)
{
if (txtSendMessage.Text == null)
{
txtSendMessage.Text = "发送消息不能为空";
//停留1秒消失
}
else
{
//获取发送数据长度
int myMessLength = txtSendMessage.Text.Length;
//将数据转换为字节数组
byte[] data = new byte[myMessLength];
data = Encoding.UTF8.GetBytes(txtSendMessage.Text);
//发送数据
int i = newClient.Send(data);
//将数据显示在Client
ShowMessage("我说:" + txtSendMessage.Text + "\r\n");
}
} private void btnConnection_Click(object sender, EventArgs e)
{
if (btnConnection.Text == "连接服务")
{
Connection();
}
else
{
newClient.Close();
}
} private void FormClient_Load( object sender, EventArgs e )
{ } }
Server
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Thread myThread;//声明一个线程实例
public Socket newSocket;//声明一个Socket实例
public Socket serverSocket;//声明服务端Socket实例
public Socket clientSocket;//声明客户端Socket
public delegate void MyInvoke(string str);//声明一个委托
public IPEndPoint localEP;//声明本地网络端点
public EndPoint remote;//声明网络地址
public int localPort;//声明本地端口号
public Boolean isListening;//声明服务端是否监听
public Hashtable _sessionTable;//用于记录用户信息
public bool btnState=true;
//设置服务端监听的端口号属性
public int SetPort
{
get { return localPort; }
set { localPort = value; }
}
//设置监听
public void Listening()
{
SetPort = int.Parse(txtPort.Text.Trim());//设置端口号
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化Socket实例
newSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);//允许Socket被绑定在已使用的地址上
localEP = new IPEndPoint(IPAddress.Any, SetPort);//初始化网络端点信息
try
{
_sessionTable = new Hashtable( );
newSocket.Bind(localEP);//绑定端口
newSocket.Listen();//开始监听
newSocket.BeginAccept(new AsyncCallback(OnConnectRequest),newSocket);//开始异步接受连接
}
catch(Exception ex)
{
ShowMessage(ex.ToString());
} }
private void btnStartServer_Click(object sender, EventArgs e)
{
ThreadStart myThreadDelegate = new ThreadStart(Listening);//新建一个线程用于委托
myThread = new Thread(myThreadDelegate);
if (btnState)
{
myThread.Start();
stateBar.Text = "服务已经启动,等待客户端连接";
btnState = false;
btnStartServer.Text = "停止服务";
}
else
{
myThread.Interrupt();
myThread.Abort();
btnState = true;
btnStartServer.Text = "开始服务";
stateBar.Text = "服务已停止";
}
}
//显示信息
public void ShowMessage(string msg)
{
if (rtbMessage.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(ShowMessage);
rtbMessage.Invoke(myInvoke, new object[] { msg });
}
else
{
rtbMessage.AppendText(msg);
}
}
public void OnConnectRequest(IAsyncResult ar)
{
serverSocket = (Socket)ar.AsyncState;
clientSocket = serverSocket.EndAccept(ar);//异步接收连接
string welcomeStr = "欢迎登陆到服务器";
byte[] data = System.Text.Encoding.UTF8.GetBytes(welcomeStr);
remote = clientSocket.RemoteEndPoint;//获取远程终点信息
ShowMessage(remote.ToString()+" 连接成功 "+DateTime.Now.ToString()+"\r\n");
clientSocket.Send(data,data.Length,);
UserListOperate(clientSocket.RemoteEndPoint.ToString());
_sessionTable.Add(clientSocket.RemoteEndPoint,null);//将连接成功的客户端实例添加到哈希表中
serverSocket.BeginAccept(new AsyncCallback(OnConnectRequest), serverSocket);//等待新的客户端连接
//接收数据
ReceiveMessage();
}
//接收数据
public void ReceiveMessage ()
{
while (true)
{
byte[]data=new byte[];
int recv = clientSocket.Receive( data );
string message = Encoding.UTF8.GetString(data,,recv);
ShowMessage(clientSocket.RemoteEndPoint.ToString()+":"+message+"\r\n");
}
}
//添加用户列表
public void UserListOperate(string msg)
{
//在线程里以安全的方式调用控件
if (lbUserList.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(UserListOperate);
lblUserList.Invoke(myInvoke, new object[] { msg });
}
else
{
lbUserList.Items.Add(msg);
}
}
//删除用户列表
public void UserListOperateRemove(string msg)
{
if (lbUserList.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(UserListOperateRemove);
lbUserList.Invoke(myInvoke, new object[] { msg });
}
else
{
lbUserList.Items.Remove(msg);
}
}
//发送广播
public void BroadCast()
{
string strMessage = txtMessage.Text;
Byte[] data = Encoding.UTF8.GetBytes(strMessage);
foreach (DictionaryEntry item in _sessionTable)
{
EndPoint temp = (EndPoint)item.Key;
clientSocket.SendTo(data, temp);
ShowMessage("我:"+strMessage+"\r\n");
}
txtMessage.Text = "";
}
private void Form1_Load(object sender, EventArgs e)
{
//获取本机IP
IPAddress[] ip = Dns.GetHostByName( Dns.GetHostName() ).AddressList;
lblIP.Text+=ip[].ToString();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//窗体关闭时判断线程是否为空
if (myThread != null)
{
myThread.Abort();
}
throw new Exception();
} private void btnSend_Click(object sender, EventArgs e)
{
BroadCast();
}
}
如有不当之处,烦请指教。
C#网络编程简单实现通信小例子-2的更多相关文章
- C#网络编程简单实现通信小例子-1
1.主界面 2.源程序 Send public partial class formUdpSend : Form { //声明一个UdpClient对象 UdpClient udpClient; pu ...
- 网络编程 单纯UDP通信
网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...
- Socket网络编程--简单Web服务器(6)
本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息 ...
- java即时通信小例子
学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...
- 《UNIX网络编程》TCP客户端服务器例子
最近在看<UNIX网络编程>(简称unp)和<Linux程序设计>,对于unp中第一个获取服务器时间的例子,实践起来总是有点头痛的,因为作者将声明全部包含在了unp.h里,导致 ...
- Linux网络编程简单示例
linux 网络编程是通过socket(套接字)接口实现,Socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭& ...
- Java入门网络编程-使用UDP通信
程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...
- JAVA基础知识之网络编程——-基于TCP通信的简单聊天室
下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...
随机推荐
- mysql由于外键关联无法删除数据
在mysql中删除一张表时候,出现 Error No. 1451 Cannot delete or update a parent row: a foreign key constraint fail ...
- CF Watto and Mechanism (字典树+深搜)
Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- 开源IDE CodeBlocks的下载安装、配置、简单编程
如果没有集成开发环境(IDE),在linux下开发程序将非常繁琐,IDE是指将编辑.编译.调试等功能集成在一个桌面环境上,这样就大大方便了用户.IDE一般包括代码编辑器.编译器.调试器和图形界面用户工 ...
- JVM 垃圾回收 Minor gc vs Major gc vs Full gc
关于垃圾回收机制及比较请参见:http://colobu.com/2015/04/07/minor-gc-vs-major-gc-vs-full-gc/ http://colobu.com/2014/ ...
- Delphi 获取进程路径及命令行参数
Delphi 获取进程路径及命令行参数, 但有的进程获取时会报错,不知为啥 type PVOID64 = UINT64; _UNICODE_STRING = packed record Length ...
- 【Cocos2d入门教程七】三分钟看懂Cocos2d坐标系
无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥搞头了.所以玩cocos2d,一上来就需要先把各种与坐标有关的东西搞清楚. 1.OpenGL坐标系 Cocos2d-x使用的是O ...
- Sqlserver中关于锁
大多数数据库需要同时处理多个查询,这些查询并不会像车等待红绿灯排队等待,而是会寻找最短的路径执行,因此需要一个红绿灯进行约束,这个红绿灯就是锁 理论上所有的事务之间应该是完全隔离的,但是事实上隔离的成 ...
- SQL Server查看表信息
1. sp_spaceused 计算数据和索引使用的磁盘空间量以及当前数据库中的表所使用的磁盘空间量.如果没有给定 objname,sp_spaceused 则报告整个当前数据库所使用的空间. 语法 ...
- 实例介绍Cocos2d-x物理引擎:使用关节
在游戏中我们可以通过关节约束两个物体的运动.我们通过一个距离关节实例,介绍一下如何在使用关节. 这个实例的运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点和附近生成 ...
- js 验证电话号 座机及手机号
function CheckTel() { /*验证电话号码 验证规则:区号+号码,区号以0开头,3位或4位号码由7位或8位数字组成 区号与号码之间可以无连接符,也可以“-”连接 如010888888 ...