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写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...
随机推荐
- 视频播放-VideoVIew,Vitamio
播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView类来实现的.这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器.VideoView的用法和 Med ...
- linux高可用集群(HA)原理详解(转载)
一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个 节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务.高可用 ...
- [改善Java代码]警惕数组的浅拷贝
建议62:警惕数组的浅拷贝 一.分析 在日常工作中,我们会遇见很多数组的拷贝和复制的问题,但是在你使用系统提供的API进行编码的时候,无形中会留下浅拷贝的隐患. 二.场景 有这样一个例子,第一个箱 ...
- 关于Java获取系统信息
本文部分转载自: http://www.cnblogs.com/wuhenke/archive/2011/11/19/2255400.html 我总结的相关类似博客:http://www.cnblog ...
- CSE(Corrupted State Exceptions) 严重异常处理办法
原因分析 出现这个问题说明.NET版本至少是4.0,因为微软在.NET 4.0版本中更改了异常处理机制.微软认为catch(Exception)这种写法是不负责任的,程序员应该按照异常严重类别决定程序 ...
- 只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render();
只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called durin ...
- 【Cocos2d入门教程五】Cocos2d-x动作篇
动作类(Action)是所有动作的基类,它创建的一个对象代表一个动作.动作作用于Node,包括继承于之下的Layer.Sprite.因此每个动作 都需要由Node对象或者其继承者执行.动作类(Acti ...
- 把CheckedListBoxControl设置为单选框
private void chkControl_ItemChecking(object sender, DevExpress.XtraEditors.Controls.ItemCheckingEven ...
- 剑指offer_面试题11 数值的整数次方_考察代码的完整性
测试通过代码: package t0825; public class Power { public static void main(String[] args){ System.out.print ...
- SQL server 2008 安装问题解决
安装sqlserver2008 出现的一些问题解决方法 1,安装sqlserver的时候出现如下图所示,解决办法是:开始→运行→输入“regedit”→找到“HKEY_LOCAL_MACHINE\SY ...