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

来源:互联网 发布:手机版源码 编辑:程序博客网 时间:2024/06/01 14:53

---------------------- 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培训、期待与您交流! ----------------------
原创粉丝点击