socket网络编程
作者:互联网
Internet网络采用的协议是Tcp/IP协议,Tcp协议是一种以固接连线为基础的协议,可提供两台计算机间可靠的数据传送,称为“传输控制协议”。UDP协议是无连接通信协议,不保证可靠的数据传输,但能向若干个目标发送数据,接收发自若干个源的数据。
端口及套接字
网络程序设计中的端口(Port)并非真实的物理存在,而是一个假象的连接装置。端口被规定为一个在0-65535之间的整数,而HTTP服务一般使用80端口,FTP服务使用21端口,IIS使用25端口,MySql使用3306端口。假如一台计算机提供了HTTP、FTP等多种服务,则客户机将通过不同的端口来确定连接到服务器的哪项服务上。
注意:0-1023之间的端口号通常用于一些比较知名的网络服务和应用,普通网络应用程序则应使用1024以上的端口号。
网络程序中的套接字(Socket)用于将程序与网络连接起来。套接字是一个假想的连接装置,就像用于连接电器与电线的插座。C#将套接字抽象为类,程序设计者只需要创建Socket类对象,即可使用套接字。
IP地址封装
IP地址是一种低级协议,TCP协议和DUP协议都是在他的基础上构建。
C#提供了IP地址相关的类,包括Dns类,IPAddress类、IPHostEntry类等。位于sysytem.NET命名空间。
访问本地主机名称和ip地址
string IP, name, localip = "10.15.0.85/24";
string localname = Dns.GetHostName();
IPAddress[] ips = Dns.GetHostAddresses(localname);
foreach (IPAddress ip in ips)
{
if (!ip.IsIPv6SiteLocal)
localip = ip.ToString();
}
label1.Text += "本机名" + localname + " 本机IP地址: " + localip;
TCP程序设计
TCP传输控制协议是一种面向连接的、可靠的,基于字节流的传输层通信协议。在C#中,TCP程序设计是指利用Socket、TcpClient和TcpListener类编写的网络通信程序,这3个类都位于system.net。sockets命名空间。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器端程序,另一个称为客户端程序。
Socket类为网络通信提供了一套丰富的方法和属性,TCPClient和UDPClient等类在内部使用该类
TcpClient类用于在同步阻止模式下通过网络来连接、发送和接收流数据。
为使TcpClient连接并交换数据,TcpClient类或Socket实例必须侦听是否有传入的连接请求。
TCP程序实例:客户端和服务器端的交互
1.服务器端:在Main方法中创建TCP连接对象;然后监听客户端接入,并读取接入的客户端IP地址和传入的消息;
static void Main(string[] args)
{
int port = 888; //端口
TcpClient tcpClient; //创建TCP连接对象
IPAddress[] serverIP = Dns.GetHostAddresses("127.0.0.1");//定义IP地址 fe80::2138:d3d0:f56:d209%11
IPAddress loacalADDress = serverIP[0]; //IP地址
TcpListener tcpListener = new TcpListener(loacalADDress, port);//监听套接字
tcpListener.Start(); //开始监听
Console.WriteLine("服务器启动成功,等待用户接入...");
while (true)
{
try
{
tcpClient = tcpListener.AcceptTcpClient();//每接收到一个客户端则生成一个TCPClient
NetworkStream networkStream = tcpClient.GetStream();//获取网络数据流
BinaryReader reader = new BinaryReader(networkStream);//定义流数据读取对象
BinaryWriter writer = new BinaryWriter(networkStream);//定义流数据写入对象
while (true)
{
try
{
string strReader = reader.ReadString();//接收消息
string [] strReaders = strReader.Split(new char[]{ ' ' });//截取客户端消息
Console.WriteLine("有客户端接入,客户IP:" + strReaders[0]);
Console.WriteLine("来自客户端的消息:" + strReaders[1]);
string strWriter = "我是服务器,欢迎光临";
writer.Write(strWriter);//向对方发送消息
}
catch
{
break;
}
}
}
catch
{
break;
}
}
}
2.客户端
在Main方法中创建TCP连接对象,以指定的地址和端口连接服务器;然后向服务器端发送数据和接收服务器端传输的数据。
static void Main(string[] args)
{
//创建一个TCPClient对象,自动分配IP地址和端口号
TcpClient tcpClient = new TcpClient();
//连接服务器,其IP端口号为127.0.0.1和888
tcpClient.Connect("127.0.0.1",888);
//判断连接是否成功
if (tcpClient != null)
{
Console.WriteLine("服务器连接成功");
NetworkStream networkStream = tcpClient.GetStream();//获取数据流
BinaryReader reader = new BinaryReader(networkStream);//定义流数据读取对象
BinaryWriter writer = new BinaryWriter(networkStream);//第一数据流写对象
string localip = "127.0.0.1";//存储本机ip,默认值为127.0.0.1
IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());//获取所有ip地址
foreach (IPAddress ip in ips)
{
if (!ip.IsIPv6SiteLocal)//如果不是ipv6地址
localip = ip.ToString();//获取本机ip地址
}
writer.Write(localip+" 你好服务器,我是客户端");//向服务器发送数据
while (true)
{
try
{
string strReader = reader.ReadString();//接收服务器发送的数据
if (strReader != null)
{
Console.WriteLine("来自服务器的消息是:"+strReader);
}
}
catch
{
break;
}
}
}
Console.WriteLine("连接服务器失败");
}
UDP程序设计
用户数据报协议,它是网络信息传输的另一种形式。UDP通信和TCP通信不同,基于UDP的信息传输更快,但不提供可靠的保证。
UdpClient类用于在同步阻止模式下发送和接收无连接的UDP数据报。因为UDP是无连接传输协议,所以不需要再发送和接收数据前建立远程主机连接,但可以选择使用下面两种方法之一建立默认远程主机。
1.使用远程主机名和端口号作为参数创建UdpClient类的实例。
2.创建UdpClient类的实例,然后调用Connect方法。
UDP网络程序实例,广播数据报程序
(1)创建广播主机项目Server,在Main方法中创建DUP连接;然后通过DUP不断向外发送广播信息。
class Program
{
static UdpClient udp = new UdpClient();//创建UdpClient对象
static void Main(string[] args)
{
udp.Connect("127.0.0.1", 888);//调用UdpClient对象的Connect方法建立默认远程主机
while (true)
{
Thread thread = new Thread(new ThreadStart(Way1));
thread.Start();
}
}
static public void Way1()
{
while (true)
{
try
{
Byte[] sendBytes = Encoding.Default.GetBytes("(" + DateTime.Now.ToLongTimeString() + ")节目预报:8点有大型晚会,请收听");//定义一个字节数组,用来存放发送到远程主机的信息
Console.WriteLine("(" + DateTime.Now.ToLongTimeString() + ")节目预报:8点有大型晚会,请收听");
udp.Send(sendBytes, sendBytes.Length);//调用UdpClient对象的Send方法将UDP数据发送到远程主机上
Thread.Sleep(5000);
}
catch (Exception EX)
{
Console.WriteLine(EX.Message);
}
}
}
}
(2)创建接收广播项目Client,单击“开始接收”按钮,系统开始接收主机播出的信息;单击“停止接收”按钮,系统会停止接收广播播出的信息。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;//在其他线程中可以调用主窗体控件
}
bool flag=true;
UdpClient udp;
Thread thread;
IPEndPoint ipendpoint;
private void button1_Click(object sender, EventArgs e)
{
udp = new UdpClient(888);//使用端口号创建UDP连接对象
flag = true;
ipendpoint = new IPEndPoint(IPAddress.Any, 888);//创建IPEndPoint对象,用来响应主机的标识
// Thread thread = new Thread(new ThreadStart(Way2));
thread = new Thread(Way2);
thread.Start();
}
public void Way2()
{
while (flag)
{
try
{
if (udp.Available <= 0) continue;//判断是否有网络数据;遇到continue后,不执行continue后面的代码,执行下一次循环。
if (udp.Client == null) return;//判断连接是否为空、// return 直接跳过main函数,立即结束本次方法的执行
byte[] bytes = udp.Receive(ref ipendpoint);
//将获得的UDP数据转换为字符串形式
string str = Encoding.Default.GetString(bytes);
textBox2.Text = "正在接收的信息:"+str;
textBox1.Text += "\n" + str;//显示接收的所有数据
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Thread.Sleep(2000);
}
}
private void button2_Click(object sender, EventArgs e)
{
flag = false;
if (thread.ThreadState == ThreadState.Running)
thread.Abort();
udp.Close();
}
}
标签:socket,ip,UdpClient,编程,网络,TCP,new,连接,string 来源: https://blog.csdn.net/weixin_42974146/article/details/88382615