C#网络编程简单实现通信小例子.docx
《C#网络编程简单实现通信小例子.docx》由会员分享,可在线阅读,更多相关《C#网络编程简单实现通信小例子.docx(17页珍藏版)》请在冰豆网上搜索。
C#网络编程简单实现通信小例子
1、主界面
2、源程序
Send
publicpartialclassformUdpSend:
Form
{
//声明一个UdpClient对象
UdpClientudpClient;
publicformUdpSend()
{
InitializeComponent();
//实例化UdpClient对象
udpClient=newUdpClient();
}
privatevoidbtnSend_Click(objectsender,EventArgse)
{
//获取发送信息
stringmessage=this.txtMessage.Text;
//获取发送数据
byte[]data=System.Text.Encoding.UTF8.GetBytes(message);
udpClient.Connect(IPAddress.Parse(this.txtIP.Text),12345);
udpClient.Send(data,data.Length);
this.txtMessage.Text="";
}
}
Receive
publicpartialclassformUdpReceive:
Form
{
UdpClientudpClient;
Threadthread;
publicformUdpReceive()
{
InitializeComponent();
//不捕获对错误线程的调用
CheckForIllegalCrossThreadCalls=false;
udpClient=newUdpClient(12345);
}
//设置监听
publicvoidListen()
{
IPEndPointiep=null;
while(true)
{
stringdata=System.Text.Encoding.UTF8.GetString(udpClient.Receive(refiep));
this.lbReceive.Items.Add(data);
}
}
privatevoidbtnReceive_Click(objectsender,EventArgse)
{
thread=newThread(newThreadStart(Listen));
thread.IsBackground=true;
thread.Start();
}
privatevoidformUdpReceive_Load(objectsender,EventArgse)
{
}
}
1、主界面
2、源代码
Client
publicpartialclassFormClient:
Form
{
//声明一个Socket
publicSocketnewClient;
//判断是否连接成功
publicboolisConnected;
//定义一个线程
publicThreadmyThread;
//定义一个委托
publicdelegatevoidMyInvoke(stringstr);
publicFormClient()
{
InitializeComponent();
}
privatevoidConnection()
{
//IPAddressip=null;
//intport=888;
byte[]data=newbyte[1024];
//创建一个新的Socket
newClient=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//获取IP地址
#regionGetIP
//if(txtIP.Text==string.Empty)
//{
//MessageBox.Show("远程IP不能为空");
//}
//else
//{
//stringpattrn=@"((?
:
(?
:
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
//获取端口号
#regionGetPort
//if(System.Text.RegularExpressions.Regex.IsMatch(@"^[-]?
\d+[.]?
\d*$",txtPort.Text.Trim()))
//{
//port=Convert.ToInt32(txtPort.Text.Trim());
//}
//else
//{
//MessageBox.Show("端口号格式不正确");
//}
#endregion
//封装网络端点
IPEndPointie=newIPEndPoint(IPAddress.Parse(txtIP.Text.Trim()),Convert.ToInt32(txtPort.Text.Trim()));
#regionConnection
try
{
//建立与远程主机之间的连接
newClient.Connect(ie);
//设置连接服务器控件的属性
//btnConnection.Enabled=false;
//设置连接状况
btnConnection.Text="停止连接";
//isConnected=true;
}
catch(SocketExceptionex)
{
MessageBox.Show("连接服务器失败"+ex.Message);
return;
}
#endregion
//启动当前线程用于接收消息
ThreadStartmyThreadDelegate=newThreadStart(ReceiveMessage);
myThread=newThread(myThreadDelegate);
myThread.Start();
}
///
///接收消息
///
publicvoidReceiveMessage()
{
while(true)
{
//定义字节数组大小
byte[]data=newbyte[1024];
//获取数组长度
intrecv=newClient.Receive(data);
//接收数据
stringstrData=Encoding.UTF8.GetString(data,0,recv);
//显示信息
ShowMessage(newClient.RemoteEndPoint.ToString()+":
"+strData+"\r\n");
}
}
///
///显示消息
///
///接收的消息,可能来自Client/也可能来自Server
publicvoidShowMessage(stringmsg)
{
//如果是在创建该控件以外的线程调用该控件
if(lbMessage.InvokeRequired)
{
MyInvokemyInvoke=newMyInvoke(ShowMessage);
//lbMessage.Invoke(myInvoke,newobject[]{msg});
lbMessage.Invoke(myInvoke,newobject[]{"远程主机:
"+msg});
}
else
{
lbMessage.Items.Add(msg);
}
}
privatevoidbtnSend_Click(objectsender,EventArgse)
{
if(txtSendMessage.Text==null)
{
txtSendMessage.Text="发送消息不能为空";
//停留1秒消失
}
else
{
//获取发送数据长度
intmyMessLength=txtSendMessage.Text.Length;
//将数据转换为字节数组
byte[]data=newbyte[myMessLength];
data=Encoding.UTF8.GetBytes(txtSendMessage.Text);
//发送数据
inti=newClient.Send(data);
//将数据显示在Client
ShowMessage("我说:
"+txtSendMessage.Text+"\r\n");
}
}
privatevoidbtnConnection_Click(objectsender,EventArgse)
{
if(btnConnection.Text=="连接服务")
{
Connection();
}
else
{
newClient.Close();
}
}
privatevoidFormClient_Load(objectsender,EventArgse)
{
}
}
Server
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
publicThreadmyThread;//声明一个线程实例
publicSocketnewSocket;//声明一个Socket实例
publicSocketserverSocket;//声明服务端Socket实例
publicSocketclientSocket;//声明客户端Socket
publicdelegatevoidMyInvoke(stringstr);//声明一个委托
publicIPEndPointlocalEP;//声明本地网络端点
publicEndPointremote;//声明网络地址
publicintlocalPort;//声明本地端口号
publicBooleanisListening;//声明服务端是否监听
publicHashtable_sessionTable;//用于记录用户信息
publicboolbtnState=true;
//设置服务端监听的端口号属性
publicintSetPort
{
get{returnlocalPort;}
set{localPort=value;}
}
//设置监听
publicvoidListening()
{
SetPort=int.Parse(txtPort.Text.Trim());//设置端口号
newSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//初始化Socket实例
newSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);//允许Socket被绑定在已使用的地址上
localEP=newIPEndPoint(IPAddress.Any,SetPort);//初始化网络端点信息
try
{
_sessionTable=newHashtable(50);
newSocket.Bind(localEP);//绑定端口
newSocket.Listen(10);//开始监听
newSocket.BeginAccept(newAsyncCallback(OnConnectRequest),newSocket);//开始异步接受连接
}
catch(Exceptionex)
{
ShowMessage(ex.ToString());
}
}
privatevoidbtnStartServer_Click(objectsender,EventArgse)
{
ThreadStartmyThreadDelegate=newThreadStart(Listening);//新建一个线程用于委托
myThread=newThread(myThreadDelegate);
if(btnState)
{
myThread.Start();
stateBar.Text="服务已经启动,等待客户端连接";
btnState=false;
btnStartServer.Text="停止服务";
}
else
{
myThread.Interrupt();
myThread.Abort();
btnState=true;
btnStartServer.Text="开始服务";
stateBar.Text="服务已停止";
}
}
//显示信息
publicvoidShowMessage(stringmsg)
{
if(rtbMessage.InvokeRequired)
{
MyInvokemyInvoke=newMyInvoke(ShowMessage);
rtbMessage.Invoke(myInvoke,newobject[]{msg});
}
else
{
rtbMessage.AppendText(msg);
}
}
publicvoidOnConnectRequest(IAsyncResultar)
{
serverSocket=(Socket)ar.AsyncState;
clientSocket=serverSocket.EndAccept(ar);//异步接收连接
stringwelcomeStr="欢迎登陆到服务器";
byte[]data=System.Text.Encoding.UTF8.GetBytes(welcomeStr);
remote=clientSocket.RemoteEndPoint;//获取远程终点信息
ShowMessage(remote.ToString()+"连接成功"+DateTime.Now.ToString()+"\r\n");
clientSocket.Send(data,data.Length,0);
UserListOperate(clientSocket.RemoteEndPoint.ToString());
_sessionTable.Add(clientSocket.RemoteEndPoint,null);//将连接成功的客户端实例添加到哈希表中
serverSocket.BeginAccept(newAsyncCallback(OnConnectRequest),serverSocket);//等待新的客户端连接
//接收数据
ReceiveMessage();
}
//接收数据
publicvoidReceiveMessage()
{
while(true)
{
byte[]data=newbyte[1024];
intrecv=clientSocket.Receive(data);
stringmessage=Encoding.UTF8.GetString(data,0,recv);
ShowMessage(clientSocket.RemoteEndPoint.ToString()+":
"+message+"\r\n");
}
}
//添加用户列表
publicvoidUserListOperate(stringmsg)
{
//在线程里以安全的方式调用控件
if(lbUserList.InvokeRequired)
{
MyInvokemyInvoke=newMyInvoke(UserListOperate);
lblUserList.Invoke(myInvoke,newobject[]{msg});
}
else
{
lbUserList.Items.Add(msg);
}
}
//删除用户列表
publicvoidUserListOperateRemove(stringmsg)
{
if(lbUserList.InvokeRequired)
{
MyInvokemyInvoke=newMyInvoke(UserListOperateRemove);
lbUserList.Invoke(myInvoke,newobject[]{msg});
}
else
{
lbUserList.Items.Remove(msg);
}
}
//发送广播
publicvoidBroadCast()
{
stringstrMessage=txtMessage.Text;
Byte[]data=Encoding.UTF8.GetBytes(strMessage);
foreach(DictionaryEntryitemin_sessionTable)
{
EndPointtemp=(EndPoint)item.Key;
clientSocket.SendTo(data,temp);
ShowMessage("我:
"+strMessage+"\r\n");
}
txtMessage.Text="";
}
privatevoidForm1_Load(objectsender,EventArgse)
{
//获取本机IP
IPAddress[]ip=Dns.GetHostByName(Dns.GetHostName()).AddressList;
lblIP.Text+=ip[0].ToString();
}
privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse)
{
//窗体关闭时判断线程是否为空
if(myThread!
=null)
{
myThread.Abort();
}
thrownewException();
}
privatevoidbtnSend_Click(objectsender,EventArgse)
{
BroadCast();
}
}
如有不当之处,烦请指教。