黑马程序员学习日记(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培训、期待与您交流! ----------------------
- 黑马程序员学习日记(9)--socket服务端与客户端连接(1)
- 黑马程序员学习日记(10)--socket服务端与客户端信息发送(2)
- 黑马程序员<.net学习---Socket 服务端与客户端的交互>
- 黑马程序员学习日记----Socket编程(一)
- 黑马程序员学习日记----Socket编程(二)
- 黑马程序员-学习日记9(集合框架 1 )
- socket实现客户端与服务端通信(一)服务端
- socket实现客户端与服务端通信(三)服务端升级
- 黑马程序员学习日记(5)--异常与异常处理
- 客户端与服务端连接分析(一)
- socket实现客户端与服务端通信(二)客户端
- 【黑马程序员】Socket编程实现服务端和客户端的交互
- java服务端客户端交互系列(一)socket连接
- Socket客户端与服务端
- 黑马程序员学习日记------MSSQL表连接
- 黑马程序员_学习日记67_717ASP.NET(Socket聊天室)
- 黑马程序员学习日记----多线程(一)
- 黑马程序员学习日记----多线程(二)
- [New Portal]Windows Azure Virtual Machine (14) 在本地制作数据文件VHD并上传至Azure(1)
- 数据库设计中的14个技巧
- DFA练习 -- 1102. Strange Dialog
- el表达式原样输出问题
- Spring <context:annotation-config/> 解说
- 黑马程序员学习日记(9)--socket服务端与客户端连接(1)
- 批处理for命令详解
- 使用字符:char类型
- 数据结构--字符串的接收操作
- ubuntu 命令行重启
- VS2012 单元测试之泛型类(Generics Unit Test)
- 最近学习了下BI(商业智能)做报表
- Struts_struts1.X_简单实现
- mutex_lock&spin_lock和信号量区别