Socket简单学习之Tcp通信

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();

猜你喜欢

转载自www.cnblogs.com/zhangyang4674/p/11406407.html