socket网络编程

socket网络编程

1.1 socket网络编程简介

在这里插入图片描述

1.2 Socket的相关概念

在这里插入图片描述

1.3 Socket的端口介绍

在这里插入图片描述

2.1 Socket通讯流程图

在这里插入图片描述

3.1 局域网和以太网的区别

首先,我们来看看局域网是什么,简单的说局域网就是在一个封闭的环境如办公楼中彼此连接起来的一组计算机。这个定义中的关键在于所有的计算机都以一定的形式在网络中进行组织和彼此连接,而且要在同一幢建筑物中。所以只要这两台计算机在同一个建筑物中并且相互连接,那么我们就可以说这两台计算机组成了一个局域网。
我们来看看IEEE的802.3n标准中对以太网标准的有关表述:使用逻辑总线型拓扑和载波侦听多路访问/冲突监测(CDSMA/CD)的差错监测和恢复技术的网络形式。这就是以太网的定义了。从这里我们可以知道以太网实际上是局域网的一种形式。

3.2 以太网共享文件的方式

局域网设置共享详细流程
  局域网同享设置其实十分的简略,XP与win98,XP与XP,XP与win7选用下列办法都能设置成功局域网同享设置具体过程图文分化:
  方法/步骤:
  1、右键点击“我的电脑”
  2、选择属性,选择“计算机名”点击“更改”,如下图所示“要重新命名此计算机或加入域,单击更改”
  3、在弹出菜单的最下方,将局域网内需要实现共享的计算机“工作组”统一命名,如:WorkGroup或ERP,注意:想要实现共享,局域网中所有的计算机都必须是同一个工作组!
  4、右键点击“网上邻居”,选择“属性”按钮
  5、右键点击“本地连接”,选择“属性”
  6、在弹出“本地连接属性”菜单中找到“此链接使用下列项目”,双击“Internet 协议(TCP/IP)”
  7、选中“使用下面的IP地址”,将IP地址设置为:192.168.1.2(同处于局域网中的计算机可以依此类推:192.168.1.3~192.168.1.N),子网掩码设置为:255.255.255.0,默认网关设置:使用路由器网关192.168.1.1或你设置的其他网管地址。接下来勾选“使用下面的DNS服务器地址”,将首选NDS服务器设置为:192.168.1.1,备用DNS服务器设置为空(不用管它),点击“确定”;以上步骤设置完毕,请重启计算机
  8、验证局域网ip地址和工作组设置是否成功,双击“网上邻居”,点击“查看工作组计算机”,您应该能够看到处于同一工作组的其他计算机了,这说明设置成功。
  9、双击“我的电脑”,在您需要共享的硬盘盘符上点击右键,选择“共享与安全”
  10、在弹出菜单中选择“共享”,点击“如果您知道风险,但还要共享驱动器的根目录,请单击此处”
  11、点击“如果您知道在安全方面的风险,但又不想运行向导就共享文件,请单击此处”
  12、选择“只启用文件共享”,点击“确定”
  13、在弹出菜单中,勾选“在网络上共享这个文件夹”,共享名可以任意更改成您想要的名字,同时如果您需要局域网中的其他计算机更改您的文件请将“允许网络用户更改我的文件”,否则该共享盘符或文件夹为“只读状态”,假如您需要共享的仅仅是某个盘符下的文件夹,方法与盘符共享相同,最后点击“确定”
  14、到此,局域网共享设置完成,处于同一局域网中的计算机可以通过“网上邻居”查看到您共享的盘符或文件夹了

4 程序代码
4.1 问题一

在这里插入图片描述
解决方法:在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,这个时候如果你想要访问窗口的控件,那么你可以将窗口构造函数中的CheckForIllegalCrossThreadCalls设置为false.这是线程就能安全的访问窗体控件了。
在这里插入图片描述

4.2 问题二

VS运行两个项目时应该先运行一个,右键,调试,启动新实例;
在这里插入图片描述

