C# Socket基本编程一

C# Socket基本编程一

 

同步字符串的服务端与客户端通信

客户端:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Net.Sockets;

namespace Client

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Client running...");

            TcpClient myTcpClient ;

            for (int i = 0; i < 2; i++)

            {

                myTcpClient = new TcpClient();

                try

                {

                    myTcpClient.Connect("localhost", 8500);

                }

                catch (System.Exception ex)

                {

                    Console.WriteLine(ex.Message);

                }

                Console.WriteLine("Server Connect!{0}-->{1}", myTcpClient.Client.LocalEndPoint, myTcpClient.Client.RemoteEndPoint);//前者为本机端口,后者为服务器端口

                string msg = Console.ReadLine();

                NetworkStream streamtoServer = myTcpClient.GetStream();

                byte[] buffer = Encoding.Unicode.GetBytes(msg);        //将信息打包

                streamtoServer.Write(buffer, 0, buffer.Length); //将信息写入网络流

                Console.WriteLine("Sent:{0}",msg);

            }

            Console.ReadLine();

        }

    }

}

         分析上面的程序:首先定义一个“为TCP网络服务提供客户端连接”的TCPClient类的对象,这样客户端才能进行连接。然后进入循环(因为是多个客户端连接)。TcpClient类的Connect函数的参数包括(本地端口号,连接端端口号)。

         接下来的是向服务端输出文本的部分。NetworkStream 是提供用于网络访问的基本数据流类,以TcpClient的实例对象所返回的用于发送和接收的网络数据流进行NetworkStream进行初始化。然后将输入的文本转换成字节序列“byte[] buffer = Encoding.Unicode.GetBytes(msg);        //将信息打包”,然后这样才能将字节序列写入网络数据流。

streamtoServer.Write(buffer, 0, buffer.Length); //将信息写入网络流

这个函数的参数表对应是字节序列,所读取字节的起始位置,字节长度。

 

服务端:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Net.Sockets;

using System.IO;

namespace server

{

    class Program

    {

        static void Main(string[] args)

       {

            Console.WriteLine("Server is running....");

            const int bufferside = 8192;

            IPAddress myIp=new IPAddress(new byte[]{127,0,0,1});       //127.0.0.1是本机的IP

            TcpListener myTcpListener = new TcpListener(myIp, 8500);

            myTcpListener.Start();    //侦听可用连接

            Console.WriteLine("Start Listening...");

            while (true)

            {

                TcpClient remoteclient = myTcpListener.AcceptTcpClient();      //?获取一个链接?

                Console.WriteLine("client connect!{0}<-{1}", remoteclient.Client.LocalEndPoint, remoteclient.Client.RemoteEndPoint);

 

                NetworkStream streamToClient = remoteclient.GetStream();

                byte[] buffer = new byte[bufferside];

                int bytesRead = streamToClient.Read(buffer, 0, bufferside);

                Console.WriteLine("Reading data,{0}byte...", bytesRead);

                string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);         //解码传输数据

                Console.WriteLine("Received:{0}", msg);

            }

            Console.ReadLine();

        }

 

    }

}

 

     分析上面的程序:首先定义本机,即服务端的地址,然后再以服务端IP和服务端端口号为参数实例化一个网络侦听的对象TcpListener(从TCP客户端侦听连接),TcpListener类的Start()函数说明这个类的对象开始侦听连接。

    在循环中,“TcpClient remoteclient = myTcpListener.AcceptTcpClient();”这一句以TcpListener所侦听得到的一个连接初始化一个客户端对象,然后以侦听到的客户端的网络数据流初始化一个数据流对象。接着用这个数据流对象的Read函数读取流中的数据(这个时候仍然是字节形式的)。然后再调用Encoding.Unicode.GetString(buffer, 0, bytesRead)获取流中字符串。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值