• 20193327《Python程序设计》实验报告三


    (三)实验报告

    在规定时间前发表博客,标题“学号 实验三《Python程序设计》实验报告”

     学号 20193327 《Python程序设计》实验三报告

    课程:《Python程序设计》
    班级:1933
    姓名: 王筱
    学号:20193327
    实验教师:王志强
    实验日期:2020年7月6日
    必修/选修: 公选课

     1.实验内容:创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。


     2. 实验过程及结果
    private string _ip;//IP
    private int _port;//端口
    //客户端集合
    public static List<TcpClientModel> clients = new List<TcpClientModel>
    private static byte[] bytes = new byte[1024 * 100];
    /// <summary>
    /// 用于存储客户端
    /// </summary>
    public class TcpClientModel
    {
    /// <summary>
    /// IP:Port
    /// </summary>
    public string RemoteEndPoint { get; set; }
    /// <summary>
    /// 客户端链接对象
    /// </summary>
    public TcpClient TcpClient { get; set; }
    }
    启动监听:
    ///启动监听
    void Init()
    {
    try
    {
    IPAddress ip = IPAddress.Parse(_ip);
    int port = _port;
    TcpListener listener = new TcpListener(ip, port);
    //启动监听
    listener.Start();
    tb_console.AppendText($"Listener... ");
    //异步接收 递归循环接收多个客户端
    listener.BeginAcceptTcpClient(new AsyncCallback(GetAcceptTcpclient), listener);
    }
    catch (Exception ex)
    {
    }
    }
    接收客户端:
    private void GetAcceptTcpclient(IAsyncResult State)
    {
    //处理多个客户端接入
        TcpListener listener = (TcpListener)State.AsyncState;
    //接收到客户端请求
    TcpClient client = listener.EndAcceptTcpClient(State);
    //保存到客户端集合中
    clients.Add(new TcpClientModel() { TcpClient = client, RemoteEndPoint = client.Client.RemoteEndPoint.ToString() });
        //开启线程用来持续接收来自客户端的数据
    Thread myThread = new Thread(() =>
    {
    ReceiveMsgFromClient(client);
    });
    myThread.Start();
    listener.BeginAcceptTcpClient(new AsyncCallback(GetAcceptTcpclient), listener);
    }
    接收消息并响应客户端:
    private void ReceiveMsgFromClient(object reciveClient)
    {
    TcpClient client = reciveClient as TcpClient;
    if (client == null)
    {
    return;
    }
    while (true)
    {
    try
    {
    NetworkStream stream = client.GetStream();
    int num = stream.Read(bytes, 0, bytes.Length); //将数据读到result中,并返回字符长度                  
                if (num != 0)
    {
    //把字节数组中流存储的数据以字符串方式赋值给str
    //这里就是接收到的客户端消息
    string str = Encoding.UTF8.GetString(bytes, 0, num);
                   //给客户端返回一个消息
                    string msg = "Your message has been received by the server[" + str + "]";
    bool result = TCPHelper.SendToClient(client, msg, out msg);
    if (!result)
    {
    //发送失败
    }
    }
    else
    {  
    //这里需要注意 当num=0时表明客户端已经断开连接,需要结束循环,不然会死循环一直卡住
    break;
    }
    }
    catch (Exception ex)
    {
    //链接失败 从集合中移除出错客户端
    clients.Remove(clients.FirstOrDefault(m => m.RemoteEndPoint == client.Client.RemoteEndPoint.ToString()));
    break;
    }
    }
    }
    从服务器向客户端发送消息的工具类:
    public static class TCPHelper
    {
    public static bool SendToClient(TcpClient client, string message,out string errorMsg)
    {
    try
    {
    byte[] bytes = new byte[1024 * 100];
    bytes = Encoding.UTF8.GetBytes(message);
    NetworkStream stream = client.GetStream();
    stream.Write(bytes, 0, bytes.Length);
    stream.Flush();
    errorMsg = "";
    return true;
    }
    catch (Exception ex)
    {
    errorMsg = ex.Message;
    return false;
    }
    }
    }

     3. 实验过程中遇到的问题和解决过程
    - 问题1:加密
    - 问题1解决方案:转化为ascaii码加密



     其他(感悟、思考等)
    掌握的不太理想,要勤加练习。



    ## 参考资料

    -  [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)

    -  [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
    -  ...



    ## 2. 实验过程及结果
    此处填写实验的过程及结果

    ## 3. 实验过程中遇到的问题和解决过程
    - 问题1:XXXXXX
    - 问题1解决方案:XXXXXX
    - 问题2:XXXXXX
    - 问题2解决方案:XXXXXX
    - ...


    ## 其他(感悟、思考等)

    xxx
    xxx

    ## 参考资料

    -  [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)

    -  [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
    -  ...

  • 相关阅读:
    VMware vSphere 6 序列号
    linux中网络配置
    Linux 磁盘分区、挂载
    linux中crontab任务调度
    linux组管理和权限管理
    linux运行级别
    linux中vi和vim文件操作命令
    Linux-用户分组相关以及处理密码遗忘
    linux远程登入、远程上传文件
    llinux重启、用户切换、注销命令
  • 原文地址:https://www.cnblogs.com/wx131416/p/13255946.html
Copyright © 2020-2023  润新知