• TCP 传递信息


    什么是socket?

    Socket就是套接字。客户端与服务器之间通信用的。
    Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发
    TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。

    以下是试验代码:

    (vs2005/xp试验通过)

    一个服务器端与客户端交互,实现客户端与服务器端的传递信息。

    一个服务器端与两个客户端交互,实现客户端与服务器端的传递信息。

    两个服务器端与一个客户端交互,实现客户端与服务器端的传递信息。(第二个服务器报错)

    第三个失败主要是在本机上,没有试验是否在多台机子上是否成功。

    客户端代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 using System.Net.Sockets;
     5 using System.IO;
     6 //从字节数组中获取字符串时使用该命名空间中的类
     7 namespace ConsoleApplication3
     8 {
     9     //客户端
    10     class Program
    11     {
    12        //const 关键字用于修改字段或局部变量的声明。
    13        //它指定字段或局部变量的值是常数,不能被修改
    14         private const int portNum = 13;//服务器端口,可以随意修改 
    15         private const string hostName = "127.0.0.1";//服务器地址,127.0.0.1指本机 
    16       
    17         //由于很多COM在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,
    18         //而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,
    19         //这样就会导致不可预知的后果。
    20         [STAThread]
    21         static void Main(string[] args)
    22         {
    23             try
    24             {
    25                 Console.Write("我是客户端,我试着去连接主机 " + hostName + "端口号是:" + portNum.ToString() + "\r\n");
    26                //创建一个客户端
    27                 TcpClient client = new TcpClient(hostName, portNum);//客户端程序类的实现
    28                 
    29                 NetworkStream ns = client.GetStream();//获取数据流
    30                 
    31                 //
    32                    byte[] byteTime1 = Encoding.UTF32.GetBytes("我是客户器端");            
    33                
    34                     ns.Write(byteTime1,0, byteTime1.Length);
    35                 //
    36             
    37                 //注意,当使用主机名和端口号初始化TcpClient类的实例时,直到跟服务器建立了连接,
    38                 //个实例才算真正建立,程序才能往下执行。如果因为网络不通,服务器不存在,
    39                 //服务器端口未开放等等原因而不能连接,程序将抛出异常并且中断执行。
    40 
    41                 //建立数据流之后,我们可以使用NetworkStream类的Read()方法从流中读取数据,
    42                 //使用Write()方法向流中写入数据。读取数据时,首先应该建立一个缓冲区,
    43                 //具体的说,就是建立一个byte型的数组用来存放从流中读取的数据。Read()方法的原型描述如下:                
    44                
    45                 //读取流里面的数据
    46                 byte[] bytes = new byte[1024];
    47                 int bytesRead = ns.Read(bytes,0, bytes.Length);
    48                
    49                 Console.WriteLine(Encoding.UTF32.GetString(bytes, 0, bytesRead).ToString());
    50                 Console.WriteLine("获取数据流成功。。。");
    51                 client.Close();
    52                 Console.ReadLine();//由于是控制台程序,故为了清楚的看到结果,可以加上这句 
    53              
    54 
    55             }
    56             catch (Exception e)
    57             {
    58                 Console.WriteLine(e.ToString());
    59             }
    60         }
    61 
    62 
    63 
    64     }
    65 
    66 }
    67 

     

    //服务器端
     1 using System;
     2 using System.Net.Sockets;
     3 using System.Text;
     4 using System.Net;
     5 using System.IO;
     6 
     7 //服务器端
     8 namespace ConsoleApplication4
     9 {
    10     class Program
    11     {
    12         private const int portNum = 13;//端口号
    13 
    14         [STAThread]
    15         static void Main(string[] args)
    16         {
    17             bool done = false;
    18             // 首先我们使用端口初始化一个TcpListener实例,并且开始在13端口监听:
    19             TcpListener listener = new TcpListener(portNum);//监听客户端
    20             listener.Start();
    21             while (!done)//循环监听客户端
    22             {
    23                 //如果有未处理的连接请求,使用AcceptTcpClient方法进行处理,并且获取数据流:
    24                 Console.Write("我是服务器端,我在等待连接...");
    25                 TcpClient client = listener.AcceptTcpClient();
    26 
    27               // 然后,获取本机时间,并保存在字节数组中,使用NetworkStream.Write()方法写入数据流,
    28               //然后客户端就可以通过Read()方法从数据流中获取这段信息: 
    29                 Console.WriteLine("连接成功.");
    30                 NetworkStream ns = client.GetStream();
    31                
    32                 //获取客户端的数据
    33                 byte[] bytes = new byte[1024];
    34                 int bytesRead = ns.Read(bytes, 0, bytes.Length);
    35 
    36                 Console.WriteLine(Encoding.UTF32.GetString(bytes, 0, bytesRead).ToString());
    37                 Console.WriteLine("获取数据流成功。。。");
    38 
    39                 //
    40 
    41                 byte[] byteTime1 = Encoding.UTF32.GetBytes("我是服务器端");            
    42                 try
    43                 {
    44                     ns.Write(byteTime1,0, byteTime1.Length);//服务器端通过Write写到数据流里面
    45                     //------
    46                     //这时候客户端就可以从数据流里面读数据流
    47                     //----
    48                     //关闭流
    49                     ns.Close();
    50                     //
    51                   
    52                     client.Close();
    53                 }
    54                 catch (Exception e)
    55                 {
    56                     Console.WriteLine(e.ToString());
    57                 }
    58             }
    59 
    60             listener.Stop();
    61         }
    62 
    63 
    64 
    65     }
    66 }
    67 
  • 相关阅读:
    mysql导出csv文件
    httpclient设置proxy与proxyselector
    91删除数据
    使用RestTemplate post方式提交表单数据
    bootstrap获取总条目数
    获取字符串已utf-8表示的字节数
    mongo批量更新
    重庆大学计算机917考研分析(定期更新考研信息)
    卷积
    LaTeX中自定义enumerate的编号格式
  • 原文地址:https://www.cnblogs.com/muer/p/1737414.html
Copyright © 2020-2023  润新知