Socket网络通信的简单学习
建立Tcp通信
服务器端
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace TcpSocket { //服务器端 class Program { static void Main(string[] args) { Socket tcpSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//建立一个socket对象,用来网络通信 IPAddress ipaddress = new IPAddress(new byte[] { 192, 168, 43, 92 });//配置服务器的IP EndPoint point = new IPEndPoint(ipaddress, 5566);//配置服务器的IP和端口 tcpSocket.Bind(point);//服务器的这个ip和端口用来接受客户端的数据 tcpSocket.Listen(100);//设置服务器能连接的客户端的数量 Socket client = tcpSocket.Accept();//等待客户端来连接,将客户端的连接对象存在Client对象中,没有对象连接就一直等待不执行下面代码 byte[] date = new byte[1024];//定义一个二进制数组来存放客户端发送的数据 int length = client.Receive(date);//接受从客户端发送的二进制数据 string str = Encoding.UTF8.GetString(date, 0, length);//将二进制数据转化为字符串 Console.WriteLine(str);//显示出从客户端发送的数据 string message = "客户端已近连接服务器端了"; byte[] date1 = Encoding.UTF8.GetBytes(message); client.Send(date1);//把信息从服务器端传到客户端 while (true)//循环接收从客户端发送的数据,显示出来,并向客户端发送数据 { byte[] date2 = new byte[1024];//存放二进制的数据 int length2 = client.Receive(date2);//接受从客户端发送的二进制数据 string str1 = Encoding.UTF8.GetString(date2, 0, length);//将二进制数据转化为字符串 Console.WriteLine("客户端发送的数据为:"+str1); byte[] date3 = Encoding.UTF8.GetBytes(str1); client.Send(date3);//把信息从服务器端传到客户端 } Console.ReadKey(); } } }
步骤:
1:声明Socket对象,利用构造函数给Socket对象传值,AddressFamily设置为局域网InterNetwork,socketType接受数据的类型设置为stream流,ProtocalType传输方式设置为Tcp可靠传输
Socket tcpSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//建立一个socket对象,用来网络通信
Socket的命名空间为using System.Net.Sockets;
2:利用Bind()方法给服务器端绑定服务器的IP和端口用来接收数据
Ipaddress 和EndPoint的命名空间为using System.Net
先将ip和端口绑定到EndPoint对象上
IpAddress address=new IpAddress(new char[]{IP地址})//绑定ip地址
EndPoint point=new IPEndPoint(address,端口号)//绑定ip地址和端口
tcpSocket.bind(point)//给服务器端绑定服务器的ip和端口号
IPAddress ipaddress = new IPAddress(new byte[] { 192, 168, 43, 92 });//配置服务器的IP EndPoint point = new IPEndPoint(ipaddress, 5566);//配置服务器的IP和端口 tcpSocket.Bind(point);//服务器的这个ip和端口用来接受客户端的数据
IpAddress address=new IpAddress(new char[]{IP地址})替换为
IPAddress ip = IPAddress.Parse("192.168.43.92");
IpAddress address=new IpAddress(new char[]{IP地址})//绑定ip地址
EndPoint point=new IPEndPoint(address,端口号)//绑定ip地址和端口
合并成一段
EndPoint point=new IpEndPoint(IPAddress.parse("IP"),端口号);
3:利用Listen()方法设置服务器最大连接的客户端的数目
tcpSocket.Listen(100);//设置服务器能连接的客户端的数量
4:利用accept()方法接受连接服务器的客户端的socket对象,只有接收到了客户端的对象代码才会继续往下执行
Socket client = tcpSocket.Accept();//等待客户端来连接,将客户端的连接对象存在Client对象中,没有对象连接就一直等待不执行下面代码
5:利用Send()方法向客户端发送数据,因为设置是以流的形式传输数据,所以数据要转化成二进制字节
string message = "客户端已近连接服务器端了"; byte[] date1 = Encoding.UTF8.GetBytes(message); client.Send(date1);//把信息从服务器端传到客户端
6:利用Receive()方法接收从客户端发送过来的数据,接收的数据是二进制的
byte[] date2 = new byte[1024];//存放二进制的数据 int length2 = client.Receive(date2);//接受从客户端发送的二进制数据 string str1 = Encoding.UTF8.GetString(date2, 0, length);//将二进制数据转化为字符串
客户端
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace TcpSocketClient { //客户端 class Program { static void Main(string[] args) { Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立一个socket对象,用来网络通信 IPAddress ipAdress = new IPAddress(new byte[] { 192, 168, 43, 92 });//配置服务器的IP EndPoint point = new IPEndPoint(ipAdress, 5566);//配置服务器的IP和端口 tcpSocket.Connect(point);//把客户端与服务器端建立连接 string str = "客户端请求与服务器建立连接"; byte[] ClientDate = Encoding.UTF8.GetBytes(str);//将要发送的数据转化为二进制 tcpSocket.Send(ClientDate);//向服务器发送二进制数据 byte[] date = new byte[1024];//定义一个二进制数组来存放服务器端返回的数据 int length = tcpSocket.Receive(date);//接收从服务器端接收的数据 string message = Encoding.UTF8.GetString(date, 0, length);//将接收到的二进制数据转化为字符串 Console.WriteLine(message); while(true)//循环的从客户端发送数据到服务器端,在接收从服务器端接收的数据 { string str1 = Console.ReadLine();//写入向服务器端发送的数据 byte[] ClientDate1 = Encoding.UTF8.GetBytes(str1);//将要发送的数据转化为二进制 tcpSocket.Send(ClientDate1);//向服务器发送二进制数据 byte[] date1 = new byte[1024];//定义一个二进制数组来存放服务器端返回的数据 int length1 = tcpSocket.Receive(date1);//接收从服务器端接收的数据 string message1 = Encoding.UTF8.GetString(date1, 0, length1);//将接收到的二进制数据转化为字符串 Console.WriteLine("从服务器端接收到的数据为:"+message1); } Console.ReadKey(); } } }
1:声明Socket对象
Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立一个socket对象,用来网络通信
2:绑定接收端的ip和端口,Socket先用IP找到服务器的地址,再通过端口向服务器传输数据
IPAddress ipAdress = new IPAddress(new byte[] { 192, 168, 43, 92 });//配置服务器的IP EndPoint point = new IPEndPoint(ipAdress, 5566);//配置服务器的IP和端口
3:利用Connect()方法去连接服务器端
tcpSocket.Connect(point);//把客户端与服务器端建立连接
4:利用Send()向服务器端发送数据
string str1 = Console.ReadLine();//写入向服务器端发送的数据 byte[] ClientDate1 = Encoding.UTF8.GetBytes(str1);//将要发送的数据转化为二进制 tcpSocket.Send(ClientDate1);//向服务器发送二进制数据
5:利用Receive()方法接收服务器端的数据
byte[] date1 = new byte[1024];//定义一个二进制数组来存放服务器端返回的数据 int length1 = tcpSocket.Receive(date1);//接收从服务器端接收的数据 string message1 = Encoding.UTF8.GetString(date1, 0, length1);//将接收到的二进制数据转化为字符串 Console.WriteLine("从服务器端接收到的数据为:"+message1);
我们可以使用Tcplistener类来代替socket类实现Tcp通信的服务器端的监听功能
Tcplistener的命名空间为using System.Net.Sockets
using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading.Tasks; namespace tcpClient { //服务器端 class Program { static void Main(string[] args) { TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Parse("192.168.43.92"), 5566));//设置好服务器的Ip和端口号 listener.Start();//开始监听客户端的连接 TcpClient client = listener.AcceptTcpClient();//获取连接服务器的客户端,获取到客户端后才执行下面的代码,一个AcceptTcpClient只能允许一个客户端连接 NetworkStream stream = client.GetStream();//用网络流来传输二进制数据 byte[] date = new byte[1024]; int length = stream.Read(date, 0, 1024);//读取网络流中的二进制数据,放入date二进制数组中,从date下标为0开始放,一次放1024个字节,网络流中数据不足1024就按实际情况放 string str = Encoding.UTF8.GetString(date, 0, date.Length); Console.WriteLine(str);//打印出客户端传入的数据 string str1 = "已连接服务器端"; byte[] date1 = Encoding.UTF8.GetBytes(str1); stream.Write(date1,0,date1.Length);//从服务器端返回数据到客户端 stream.Close();//关闭网络流 client.Close();//关闭客户端 Console.ReadKey(); } } }
1:利用TcpListener对象设置好服务器的ip地址和端口号
TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Parse("192.168.43.92"), 5566));//设置好服务器的Ip和端口号
2:TcpListener.start()开始监听客户端的连接
listener.Start();//开始监听客户端的连接
3:AcceptTcpClient()方法获取连接服务器的客户端
TcpClient client = listener.AcceptTcpClient();//获取连接服务器的客户端,获取到客户端后才执行下面的代码,一个AcceptTcpClient只能允许一个客户端连接
4:利用NetWorkStream网络流来传输数据
NetworkStream stream = client.GetStream();//用网络流来传输二进制数据
5:stream.read()从网络流中读取传入的二进制字节
byte[] date = new byte[1024]; int length = stream.Read(date, 0, 1024);//读取网络流中的二进制数据,放入date二进制数组中,从date下标为0开始放,一次放1024个字节,网络流中数据不足1024就按实际情况放 string str = Encoding.UTF8.GetString(date, 0, date.Length);
6:stream.write()向网络流中写入数据,用read方法去读取写入的二进制字节
string str1 = "已连接服务器端"; byte[] date1 = Encoding.UTF8.GetBytes(str1); stream.Write(date1,0,date1.Length);//从服务器端返回数据到客户端
7:stream.close()关闭网络流 client.close()关闭客户端对象
stream.Close();//关闭网络流 client.Close();//关闭客户端
我们可以使用Tcpclient类来代替socket类实现Tcp通信的服务器端的监听功能
Tcpclient的命名空间为using System.Net.Sockets
using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading.Tasks; namespace TcpStudy { class Program { static void Main(string[] args) { TcpClient client = new TcpClient("192.168.43.92", 5566);//设置客户端要发送数据到服务器的地址和端口 NetworkStream stream = client.GetStream();//设置网络流进行数据交换 string str = "客户端请求连接服务器";//客户端的发送数据 byte[] date = Encoding.UTF8.GetBytes(str);//转化为二进制 stream.Write(date, 0, date.Length);//向服务器端发送数据 byte[] date1 = new byte[1024]; int length = stream.Read(date1, 0, 1024); string str1 = Encoding.UTF8.GetString(date1,0,length);//接收服务器端发送的数据 Console.WriteLine(str1); stream.close(); Client.close(); Console.ReadKey(); } } }
1:建立TcpClient对象,绑定数据发送到服务器的地址和端口
TcpClient client = new TcpClient("192.168.43.92", 5566);//设置客户端要发送数据到服务器的地址和端口
2:建立网络流传输数据 getStream()
NetworkStream stream = client.GetStream();//设置网络流进行数据交换
3:从网络流中读取数据
byte[] date1 = new byte[1024]; int length = stream.Read(date1, 0, 1024);
4:向网络流中发送数据
string str = "客户端请求连接服务器";//客户端的发送数据 byte[] date = Encoding.UTF8.GetBytes(str);//转化为二进制 stream.Write(date, 0, date.Length);//向服务器端发送数据
5:关闭网络流和客户端的连接
stream.close(); Client.close();
原文地址:https://www.cnblogs.com/zhangyang4674/p/11406407.html