c#的网络编程比较简单,有相关的类来实现相关的功能。
本小程序是<<c#网络编程>>里面的。
基本的类介绍
tcpClient
TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。
为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener 或 Socket 必须侦听是否有传入的连接请求。 可以使用下面两种方法之一连接到该侦听器:
创建一个 TcpClient,并调用三个可用的 Connect 方法之一。
使用远程主机的主机名和端口号创建 TcpClient。 此构造函数将自动尝试一个连接。
tcpListener
TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。 可使用 TcpClient 或 Socket 来连接 TcpListener。 可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。 可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。 如果您选择这样做,可在连接套接字后使用 LocalEndpoint 属性来标识已指定的信息。
使用 Start 方法,可开始侦听传入的连接请求。 Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。 可使用 AcceptSocket 或 AcceptTcpClient 从传入连接请求队列提取连接。 这两种方法将阻止。 如果要避免阻止,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。
调用 Stop 方法来关闭 TcpListener。
还需要理解线程,委托和事件。
服务器端
有一个listener类来监听,Sender类来发送消息。
listener类关键代码
private void Listen()
{
try
{
IPAddress addr = IPAddress.Parse(Form1.ipaddress);
IPEndPoint ipLocalEndPoint = new IPEndPoint(addr, 5656);//服务器端需要使用endpoint
tcp1 = new TcpListener(ipLocalEndPoint);
tcp1.Start();
while(listenerRun)//开始进行监听
{
Socket s = tcp1.AcceptSocket();
string remote = s.RemoteEndPoint.ToString();
Byte[] stream = new Byte[1024];
int i = s.Receive(stream);
string msg;
string str = System.Text.Encoding.UTF8.GetString(stream);
//MessageBox.Show(str);
if(str.Substring(0,1) == "1")
{
string str_ = "欢迎登陆!";
TcpClient tcpc = new TcpClient(((IPEndPoint)s.RemoteEndPoint).Address.ToString(), 5657);
NetworkStream tcpStream = tcpc.GetStream();
Byte[] data = System.Text.Encoding.UTF8.GetBytes(str_);//将字符串转为byte
tcpStream.Write(data, 0, data.Length);
tcpc.Close();
msg = "<" + remote + ">" + "上线";
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
}
else if(str.Substring(0,1)=="0")
{
msg = "<" + remote + ">" + "断开";
AddMessageEventArgs argRe = new AddMessageEventArgs();
argRe.mess = remote.ToString();
OnIpRemod(this, argRe);
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
}
else
{
msg = "<" + remote + ">" + System.Text.UTF8Encoding.UTF8.GetString(stream);
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
}
}
}
sender关键代码
public void Send(string str)//需要发送的字符串
{
try
{
TcpClient tcpc = new TcpClient(obj, 5657);
NetworkStream tcpStream = tcpc.GetStream();
Byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
tcpStream.Write(data, 0, data.Length);
tcpStream.Close();
}
catch(Exception)
{
MessageBox.Show("连接被目标主机拒绝");
}
}
客户端
listener类关键代码
private void Listen()
{
try
{
IPAddress addr = IPAddress.Parse(Form1.ipaddress);
IPEndPoint ipLocalEndPoint = new IPEndPoint(addr, 5657);
tcp1 = new TcpListener(ipLocalEndPoint);
tcp1.Start();
while(listenerRun)
{
Socket s = tcp1.AcceptSocket();
string remote = s.RemoteEndPoint.ToString();
Byte[] stream = new Byte[1024];
int i = s.Receive(stream);
string msg = "<" + remote + ">" + System.Text.UTF8Encoding.UTF8.GetString(stream);
AddMessageEventArgs arg = new AddMessageEventArgs();
arg.mess = msg;
OnAddMessage(this, arg);
// MessageBox.Show(msg);
}
}
catch(System.Security.SecurityException)
{
MessageBox.Show("防火墙禁止连接");
}
catch(Exception)
{
MessageBox.Show("监听已经停止");
}
}
}
提供文件下载
链接: http://pan.baidu.com/s/1skYeq6L 密码: 93yg
网友评论