黑马程序员学习日记(9)--socket服务端与客户端连接(1)

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

IP和端口

端口是为了满足不同IP地之间的不同程序连接来识别程序的东东(IP找电脑,端口找程序)。端口是程序主动地绑定的,而并不是分配的,同一个应用程序绑定的端口号都是相同的。不让(某个应用程序)上网实际上就是把端口封掉了。

socket原意“孔”,插座,作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)。套接字本身不能跟外界通信,需要通过系统套接字跟外界通信(类似多线程)。



















Internet上有很多的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同、的服务(应用程序)。例如:http:80端口,ftp:21端口,smtp:23端口

有两种套接字发送方式:一种基于流的,一种基于报文的。基于流的是一种面向连接的Tcp服务应用,安全但效率低。数据报式的socket(datagram)是一种无连接的UDP服务应用,不安全(丢失,顺序混乱,在接收端要分析重排及要重发),但效率高。



基于流式的socket必须有服务端和客户端。客户端创建请求,服务端(serverprocess)必须许有一个负责迎接(接受套接字)的socket,然后负责接受的套接字专门创建一个套接字与请求连接。

服务端socket(至少有两个):一个负责接受客户端连接请求(但不负责与客户端通信),每接收一个客户端的连接便在服务端产生一个对应的socket(在接收到客户端连接时创建,为每个连接成功的客户端请求在服务端都创建一个对应的socket(负责和客户端通信))。

客户端的socket:必须指定要连接的服务端地址和端口,通过创建一个socket对象来初始化一个到服务器端的tcp连接。

服务端设置

步骤:服务端(1)引入命名空间:system.net、 system.net.socket

(2)创建负责监听的套接字(参数用IP4寻址协议,流式连接,tcp协议传输数据)

(3)获得文本框中IP地址(IPAddress)

(4)创建包含IP和Port的网络节点对象(IPEndPoint)

(5)将负责监听的套接字绑定到唯一的IP和端口上(socketWatch.bind(endpoint))

(6)设置监听队列的长度SocketWatch.listen(10);

(7)创建负责通信的新的套接字(socketWatch.accept()有返回值)微软自带的网络工具运行》》telnet +“”+地址+“”+端口号

服务端前台界面:文本框中的IP地址和端口号分别是用本机的服务器工具生成的,不可与工具同时运行。

服务端后台代码:《单线程条件下,改装后的多线程在下边》

private void button1_Click(object sender, EventArgs e)
        {
            //创建服务端负责监听的套接字,里边的参数分别是(寻址方法是Internetwork(ipv4),连接方式是流式连接,传输方式选择tcp协议)
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //为服务器创建IP地址,获得文本框中的IP地址对象
            IPAddress address = IPAddress.Parse(txt_IP.Text.Trim());
            //将网络端点表示为IP地址和端口号(将端口号绑定到IP地址):创建包含IP地址和端口号的网络端点对象
            IPEndPoint endpoint=new IPEndPoint(address,int.Parse(txt_port.Text.Trim()));
            //将负责监听的套接字绑定到唯一的IP地址和端口上
            socketWatch.Bind(endpoint);
            //(设置监听队列的长度)设置最多监听的数量,多的不予回应处理同时有多个人访问的情况,根据服务器来设置
            socketWatch.Listen(10);
            //客户端与服务端连接成功,创建新的连接:开始监听客户端连接请求,注意:阻断当前线程
            Socket socConnection= socketWatch.Accept();//为新建连接创建新的socket
            //连接成功,服务端显示信息
            ShowMsg("连接成功");
        }
        void ShowMsg(string msg)
        {
            txt_msg.AppendText(msg + "\r\n");
        }

测试:cmd>>telnet   127.0.0.1  32768 》》go,>>>>服务器端的大文本框显示连接成功

多线程改装上述服务端后台代码

public partial class ChatServer : Form
    {
        public ChatServer()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭微软自带的检查,可以让一个线程操作一个UI线程
        }

        Thread threadWatch = null;//创建服务端多线程
        Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//服务端负责监听的套接字  

        private void button1_Click(object sender, EventArgs e)
        {
            //创建服务端负责监听的套接字,里边的参数分别是(寻址方法是Internetwork(ipv4),连接方式是流式连接,传输方式选择tcp协议)
            //为服务器创建IP地址,获得文本框中的IP地址对象
            IPAddress address = IPAddress.Parse(txt_IP.Text.Trim());
            //将网络端点表示为IP地址和端口号(将端口号绑定到IP地址):创建包含IP地址和端口号的网络端点对象
            IPEndPoint endpoint=new IPEndPoint(address,int.Parse(txt_port.Text.Trim()));
            //将负责监听的套接字绑定到唯一的IP地址和端口上
            socketWatch.Bind(endpoint);
            //(设置监听队列的长度)设置最多监听的数量,多的不予回应,处理同时有多个人访问的情况,根据服务器来设置
            socketWatch.Listen(10);

            threadWatch = new Thread(watchConnection);//调用委托
            threadWatch.IsBackground = true;//设置为后台线程
            threadWatch.Start();//开启线程
            //连接成功,服务端显示信息
            ShowMsg("服务端启动监听成功");
        }
        void watchConnection()
        {
             while (true)//持续不断的监听客户端的连接请求
            {
                //客户端与服务端连接成功,创建新的连接:开始监听客户端连接请求,注意:阻断当前线程
                Socket socConnection = socketWatch.Accept();//为新建连接创建新的socket,一旦监听到客户端请求就返回一个负责和客户端通信的套接字socConnection
                ShowMsg("客户端连接成功");
            }
        }
        void ShowMsg(string msg)
        {
            txt_msg.AppendText(msg + "\r\n");
        }
    }

客户端:

private void btn_con_Click(object sender, EventArgs e)
        {
            IPAddress address=IPAddress.Parse(txt_IP.Text.Trim());//IP
            IPEndPoint endpoint=new IPEndPoint(address,int.Parse(txt_port.Text.Trim()));//端点包含IP和端口
            //创建套接字
            Socket socketConn=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

            //socketConn.Accep服务端专用,负责接收
            socketConn.Connect(endpoint);//由套接字向此端口发出请求
        }

同时启动两个项目,先运行一个,然后右键另外一个项目名称成》》调试》》启动新实例


--------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值