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写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...
随机推荐
- 线程2 NSOperation 抽像类的使用
// // ZYOperationViewController.h // Thread // // Created by yejiong on 14 // // ZYOperation.h // Th ...
- javaweb学习总结十八(软件密码学、配置tomcat的https连接器以及tomcat管理平台)
一:软件密码学 1:对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key).对称加密有很多种算法,由于它效 ...
- Samba服务详解
Samba文件服务器 本章结构 服务简介 SMB协议 Server Message Block,服务消息块 CIFS协议 Common Internet File System,通用互联网文件系统 S ...
- JDK的安装
安装jdk解压拷贝过来的jdk(1.6版本)压缩包 cd /usr/local/tar xzvf /tmp/jdk.tgz 修改环境变量vi /etc/profile 加入如下内容export JAV ...
- Mysql学习笔记之常用数据类型 (转)
http://www.cnblogs.com/doit8791/archive/2012/05/11/2495319.html 数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则.My ...
- 【补】【FZU月赛】【20150515】【待续】
A FZU-2054 水题,比较A,B双方的最大值即可. B FZU-2055 string,截取‘.’之前和之后然后和给出的文件夹名和拓展名比较就好了啊,不明白为什么那么多人错. 代码: #incl ...
- 关于Merge的整理--Merge的使用方法和注意事项的Demo
上一篇文章中讲到了Merge的用法和注意事项,所以本人就想,做了一个Demo进行验证下. 一.Merge的使用 (1)activity中的onCreate方法中的setContentView(R.la ...
- ss 如何解决margin-top使父元素margin失效
给子元素设置margin-top的时候父元素的也会受影响.会产生子元素和父元素margin合并的问题. 解决办法: 给父元素设置padding.或者border把父子的margin之间隔开. 一般来说 ...
- ASP判断当前页面上是否有参数ID传递过来
遇到了一个这样的ASP问题: 在当前页面上判断,是否有参数ID传递过来? 如果没有,显示“没有参数传递过来”. 如果有传递,但值为空,显示“存在参数,但参数为空” <% if (request( ...
- 安装安卓模拟器和unity3d插件EZGUI
一.安装安卓模拟器 1.下载安卓模拟器http://www.pc6.com/softview/SoftView_64923.html: 2.安装安卓模拟器. 3.下载安卓apk,然后右键用BlueSt ...