网络编程套接字(Socket编程)

1. 端口号

端口号(port)是传输层协议的内容:

  1. 端口号是一个32位的整数。
  2. 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理。
  3. IP地址 + 端口号能够标识网络上的某一台主机的某一个进程。
  4. 一个端口号只能被一个进程占用。

注意:进程和端口号的关系

一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定

2. TCP/UDP

TCP(Transmission Control Protocol 传输控制协议)
UDP(User Datagram Protocol 用户数据报协议)

相同不同
TCP传输层协议可靠的、有连接、面向字节流
UDP传输层协议不可靠的、无连接、面向数据报

注意:TCP与UDP区别

  1. TCP面向流的:不保证是原封不动的接收到的。
    eg:服务器发送:“Hello word”
    客户端吧收到的可能是 :“H” “ello” " " “word”

  2. UDP是面向报文的:原封不动的接收。
    eg:发送端发送的是"Hello word"
    接受端收到的一定是"Hello word"

  3. TCP面向连接 —— 有connect连接。

  4. UDP无连接 —— 没有调用connect连接。

  5. TCP可靠的
    eg:发送了对方一定能收到;如果收不到,我也知道出问题了

  6. UDP不可靠的
    eg:

  7. severSocket().accept() //已经获取了一条链接

3. Socket

3.1 UDP socket API_DatagramSocket类

DatagramSocket类:

方法解释
DatagramSocket(int port,InetAddress laddr)创建一个数据报套接字,绑定到指定的本地地址
DatagramSocket(SocketAddress bindaddr)创建一个数据报套接字,绑定到指定的本地套接字地址
void bind(SocketAddress addr)将此DatagramSocket绑定到特定的地址和端口
void connect(InetAddress address,int port)将套接字连接到此套接字的远程地址
void receive(DatagramPacket p)从此套接字接收数据报包
void close()关闭此数据报套接字
void send(DatagramPacket p)从此套接字发送数据报包

3.2 TCP socket API

3.2.1 ServerSocket类

方法j解释
ServerSocket(int port)创建绑定到指定端口的服务器套接字
ServerSocket(int port, int backlog)创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压
Socket accept()侦听要连接到此套接字并接受它
bind(SocketAddress endpoint)将ServerSocket绑定到特定地址(IP地址和端口号)
InetAddress getInetAddress()返回此服务器套接字的本地地址
void close()关闭此套接字
int getLocalPort()返回此套接字正在侦听的端口号

bind():

  • 服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接; 服务器需要调用bind绑定一个固定的网络地址和端口号;
  • 如果地址为 null ,则系统将接收临时端口和有效的本地地址来绑定套接字。
    accept():
  • 三次握手完成后, 服务器调用accept()接受连接;
  • 如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来;
  • Socket 是一个返回值,代表网络的套接字。

3.2.2 Socket类

方法解释
Socket(InetAddress address, int port)创建流套接字并将其连接到指定IP地址的指定端口号
Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号
void bind(SocketAddress bindpoint)将套接字绑定到本地地址
void connect(SocketAddress endpoint)将此套接字连接到服务器
InetAddress getInetAddress()返回套接字所连接的地址
InputStream getInputStream()返回此套接字的输入流
OutputStream getOutputStream()返回此套接字的输出流

4.

4.1如何写UDP服务器?

1 创建一个 UDP Socket

DatagramSocket udpServerSocket=new DatagramSocket(8090);//UDP 套接字(Socket)

2 循环

2.1 等待对方发送 UDP 报文过来

udpServerSocket.receive(receivePacket);
//从 Socket 中读取数据报文
//阻塞方法,没有数据之前,是不返回的

2.2 回复对方一个 UDP 报文

udpServerSocket.send(sendPacket);

4.2如何写UDP客户端?

阻塞点只有一个

4.3如何写TCP服务器?

阻塞点有两个,故使用线程池

4.4如何写TCP客户端?

4.4线程处理流程

1 把输入流和输出流都转成合适的

正式员工数量
临时工+正式员工数量
空闲时间
队列

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Delphi中,套接字(Socket)编程用到的基本类是TServerSocket与TClientSocket。这两个类全部位于ScktComp单元中。其类型定义如下: type TServerSocket = class (ScktComp.TCustomServerSocket); TClientSocket = class (ScktComp.TCustomSocket)。      在编写程序时,首先要对TServerSocket(在服务器端)与TClientSocket(在客户端)进行实例化。对于TServerSocket的对象,主要设置其服务类型(ServerType)与端口(Port)的属性,然后编写“OnClientRead”事件处理程序的代码,处理来自客户机的请求。如要启动服务器,设置TServerSocket对象的Active属性为真(即Active := True),如要停止服务器,则设置TServerSocket对象的Active属性为假(即Active := False)。      对于TClientSocket的对象,主要设置对方服务器的服务类型(ServerType)、端口(Port)以及IP地址(Address)的属性,之后编写“OnConnect与OnRead”事件处理程序的代码“OnConnect”事件处理程序用来检查与服务器连接成功与否(必须在这里进行检查才有效),“OnRead”事件处理程序用来读取服务器发来的信息。如要连接服务器,设置TClientSocket对象的Active属性为真(即Active := True;注意:检查连接是否成功,必须在“OnConnect”事件处理程序中进行),如要断开与服务器的连接,则设置TClientSocket对象的Active属性为假(即Active := False)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值