• TCP协议实现双工通信


    核心代码

    public TcpClient TcpClient;   // TCP连接     
            StreamReader ClientReader;  // 网络流 读数据
            StreamWriter ClientWriter;  // 网络流 写数据
            NetworkStream Stream; // 网络流
            Thread Thd;
    
            void GetMessage()  //  接收服务器传的数据
            {
                if (Stream != null && Stream.DataAvailable)
                {
                    rtxChatInfo.AppendText(DateTime.Now.ToString());
                    rtxChatInfo.AppendText(" 服务器说:
    ");
                    rtxChatInfo.AppendText(ClientReader.ReadLine() + "
    ");
                    //下拉框
                    rtxChatInfo.SelectionStart = rtxChatInfo.Text.Length;
                    rtxChatInfo.Focus();
                    rtxSendMessage.Focus();
                }          
            }
            void GetConn()   //  连接函数
            {
                CheckForIllegalCrossThreadCalls = false;
                while (true)
                {
                    try
                    {
                        var tex = txtServerIp.Text;
                        var par = int.Parse(txtPort.Text.Trim());
                        TcpClient = new TcpClient(txtServerIp.Text, int.Parse(txtPort.Text.Trim()));
                        Stream = TcpClient.GetStream();
                        ClientReader = new StreamReader(Stream);
                        ClientWriter = new StreamWriter(Stream);
                        txtServerIp.Enabled = false;
                        btnConnect.Enabled = false;
                        this.Text = "客户端   " + "正在与" + txtServerIp.Text.Trim() + "连接……";
                        return;
                    }
                    catch
                    {
                        txtServerIp.Enabled = true;
                        btnConnect.Enabled = true;
                        this.Text = "连接失败……";
    
                        //MessageBox.Show("连接失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            private void btnConnect_Click(object sender, EventArgs e)  //  连接按钮 执行
            { // 开始监听 代码
                if (txtServerIp.Text.Trim() == "")  // 服务器IP
                {
                    MessageBox.Show("请输入服务器IP", "客户端信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                else
                {
                    Thd = new Thread(new ThreadStart(GetConn));// 先执行 连接函数 ,在执行现场启动,新线程
                    Thd.Start();// 线程启动
                }
            }
    TcpListener Listener; //  监听
            public  Socket SocketClient; // 
            NetworkStream NetStream;   // 网络流
            StreamReader ServerReader; // 服务器 读 
            StreamWriter ServerWriter; // 服务器 写
            Thread Thd;   // 线程
            public void BeginLister()     // 打开服务器 子函数
            {
                while (true)
                {
                    try
                    {
                        IPAddress[] Ips = Dns.GetHostAddresses(""); // 本机 IP地址 定义
                        string GetIp = "127.0.0.1"; //Ips[0].ToString(); // 获取到IP 地址
                        Listener = new TcpListener(IPAddress.Parse(GetIp), 5000); // 监听
                        Listener.Start(); // 开始监听
                        CheckForIllegalCrossThreadCalls = false;
                        btnBeginServer.Enabled = false;// 开始服务器 按键控件使能关闭
                       // MessageBox.Show("服务器已经开启!", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Information);  
                        this.Text = "服务器 已经开启……";
                        SocketClient = Listener.AcceptSocket();//接受挂起----监听到的Socket
    
                        NetStream = new NetworkStream(SocketClient); // 网络流
                        ServerWriter = new StreamWriter(NetStream);
                        ServerReader = new StreamReader(NetStream);
                        if (SocketClient.Connected)  // 监听 ScoketClient 
                        {
                            MessageBox.Show("客户端连接成功!", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }                   
                    }
                    catch 
                    {             
                    }// 不做处理 继续测试监听
                }
                      
            }
            private void GetMessage()  // 获取消息
            {
                if (NetStream != null && NetStream.DataAvailable) // 网络流 非空 或者数据可用
                {
                    rtxChatInfo.AppendText(DateTime.Now.ToString());
                    rtxChatInfo.AppendText("  客户端说:
    ");
                    rtxChatInfo.AppendText(ServerReader.ReadLine() + "
    ");
                    //下拉框
                    rtxChatInfo.SelectionStart = rtxChatInfo.Text.Length;
                    rtxChatInfo.Focus();
                    rtxSendMessage.Focus();
                }
               
            }
    
            private void tmrGetMess_Tick(object sender, EventArgs e)  // 定时器 执行函数 
            {
                GetMessage();
            }
  • 相关阅读:
    手贱!使用django,在数据库直接删除了表
    js中在一个函数中引用另一个函数中的函数,可以这么做
    上传下载文件方式
    阻止form提交数据,通过ajax等上传数据
    一种思路,隐藏input标签,通过label关联
    java 寻找水仙花数
    java 统计素数个数问题
    java 兔子生仔问题
    java 实现读取某个目录下指定类型的文件
    通过java 来实现对多个文件的内容合并到一个文件中
  • 原文地址:https://www.cnblogs.com/dujian123/p/12102432.html
Copyright © 2020-2023  润新知