TCP及Socket

TCP及Socket,第1张

计算机网络相关的问题,如果想去了解,前提就是深刻理解网络4/7层模型。

记住并理解,上面每一层。切记,切记,切记。知道一些就可以开始主题,分两个部分TCP和Socket。

TCP是(Tranfer Control Protocol)的简称,在OSI参考模型第四层,也就是端口,到端口的的通信,它是一个可靠的双向连接,一旦建立连接就可以双向数据传输,双方都可以进行发送或接收 *** 作。

最常听说的就是三次握手。是的它说的就是TCP建立连接的过程。具体的步骤如下:

第一步:Server监听端口,状态为:Listen 

第二部:Client发送SNY包,请求连接,并将状态改为:SYN_SEND

第三部:Server发送ACK包,和SNY包,同意,并请求连接,状态改为:SYN_RCVD

第四部:Client发送ACK包,Server收到包后,连接建立。双方状态改为:ESTABLISHED

第一步:Client发起FIN包。状态变为:FNI_WAIT_1

第二步:Server发送ACK包。状态变为:CLOSE_WAIT,Client收包后状态变为:FNI_WAIT_2

第三步:Server发送FIN包,状态变为:LAST_ACK。Client收包后状态变为:TIME_WAIT

第四步:Client发送ACK包。双方状态变为:CLOSED 

需要注意的是,Client是在收到Server FIN包后两个最大报文时间(2MSL)后变为CLOSED状态的。双方都可以发起断开请求,上面是已先发起请求的是Client。

如何验证上面讲的这些呢?那就是抓包分析,其实日常的开发中也可以通过抓包来发现问题。在这里我简单贴个图看一下TCP的包,这个工具非常强大感兴趣的朋友可以去深入了解一下。

1.可以在这个过滤,通过协议,通过IP,通过端口都可以。

2.这个就是每个包,例子中的这个是个[SYN,ACK]包,就是建立TCP连接的第二次握手

3.被抓取的包对应的网络层,从上到下分别是:物理层、数据链路层、网络层、传输层。

Socket其实就是TCP协议的实现。也就是说它就是TCP的API,当然其实Socket也支持别的协议如:UDP。既然是API那,上面说的其实就是它的原理。下面说一下它的使用。大概说一下。

1.ServerSocket:是服务端来监听的类。监听方法accept()。

2.客户端:创建Socket对象,设定IP和Port

3.当有新的客户端连接时可以通过ServerSocket类获取Socket。而Socket就是我们的通讯渠道。

4.发送和读取数据分别使用OutputStream和InputStream而这两个类是从Socket获取的。

其实Socket的基本使用就是这么简单,但是在其实项目中这样是无法满足需求的。实际上大多数场景都是需要一对多的提供服务。

使用多线程实现多客户端的通信

实现服务器与多个客户端进行通信, 可以接受多个客户端的请求并进行回复

应用多线程来实现服务器与多客户端之间的通信

1、服务器端创建ServerSocket,循环调用accept()等待客户端连接

2、客户端创建一个Socket并请求和服务器端连接

3、服务器端接受客户端请求,创建socket与该客户建立专线连接

4、建立连接的两个socket在一个单独的线程上对话

5、服务器端继续等待新的连接

我看盗的时候只有21个小时了,不知道是不是还能赶的上拿分!

下边给出DELPHI的源代码!

--------client---------------------------

unit Unit1

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,

StdCtrls

type

TForm1 = class(TForm)

Edit1: TEdit

Edit2: TEdit

Edit3: TEdit

Button1: TButton

IdTCPClient1: TIdTCPClient

procedure Button1Click(Sender: TObject)

procedure FormDestroy(Sender: TObject)

private

{ Private declarations }

public

{ Public declarations }

end

var

Form1: TForm1

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject)

begin

if idtcpclient1.Connected then idtcpclient1.Disconnect

try

idtcpclient1.Host :=edit1.Text

idtcpclient1.Port :=strtoint(edit2.Text )

idtcpclient1.Connect

except

showmessage('连接失败')

end

idtcpclient1.WriteLn(edit3.Text )

edit3.Text :=idtcpclient1.ReadLn

end

procedure TForm1.FormDestroy(Sender: TObject)

begin

if idtcpclient1.Connected then idtcpclient1.Disconnect

end

end.

------------------------------------------------

----------server--------------------------------

unit Unit1

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer

type

TForm1 = class(TForm)

IdTCPServer1: TIdTCPServer

Button1: TButton

Edit1: TEdit

Memo1: TMemo

procedure Button1Click(Sender: TObject)

procedure FormDestroy(Sender: TObject)

procedure IdTCPServer1Execute(AThread: TIdPeerThread)

procedure FormCreate(Sender: TObject)

private

{ Private declarations }

public

{ Public declarations }

end

var

Form1 : TForm1

i:integer

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject)

begin

if IdTCPServer1.Active then IdTCPServer1.Active := false

try

IdTCPServer1.DefaultPort := strtoint(Edit1.Text)

IdTCPServer1.Active := true

except

showmessage('启动失败')

end

end

procedure TForm1.FormDestroy(Sender: TObject)

begin

if IdTCPServer1.Active then IdTCPServer1.Active := false

end

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread)

var

s : string

begin

Memo1.Lines.Add(athread.Connection.ReadLn(s) )

ATHREAD.Connection.WriteLn(inttostr(i))

i:=i+1

end

procedure TForm1.FormCreate(Sender: TObject)

begin

i:=1

end

end.

----------------------------------------------

winXP +delphi7编译通过!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7818596.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存