4.3 Server端用来监听和接受数据
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
        //相关变量定义
        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
        private void btnListern_Click(object sender, EventArgs e)
        {
            Socket socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //设置指定的端口号和服务的ip地址
            IPAddress ip = IPAddress.Any;//调用任意端口号
            //ipaddress ip = ipaddress.parse(txtLicent.text);//调用唯一端口号
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPoint.Text));

            //绑定IPEndPoint
            socketWatch.Bind(point);
            ShowMsg("监听成功");

            //设置监听10个客户端服务器
            socketWatch.Listen(20);
            //Socket socketsend = socketWatch.Accept();创建线程不然一直处于这里等待
            //ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + "连接成功!");
            //创建线程用来监听;
            //线程创建方法:
            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketWatch);//Start里面参数是线程方法参数
        }
        void ShowMsg(string str)
        {
            txtLog.AppendText( str + "\r\n");//追加文本
           // txtLog.Text = str + "\r\n";区别与上一行
        }

        void Listen(Object o)//线程没有死,可以用线程解决
        {
            Socket socketWatch = o as Socket;
            while (true)
            {
                Socket socketSend = socketWatch.Accept();
                dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
                ShowMsg(socketSend.RemoteEndPoint.ToString()+"连接成功!");

                //开启一个新线程,不停地接受客户端发送的新消息
                Thread th = new Thread(Recive);
                th.IsBackground = true;
                th.Start(socketSend);
            }
           
        }
        void Recive(object o)//再加一线程目的, 因为只接受数据一次后有等待连接
        {
            while (true)
            {
                Socket socketSend = (Socket)o;
                //实际接受的有用数据
                byte[] buffer = new byte[1024 * 1024 * 2];
                int i = socketSend.Receive(buffer);
                string str = Encoding.UTF8.GetString(buffer, 0, i);
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);
            }

        }

    }
}

4.4 客户端发送消息程代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }
        //相关变量定义
        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
        private void btnListern_Click(object sender, EventArgs e)
        {
            Socket socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //设置指定的端口号和服务的ip地址
            IPAddress ip = IPAddress.Any;//调用任意端口号
            //ipaddress ip = ipaddress.parse(txtLicent.text);//调用唯一端口号
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPoint.Text));

            //绑定IPEndPoint
            socketWatch.Bind(point);
            ShowMsg("监听成功");

            //设置监听10个客户端服务器
            socketWatch.Listen(20);
            //Socket socketsend = socketWatch.Accept();创建线程不然一直处于这里等待
            //ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + "连接成功!");
            //创建线程用来监听;
            //线程创建方法:
            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketWatch);//Start里面参数是线程方法参数



        }
        void ShowMsg(string str)
        {
            txtLog.AppendText( str + "\r\n");//追加文本
           // txtLog.Text = str + "\r\n";区别与上一行
        }

        void Listen(Object o)//线程没有死,可以用线程解决
        {
            Socket socketWatch = o as Socket;
            while (true)
            {
                Socket socketSend = socketWatch.Accept();
                dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
                ShowMsg(socketSend.RemoteEndPoint.ToString()+"连接成功!");

                //开启一个新线程,不停地接受客户端发送的新消息
                Thread th = new Thread(Recive);
                th.IsBackground = true;
                th.Start(socketSend);
            }
           
        }
        void Recive(object o)//再加一线程目的, 因为只接受数据一次后有等待连接
        {
            while (true)
            {
                Socket socketSend = (Socket)o;
                //实际接受的有用数据
                byte[] buffer = new byte[1024 * 1024 * 2];
                int i = socketSend.Receive(buffer);
                string str = Encoding.UTF8.GetString(buffer, 0, i);
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);
            }

        }

    }
}

4.5 传输协议

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Socket网络编程是一种利用套接字(socket)实现客户端和服务端之间通信的编程技术。通过套接字,应用程序可以在网络上发送和接收数据,并与其他应用程序进行通信。Socket网络编程广泛应用于各种领域,如网络通信、网络游戏、聊天软件、远程监控和在线视频等。开发者需要熟悉相关的技术和编程知识,以实现高效和可靠的网络通信。在编程中,可以使用各种协议(如TCP/IP协议)来实现网络通信,通过socket对象进行数据交换和共享。通过创建套接字并打开网络文件,应用程序可以像操作文件一样对套接字进行读写操作,实现与其他应用程序之间的通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Pythonsocket网络编程](https://download.csdn.net/download/qq_41604569/87564062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Socket网络编程](https://blog.csdn.net/weixin_61701822/article/details/131230710)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【计算机网络】Socket编程](https://blog.csdn.net/m0_69442905/article/details/128701277)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值