当前位置:文档之家› delphi一个用socket封装UDPTCP通信的例子

delphi一个用socket封装UDPTCP通信的例子

delphi一个用socket封装UDPTCP通信的例子
delphi一个用socket封装UDPTCP通信的例子

unit UnitTCPUDP;

interface

uses

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

Dialogs, StdCtrls,WinSock, ExtCtrls, ComCtrls,inif iles,StrUtils;

const

WM_SOCK = WM_USER + 82; {自定义windows消息}

//在tcp 服务器方式下,WM_SOCK为监听消息

// WM_SOCK+1到 WM_SOCK+MAX_ACCEPT 为与连接客户端进行通讯时的消息

MAX_ACCEPT=100;

FD_SET= MAX_ACCEPT;

type

TFormTCPUDP = class(TForm)

BtnSend: TButton;

MemoReceive: TMemo;

EditSend: TEdit;

Label2: TLabel;

Label3: TLabel;

Bevel2: TBevel;

STOpCode: TStaticText;

STIndex: TStatic Text;

STCommand: TStatic Text;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

GroupBox3: TGroupBox;

RBTCP: TRadioButton;

RBUDP: TRadioButton;

Panel1: TPanel;

RBClient: TRadioButton;

RBServer: TRadioButton;

GroupBox4: TGroupBox;

BtnConnect: TButton;

BtnClose: TButton;

Bevel1: TBevel;

StatusBar1: TStatusBar;

PanelDest: TPanel;

Label4: TLabel;

EditRemoteHost: TEdit;

Label5: TLabel;

EditRemotePort: TEdit;

Label6: TLabel;

CmbSendTo: TComboBox;

Label7: TLabel;

PanelLocal: TPanel;

ChkBind: TCheckBox;

EditHostPort: TEdit;

Label1: TLabel;

procedure BtnSendClick(Sender: TObject);

procedure BtnConnectClick(Sender: TObject);

procedure RBTCPClick(Sender: TObject);

procedure RBUDPClick(Sender: TObject);

procedure BtnCloseClick(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure RBClientClick(Sender: TObject);

procedure RBServerClick(Sender: TObject);

procedure ChkBindClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure EditHostPortChange(Sender: TObject);

procedure EditRemoteHostChange(Sender: TObject);

procedure EditRemotePortChange(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure CmbSendToKeyPress(Sender: TObject; var Key: Char); {消息接送}

private

{ Private declarations }

FirstFlag:Boolean;

INIPath:String;

procedure R eadData(var Message: TMessage);

function ReadTCPUDPIni():boolean; //读取配置信息

procedure Wri t eIniStr(FileName:String;section:string;Ident:string;StringValue:string);//写系统信息 procedure Wri t eIniBool(FileName:String;section:string;Ident:string;BoolValue:Boolean);//写系统信息 protected

{ Protected declarations }

{ other fields and methods}

procedure wndproc(var message:Tmessage);override;

public

{ Public declarations }

end;

const

DATA_LENGTH =120; //数据长度

type

TUDPaction = packed record

opcode:byte; //操作码

index:word; //序列号

Command:byte; //命令字

data:array[0..(DATA_LENGTH-1)] of char; //数据

end;

var

FormTCPUDP: TFormTCPUDP;

AcceptSock:Array[0..MAX_ACCEPT] OF Tsocket;

FSockAccept : Array[0..MAX_ACCEPT] OF TSockAddrIn;

AcceptSockFlag: Array[0..MAX_ACCEPT] OF boolean;

AcceptNum:integer=0;

FSockLocal : TSockAddrIn;

PackageID:integer=0; //包序号

BindFlag:Boolean=true;

TcpFlag:Boolean=false;

ServerFlag:Boolean=false;

function WinSockInital(Handle: HWnd):bool;

Procedure WinSockClose();

implementation

{$R *.dfm}

{始化SOCKET}

function WinSockInital(Handle: HWnd):bool;

var TempWSAData: TWSAData;

i:integer;

begin

result := false;

{ 1 初始化SOCKET}

if WSAStartup(2, TempWSAData)=1 then //2表示启用winsock2 exi t;

{若是用UDP通信,则用}

if TcpFlag then

AcceptSock[0]:=Socket(AF_INET,SOCK_STREAM,0)

else

AcceptSock[0]:=Socket(AF_INET,SOCK_DGRAM,0);

if AcceptSock[0]=SOCKET_ERROR then

exi t;

if (BindFlag and not tcpflag) or (Serverflag and tcpflag) then

if bind(AcceptSock[0],FSockLocal,sizeof(FSockLocal))<>0 then begin

WinSockClose();

exit;

end;

if Tcpflag then

if Serverflag then

begin

if Listen(AcceptSock[0],1)<>0 then //等待连接队列的最大长度为1

begin

&

nbsp;WinSockClose();

exi t;

end;

end

else

if connect(AcceptSock[0],FSockAccept[0],sizeof(FSockAccept[0]))<>0 then

begin

WinSockClose();

exi t;

end;

{FD_READ 在读就绪的时候, 产生WM_SOCK 自定义消息号}

if not TcpFlag then

WSAAsyncSelect(AcceptSock[0], Handle , WM_SOCK, FD_READ)

else if Serverflag then

WSAAsyncSelect(AcceptSock[0], Handle , WM_SOCK, FD_READ or FD_ACCEPT or FD_CLOSE) else

WSAAsyncSelect(AcceptSock[0], Handle , WM_SOCK, FD_READ or FD_CLOSE);

R esult:=true;

end;

{关闭SOCKET}

Procedure WinSockClose();

var i:integer;

begin

for i:=1 to MAX_ACCEPT DO

if AcceptSockFlag[i] then

begin

CloseSocket(AcceptSock[i]);

AcceptSockFlag[i]:=false;

end;

CloseSocket(AcceptSock[0]); {closesocket函数用来关闭一个描述符为AcceptSock[0]套接字}

WSACleanup;

end;

function TFormTCPUDP.ReadTCPUDPIni():boolean;

var ti:TiniFile;

begin

ti:=TIniFile.Create(INIPath+'TCPUDP.ini');

EditHostPort.text:=ti.ReadString('Setting','LocalPort','');

ChkBind.Checked:=ti.ReadBool('Setting','BindStatus',false);

EditR emotePort.text:=ti.ReadString('Setting','RemotePort','');

EditR emoteHost.text:=ti.ReadString('Setting','R emoteHost','');

RBTCP.Checked:=ti.ReadBool('Setting','TCPStatus',false);

RBUDP.Checked:=not RBTCP.Checked;

RBServer.Checked:=ti.R eadBool('Setting','ServerStatus',false);

RBClient.Checked:=not RBServer.Checked;

end;

procedure TFormTCPUDP.WriteIniStr(FileName:String;Section:string;Ident:string;StringValue:string); var ti:TiniFile;

begin

ti:=TIniFile.Create(FileName);

ti.writestring(section,Ident,StringValue);

ti.Free;

end;

procedure TFormTCPUDP.WriteIniBool(FileName:String;Section:string;Ident:string;BoolValue:Boolean); var ti:TiniFile;

begin

ti:=TIniFile.Create(FileName);

ti.writebool(section,Ident,BoolValue);

ti.Free;

end;

procedure TFormTCPUDP.BtnSendClick(Sender: TObject);

var SEND_PACKAGE : TUDPaction; //数据发送

i:integer;

s:String;

begin

Fillchar(SEND_PACKAGE.data,Data_Length,chr(0));

SEND_PACKAGE.data[0]:='1';

SEND_PACKAGE.data[1]:='2';

SEND_PACKAGE.data[2]:='3';

SEND_PACKAGE.opcode:=2;

SEND_PACKAGE.index:=PackageID;

SEND_https://www.doczj.com/doc/5a2586767.html,mand:=3;

s:=editsend.Text;

for i:=0 to length(EditSend.Text)-1 do

SEND_PACKAGE.data[i]:=s[i+1];

PackageID:=PackageID+1;

if not (Tcpflag and Serverflag) then

sendto(AcceptSock[0], SEND_PACKAGE,sizeof(SEND_PACKAGE), 0, FSockAccept[0], sizeof(FSockAcce pt[0]))

else if AcceptNum=0 then

Application.MessageBox('没有一个客户端和您建立连接','信息提示',MB_OK)

else

begin

i:=pos(' ',CmbSendto.Text);

if i>0 then

begin

i:=strtoint(MidStr(CmbSendTo.Text,8,i-8));

sendto(AcceptSock[i], SEND_PACKAGE,sizeof(SEND_PACKAGE), 0, FSockAccept[i], sizeof(FSockAcce pt[i]));

end

else

Application.MessageBox('您没有选择发送方','错误提示',MB_OK);

end;

// sendto(AcceptSock[0], NbtstatPacket,50, 0, FSockAccept[0], sizeof(FSockAccept[0]));

end;

procedure TFormTCPUDP.BtnConnectClick(Sender: TObject);

var s:String;

i:integer;

begin

s:='正在建立连接....';

StatusBar1.Panels[0].Text:=s;

Application.ProcessMessages;

FSockLocal.sin_family:=AF_INET;

FSockLocal.sin_port:=htons(strtoint(Edi t Hostport.Text));

FSockAccept[0].sin_family:=AF_INET;

FSockAccept[0].sin_port:=htons(strtoint(EditRemoteport.Text));

FSockAccept[0].SIn_Addr.S_addr := inet_addr(PChar(EditR emoteHost.Text));//inet_addr(pchar(IP)); if WinSockInital(FormTCPUDP.Handle) then

begin

BtnConnect.Enabled:=false;

BtnClose.Enabled:=true;

BtnSend.Enabled:=true;

s:='连接成功!';

if ChkBind.Checked then

s:=s+', ---绑定端口';

if RBTcp.Checked then

begin

s:=s+',---TCP方式';

if RBServer.Checked then

s:=s+',---服务端'

else

s:=s+',---客户端';

end

else

s:=s+',---UDP方式';

if tcpflag and Serverflag then

begin

AcceptNum:=0;

CmbSendto.Clear;

StatusBar1.Panels[2].Text:='共有:'+inttostr(AcceptNum)+'个连接';

end;

end

else

begin

for i:=0 to StatusBar1.Panels.count-1 do

StatusBar1.Panels[i].Text:='';

s:='创建套接字失败!!';

end;

StatusBar1.Panels[0].Text:=s;

end;

procedure TFormTCPUDP.wndproc(var Message: TMessage);

begin

if (Message.Msg>=WM_SOCK) and (Message.Msg<=WM_SOCK+MAX_ACCEPT) then

ReadData(Message)

else

inherited wndproc(message);

end;

procedure TFormTCPUDP.ReadData(var Message: TMessage);

var

Receive_PACKAGE : TUDPacti

on; //数据发送

flen,len,i,index: integer;

Event: word;

begin

Index:=(Message.Msg-WM_SOCK);

flen:=sizeof(FSockAccept[Index]);

Event := WSAGetSelectEvent(Message.LParam);

if Event = FD_READ then

begin

len := recvfrom(AcceptSock[Index], Receive_PACKAGE, sizeof(R eceive_PACKAGE), 0, FSockAccept[In dex], Flen);

if len> 0 then

begin

StatusBar1.Panels[0].Text:='收到来自ip地址:'+inet_ntoa(FSockAccept[Index].sin_addr)+' 端口:'+inttostr(ntohs(FSockAccept[Index].sin_port))+'的数据';

StOpCode.Caption:= format('%.2d',[Receive_PACKAGE.opCode]);

StIndex.Caption:= format('%d',[Receive_PACKAGE.Index]);

StCommand.Caption:= format('%.2d',[R eceive_https://www.doczj.com/doc/5a2586767.html,mand]);

MemoR eceive.Lines.Add(StrPas(Receive_PACKAGE.data))

end;

end

else if Event=FD_ACCEPT then

begin

for i:=1 to MAX_ACCEPT DO

if not AcceptSockFlag[i] then

begin

flen:=Sizeof(FSockAccept[i]);

AcceptSock[i]:=accept(AcceptSock[0],@FSockAccept[i],@flen);

WSAAsyncSelect(AcceptSock[i], Handle , WM_SOCK+i, FD_READ or FD_CLOSE);

AcceptSockFlag[i]:=true;

AcceptNum:=AcceptNum+1;

CmbSendto.I tems.Add('套接口:'+inttostr(i)+' 地址:'+inet_ntoa(FSockAccept[i].sin_addr)+' 端口:'+inttostr(ntohs(FSockAccept[i].sin_port)));

break;

end;

StatusBar1.Panels[2].Text:='共有:'+inttostr(AcceptNum)+'个连接';

end

else if Event=FD_CLOSE then

begin

WSAAsyncSelect(AcceptSock[index], FormTCPUDP.Handle, 0, 0);

if index<>0 then

begin

for i:=0 to CmbSendto.I tems.Count-1 do

if CmbSendto.I tems.Strings[i]= '套接口:'+inttostr(index)+' 地址:'+inet_ntoa(FSockAccept[index].sin_addr)+' 端口:'+inttostr(ntohs(FSockAccept[index].sin_port)) then

begin

CmbSendto.Items.Delete(i);

break;

end;

CloseSocket(AcceptSock[index]);

AcceptSockFlag[index]:=false;

AcceptNum:=AcceptNum-1;

StatusBar1.Panels[2].Text:='共有:'+inttostr(AcceptNum)+'个连接';

end;

end;

end;

procedure TFormTCPUDP.RBTCPClick(Sender: TObject);

begin

writeiniBool(INIPath+'TCPUDP.ini','Setting','TCPStatus',true);

RBServer.Enabled:=true;

RBClient.Enabled:=true;

if RBServer.Checked then

begin

PanelDest.Visible:=false;

CmbSendto.Enabled:=true;

end

else

begin

PanelDest.Visible:=true;

PanelLocal.Visible:=false;

end;

ChkBind.Enabled:=false;

TcpFlag:=true;

end;

procedure TFormTCPUDP.RBUDPClick(Sender: TObject);

begin

writeiniBool(INIPath+'TCPUDP.ini','Setting','TCPStatus',false);

RBServer.Enabled:=false;

RBClient.Enabled:=false;

PanelDest.Visible:=true;

TcpFlag:=false;

ChkBind.Enabled:=true;

CmbSendto.Enabled:=false;

PanelLocal.Visible:=true;

end;

procedure TFormTCPUDP.BtnCloseClick(Sender: TObject);

var i:integer;

begin

WinSockClose();

BtnConnect.Enabled:=true;

BtnClose.Enabled:=false;

BtnSend.Enabled:=false;

CmbSendto.Clear;

for i:=0 to StatusBar1.Panels.count-1 do

StatusBar1.Panels[i].Text:='';

Statusbar1.Panels[0].Text:='已关闭套接字!!';

end;

procedure TFormTCPUDP.FormClose(Sender: TObject; var Action: TCloseAction); begin

if BtnClose.Enabled then WinSockClose();

end;

procedure TFormTCPUDP.RBClientClick(Sender: TObject);

begin

writeiniBool(INIPath+'TCPUDP.ini','Setting','ServerStatus',false);

ServerFlag:=false;

PanelDest.Visible:=true;

CmbSendto.Enabled:=false;

if Tcpflag then

PanelLocal.Visible:=false

else

PanelLocal.Visible:=true;

end;

procedure TFormTCPUDP.RBServerClick(Sender: TObject);

begin

writeiniBool(INIPath+'TCPUDP.ini','Setting','ServerStatus',true);

ServerFlag:=true;

if Tcpflag then

begin

PanelDest.Visible:=false;

CmbSendto.Enabled:=true;

ChkBind.Enabled:=false;

ChkBind.Checked:=true;

end

else

ChkBind.Enabled:=true;

PanelLocal.Visible:=true;

end;

procedure TFormTCPUDP.ChkBindClick(Sender: TObject);

begin

writeiniBool(INIPath+'TCPUDP.ini','Setting','BindStatus',ChkBind.Checked); BindFlag:=ChkBind.Checked;

end;

procedure TFormTCPUDP.FormCreate(Sender: TObject);

var i:integer;

begin

FirstFlag:=true;

for i:=1 to MAX_ACCEPT do

AcceptSockFlag[i]:=false;

INIPath:=extractFilePath(ParamStr(0));

end;

procedure TFormTCPUDP.EditHostPortChange(Sender: TObject);

begin

writeiniStr(INIPath+'TCPUDP.ini','Setting','LocalPort',EditHostPort.Text);

end;

procedure TFormTCPUDP.EditRemoteHostChange(Sender: TObject);

begin

writeiniStr(INIPath+'TCPUDP.ini','Setting','RemoteHost',EditR emoteHost.Text); end;

procedure TFormTCPUDP.EditRemotePortChange(Sender: TObject);

begin

writeiniStr(INIPath+'TCPUDP.ini','Setting','RemotePort',EditRemotePort.Text); end;

procedure TFormTCPUDP.FormActivate(Sender: TObject);

begin

if FirstFlag then

begin

FirstFlag:=false;

ReadTCPUDPIni();

end;

end;

procedure TFormTCPUDP.CmbSendToKeyPress(Sender: TObject; var Key: Char); begin

key:=chr(0);

end;

end.

socket编程实现客户端和服务器端通信

#include "" #include <> #include #pragma comment(lib,"") #define BUF_SIZE 64 int _tmain(int argc,_TCHAR* argv[]) { WSADATA wsd; S OCKET sServer; S OCKET SClient; i nt retVal; c har buf[BUF_SIZE]; i f (WSAStartup(MAKEWORD(2,2),&wsd)!=0) {printf("wsastartup failed!\n"); return 1; } s Server=socket(AF_INET,SOCK_STREAM,IPPROTO_TC P); i f (INVALID_SOCKET==sServer) {printf("socket failed!\n"); WSACleanup(); return -1; } S OCKADDR_IN addrServ; =AF_INET; =htons(9990); retVal=bind(sServer,(const struct sockaddr*) &addrServ,sizeof(SOCKADDR_IN)); i f (SOCKET_ERROR==retVal) {printf("bind failed!\n"); closesocket(sServer); WSACleanup(); return -1; } retVal=listen(sServer,1); i f (SOCKET_ERROR==retVal) {printf("listen failed!\n"); closesocket(sServer); WSACleanup(); return -1; } p rintf("tcp server start...\n"); s ockaddr_in addrClient; i nt addrClientlen=sizeof(addrClient); S Client=accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen); i f (INVALID_SOCKET==SClient) { printf("accept failed!\n"); closesocket(sServer); WSACleanup(); return -1; } w hile(true) { ZeroMemory(buf,BUF_SIZE); retVal=recv(SClient,buf,BUF_SIZE,0); if (SOCKET_ERROR==retVal) { printf("recv failed!\n"); closesocket(sServer); closesocket(SClient); WSACleanup(); return -1; } SYSTEMTIME st; GetLocalTime(&st); char sDataTime[30]; sprintf(sDataTime,"%4d-%2d-%2d %2d:%2d:%2d",, ,,,,; printf("%s,recv from client [%s:%d]:%s\n",sDataTime,inet_ntoa,,buf); if (StrCmp(buf,"quit")==0) { retVal=send(SClient,"quit",strlen("quit"),0); break; } else { char msg[BUF_SIZE]; sprintf(msg,"message received -%s",buf); retVal=send(SClient,msg,strlen(msg),0); if (SOCKET_ERROR==retVal) { printf("send failed!\n"); closesocket(sServer); closesocket(SClient); WSACleanup(); return -1; } } } c losesocket(sServer); c losesocket(SClient);

Delphi如何使用基本的绘图函数绘制统计图

一个windows自带的画图工具是无论如何也不能满足我们的画图需要的,很多效果都需要我们在另外的工具中来实现。这些高级的功能是如何实现的呢,如何操纵一些基本的属性和函数,让它们最终能作出我们想要的效果呢?这里我们以绘制统计图来说明这些问题。 解决思路―― 这里,我们暂且先撇开具体的问题,综合地一下讨论画图的问题。 画图工具是基本元素的具体实现,对于我们初学者来说,还是有很好的参考价值的,在delphi 5中有一个自带的工程例子“……Borland\Delphi5\Demos\Doc\Graphex”,这个例子可以实现一些基本的绘图功能。对这个例子多加修改,一定会有所收获的。这里就不列出它的详细代码了,有心的读者可以自己找到这个例子。我这里只是想综合地讨论这方面的问题。使用DELPHI编写绘图软件的灵魂就在于操作画布,画笔和刷子,尽可能地挖掘它们的属性和相关参数的设置。 (一)画布 画布,画笔和刷子之间的关系很明了.其实,画笔和刷子都是画布的一个属性.而画布也只是TForm,TImage,TShape等组件对象的一个属性,专门负责与图象相关的信息打交道.它的主要作用可以概括如下几点: 1.指定使用画笔,刷子和字体的使用类型; 2.绘制和填充指定形状的线或图形; 3.修饰和改变图象; 画布的主要属性有: Brush--指定填充图形和背景的样式 CanvasOrientation--指定画布的定位类型,有coLeftToRight, coRightToLeft两个属性; ClipRect--指定剪切矩形的边界; CopyMode--指定图形图象的复制模式; Font--指定画布上使用的字体; Handle--为画布指定窗口GDI对象的设备描述表; LockCount--指定画布被别的线程锁定的次数; Pen--指定画布上使用的画笔,具体见下面描述; PenPos--指定画笔当前的位置; Pixels--指定当前剪切矩形的象素颜色; TextFlags--指定字体在画布上的显示方式,有ETO_CLIPPED,ETO_OPAQUE,ETO_RTLREADING,ETO_GL YPH_INDEX,ETO_IGNORELANGUAGE,ETO_NUMERICSLOCALETO_NUMERIC SLATIN等值可选; 画布相关的API函数及其注释如下: Arc--按指定方式画一条弧; BrushCopy--把位图复制到指定的画布的矩形中,用画布刷子颜色替换位图的颜色; Chord--按指定方式画弦; CopyRect--从一个矩形区域复制部分图象到另一个矩形区域; Draw--用指定参数在指定位置画图; DrawFocusRect--按指定焦点风格,通过异或操作来绘制一焦点矩形; Ellipse--按指定参数画一椭圆; FillRect--按指定的刷子填充一矩形; FloodFill--使用当前选定的刷子填充指定设备描述表中的一块区域;

delphi数学模块函数、过程大全

function ArcCos(const X : Extended) : Extended; overload; function ArcCos(const X : Double) : Double; overload; function ArcCos(const X : Single) : Single; overload; function ArcSin(const X : Extended) : Extended; overload; function ArcSin(const X : Double) : Double; overload; function ArcSin(const X : Single) : Single; overload; function ArcTan2(const Y, X: Extended): Extended; procedure SinCos(const Theta: Extended; var Sin, Cos: Extended) register; function Tan(const X: Extended): Extended; function Cotan(const X: Extended): Extended; { 1 / tan(X), X <> 0 } function Secant(const X: Extended): Extended; { 1 / cos(X) } function Cosecant(const X: Extended): Extended; { 1 / sin(X) } function Hypot(const X, Y: Extended): Extended; { Sqrt(X**2 + Y**2) } function RadToDeg(const Radians: Extended): Extended; inline; { Degrees := Radians * 180 / PI } function RadToGrad(const Radians: Extended): Extended; inline; { Grads := Radians * 200 / PI } function RadToCycle(const Radians: Extended): Extended; inline; { Cycles := Radians / 2PI } function DegToRad(const Degrees: Extended): Extended; inline; { Radians := Degrees * PI / 180} function DegToGrad(const Degrees: Extended): Extended; function DegToCycle(const Degrees: Extended): Extended; function GradToRad(const Grads: Extended): Extended; inline; { Radians := Grads * PI / 200 } function GradToDeg(const Grads: Extended): Extended; function GradToCycle(const Grads: Extended): Extended; function CycleToRad(const Cycles: Extended): Extended; inline; { Radians := Cycles * 2PI } function CycleToDeg(const Cycles: Extended): Extended; function CycleToGrad(const Cycles: Extended): Extended; { Hyperbolic functions and inverses } function Cot(const X: Extended): Extended; inline; { alias for Cotan } function Sec(const X: Extended): Extended; inline; { alias for Secant } function Csc(const X: Extended): Extended; inline; { alias for Cosecant } function Cosh(const X: Extended): Extended; function Sinh(const X: Extended): Extended; function Tanh(const X: Extended): Extended; function CotH(const X: Extended): Extended; inline; function SecH(const X: Extended): Extended; inline; function CscH(const X: Extended): Extended; inline; function ArcCot(const X: Extended): Extended; { IN: X <> 0 } function ArcSec(const X: Extended): Extended; { IN: X <> 0 } function ArcCsc(const X: Extended): Extended; { IN: X <> 0 } function ArcCosh(const X: Extended): Extended; { IN: X >= 1 } function ArcSinh(const X: Extended): Extended;

delphi面试题及答案

delphi面试题及答案 【篇一:delphi程序期末试题答案】 一、单选题(每小题2分,共30分) 1.在 radiogroup 组件中有 4 个单选框,当选中第 2 个单选框时,radiogroup 组件中的 itemindex 属性值应为(b)。 a.0 b.1c.2d.3 2.函数和过程的区别为(a)。 a.函数执行后返回一个值,而过程不需返回值b.过程执行后返回一个值,而函数不需返回值c.过程在被调用时,能执行某种特殊功能并能返回到调用它的地方d.函数在被调用时,能执行某种特殊功能并能返回到调用它的地方3.32 and 27 的值是(b)。 a.59b.0c.27d.32 4.窗体与数据模块的扩展名是(b)。 a..dcu b..dfm c..pas d..dpr 5.delphi 中用什么函数来析构一个组件(c)。 a.constructor b.destroy c.free d.create 6.一个指针变量ptr 的域成员 fs 访问的方法是(c)。 a.ptr-fs b.ptr.fsc.ptr^fs d.ptr@fs 7.type aarrays=[1?8,1?5] of integer ,该类型定义了多少个下标元素(d)。 a.45 b.54 c.48 d.40 8.delphi 的所有类都是从什么类继承下来的(b)。 a.tcomponent b.tobject c.tstream d.tnull 9.定义构造函数时用到的保留字是(c)。 a.class b..implementation c.create d.construction 10.下列组件中属于可视组件的是哪一个(d)。 a.tdatasource b.topendialog c.ttable d.tscrollbar 11.设有过程 procedure pro(var x,y:integer); 变量 a , b 为整型 变量,其值分别为 5、6,则合法的过程调用语句是(a.pro(5,6) b.pro(5,b) c.pro(a,6)d.pro(a,b) 12.下列组件中不能获取焦点的是(b)。 a.tedit b.tlabelc. trichedit d.ttreeview13.定义抽象类必 须使用的指令字是(a)。 a.abstractb.virtualc.dynamicd.override” 14.delphi是哪个公司的产品(c)。 a. microsoft b.ibm c.borland d.dom

实现socket通信

基于visual c++之windows核心编程代码分析(10)实现socket通信 分类:VC++编程技术Visual C++2010编程技术Visual Studio2012 Windows8 2011-12-17 11:32 120人阅读评论(0) 收藏举报在多台计算机之间实现通信,最常见的方法有两种:Socket通信与UDP通信。 Socket是一种基于TCP/IP协议,建立稳定连接的点对点通信,它的特点是安全性高,数据 不会丢失,但是很占系统资源。 在JAVA中,ServerSocket类和Socket类为我们实现了Socket 通信,建立通信的一般步骤是: 1。建立服务器 ServerSocket ss = new ServerSocket(端口号); Socket socket = ss.accept(); 这样,我们就已经建立了服务器,其中accept()方法会阻塞,知道有客户发送一个连接请求,我们可以通过 socket.getInputStream()和socket.getOutputStream()来获得输入输出流,如调用socket.getInputStream()获得一个输入流,实际上这个流就是连接对方的一个输出流,流的操作与文件流操作相同,我们可以用操作文件的方法来操作它们。 2。建立客户端 Socket socket = new Socket(主机名,端口号) 客户端只需这一句代码就可以与服务器取得连接,这里的主机名应为服务器的IP地址,端口号是服务器用来监听该程序的端口,同样可以通过socket.getInputStream()和 socket.getOutputStream()来获得输入输出流。在以上程序中,已经实现了一个最简单的客户端和服务器的通信。但是,还有一些问题。 首先,这个通信只执行一次,程序就将结束。因为我们只读了一次输入流,如果想要建立客户与服务器之间的稳定的会话,就要用到多线程: Thread thread = new Thread(new Sender()); thread.start();

DELPHI常用函数说明

一、数据类型转换函数1 在我们编写程序当中,根据不同情况,会使用到多种数据类型。当要对不同的类型进行操作时,必须要将不同的类型转换成同样的类型。因此熟练地掌握数据类型的转换是非常重要的。 1.FloatToStr 功能说明:该函数用于将“浮点型”转换成“字符型”。 参考实例: Edit1.Text := FloatToStr(1.981); 2.IntToStr 功能说明:该函数用于将“整数型”转换成“字符型”。 参考实例: S := IntToStr(10);(注:S为String类型变量。) 3.IntToHex 功能说明:该函数用于将“十进制”转换成“十进制”。该函数有二个参数1。第一个参数为要转换的十进制数据,第二个参数是指定使用多少位来显示十六进制数据。 参考实例: Edit1.Text := IntToHex('100', 2);

执行结果,Edit1.Text等于64。 注意:Delphi没有提供专门的“十六进制”转换为“十进制”的函数。使用StrToInt函数可以实现这个功能。具体代码是:I := StrToInt('S\' + '64'); 这时I等于100。加上一个'S\'即可将“十六进制”转换为“十进制”。 4.StrToInt 功能说明:该函数用于将“字符型”转换成“整数型”。 参考实例: I := StrToInt('100'); 注意:不能转换如StrToInt('ab')或StrToInt('好')这样的类型,因为他们并不存在数字型。 5.StrToFloat 功能说明:该函数用于将“字符型”转换成“浮点型”。 参考实例: N := StrToFloat(Edit1.Text); 注意:Edit1.Text中的内容为1.981(凡在Edit 控件中显示的文本均为字符串)。N为Double类型,用于保存转换后的浮点型数据。

delphi常用函数大全

delphi常用函数大全(转) Abort函数引起放弃的意外处理 Abs函数绝对值函数 AddExitProc函数将一过程添加到运行时库的结束过程表中 Addr函数返回指定对象的地址 AdjustLineBreaks函数将给定字符串的行分隔符调整为CR/LF序列Align属性使控件位于窗口某部分 Alignment属性控件标签的文字位置 AllocMem函数在堆栈上分配给定大小的块 AllowGrayed属性允许一个灰度选择 AnsiCompareStr函数比较字符串(区分大小写) AnsiCompareText函数比较字符串(不区分大小写) AnsiLowerCase函数将字符转换为小写 AnsiUpperCase函数将字符转换为大写 Append函数以附加的方式打开已有的文件 ArcTan函数余切函数 AssignFile函数给文件变量赋一外部文件名 Assigned函数测试函数或过程变量是否为空 AutoSize属性自动控制标签的大小 BackgroundColor属性背景色 BeginThread函数以适当的方式建立用于内存管理的线程 BevelInner属性控件方框的内框方式 BevelOuter属性控件方框的外框方式 BevelWidth属性控件方框的外框宽度 BlockRead函数读一个或多个记录到变量中 BlockWrite函数从变量中写一个或多个记录 BorderStyle属性边界类型 BorderWidth属性边界宽度 Break命令终止for、while、repeat循环语句 Brush属性画刷 Caption属性标签文字的内容 ChangeFileExt函数改变文件的后缀 ChDir函数改变当前目录 Checked属性确定复选框选中状态 Chr函数返回指定序数的字符 CloseFile命令关闭打开的文件 Color属性标签的颜色 Columns属性显示的列数 CompareStr函数比较字符串(区分大小写) Concat函数合并字符串 Continue命令继续for、while、repeat的下一个循环 Copy函数返回一字符串的子串 Cos函数余弦函数 Ctl3D属性是否具有3D效果 Cursor属性鼠标指针移入后的形状 Date函数返回当前的日期 DateTimeToFileDate函数将DELPHI的日期格式转换为DOS的日期格式DateTimeToStr函数将日期时间格式转换为字符串DateTimeToString函数将日期时间格式转换为字符串 DateToStr函数将日期格式转换为字符串

基于Socket技术的企业局域网通信软件设计与实现毕业设计

基于Socket技术的企业局域网通信软件设计与实现毕业设计 目录 1 绪论 (3) 1.1 研究背景 (3) 1.2 国外研究现状 (4) 1.2.1 国外研究现状 (4) 1.2.2 国研究现状 (4) 1.3 课题研究容及组织结构 (5) 1.3.1 研究容 (5) 1.3.2 组织结构 (5) 1.4 本章小结 (5) 2 系统核心技术 (6) 2.1 网络传输协议及Socket技术 (6) 2.1.1 网络传输协议 (6) 2.1.2 TCP协议 (6) 2.1.3 UDP协议 (7) 2.1.4 Socket (8) 2.1.5 点对点技术 (9) 2.2 加密算法 (10) 2.2.1 DES算法 (10) 2.2.2 MD5算法 (12) 2.3 多媒体技术 (13) 2.3.1 https://www.doczj.com/doc/5a2586767.html, (13) 2.3.2 Microsoft.DirectX SDK (13) 2.3.3 音频压缩算法 (14) 2.4 .Net技术 (14) 2.4.1 多线程 (14) 2.4.2 动态库 (15) 2.4.3 媒体控制接口 (15)

2.4.4 图形设备接口 (15) 2.4.5 正则表达式 (16) 2.5 三层架构技术 (16) 2.6 本章小结 (17) 3 系统需求分析 (18) 3.1 系统概述 (18) 3.2 系统业务分析 (18) 3.3 客户端需求 (20) 3.3.1 客户端主面板 (20) 3.3.2 用户私聊 (20) 3.3.3 群组聊天 (21) 3.3.4 视频会议 (21) 3.4 服务器需求 (21) 3.4.1 服务器主界面 (22) 3.4.2 员工信息管理 (22) 3.4.3 历史聊天记录管理 (22) 3.4.4 群共享管理 (22) 3.4.5 聊天记录数据图查看 (22) 3.5 非功能需求 (22) 3.5.1 可靠性 (23) 3.5.2 友好性 (23) 3.6 本章小结 (23) 4 系统设计 (24) 4.1 系统整体架构 (24) 4.2 客户端 (25) 4.2.1 聊天模块 (25) 4.2.2 群组聊天模块 (27) 4.2.3 视频会议模块 (28) 4.3 服务器端 (28) 4.3.1 数据快速查看模块 (28)

Delphi函数大全

Delphi函数大全 首部function Languages: TLanguages; $[ 功能返回系统语言对象 说明通过此函数可以得到系统的语言环境 参考type 例子 12a12c12a12c. 参考 例子:= IsValidIdent; ━━━━━━━━━━━━━━━━━━━━━ 首部function IntToStr(Value: Integer): string; overload; $[ 首部function IntToStr(Value: Int64): string; overload; $[ 功能返回整数Value转换成字符串 说明Format('%d', [Value]) 参考function 例子:= IntToStr; ━━━━━━━━━━━━━━━━━━━━━ 首部function IntToHex(V alue: Integer; Digits: Integer): string; overload; $[ 首部function IntToHex(V alue: Int64; Digits: Integer): string; overload; $[ 功能返回整数Value转换成十六进制表现结果;Format('%.*x', [Digits, Value]) 说明参数Digits指定字符最小宽度;最小宽度不足时将用0填充 参考function 例子:= IntToHex, ; ━━━━━━━━━━━━━━━━━━━━━ 首部function StrToInt(const S: string): Integer; $[ 功能返回字符串S转换成整数 说明字符串非整数表达时将引起异常 参考procedure 例子:= StrToInt; ━━━━━━━━━━━━━━━━━━━━━ 首部function StrToIntDef(const S: string; Default: Integer): Integer; $[ 功能返回字符串S转换成整数 说明字符串非整数表达时则返回默认值Default 参考procedure 例子:= StrToIntDef, 0); ━━━━━━━━━━━━━━━━━━━━━ 首部function TryStrToInt(const S: string; out Value: Integer): Boolean; $[ 功能返回字符串S转换成整数V alue是否成功 说明字符串非整数表达时返回False并且Value将输出为0 参考procedure 例子 ..);打开失败则返回负数 参考function

利用Socket实现双机通信(DOC)

计算机科学与技术学院 课程设计报告 2015— 2016学年第一学期 课程名称计算机网络 设计题目利用Socket实现双机通信姓名 学号 专业班级 指导教师 2016 年1 月8 日

目录 一、目的与要求 ................................................................................. - 3 - 二、什么是Winsock与Socket .......................................................... - 3 - 三、TCP/IP 简介................................................................................. - 4 - 1、TCP/IP 简介 ............................................................................... - 4 - 2、作用............................................................................................ - 4 - 四、java Socket网络编程 .................................................................. - 5 - 五、设计方案 ..................................................................................... - 5 - 1. 服务器端: ................................................................................. - 6 - 2. 客户端: ........................................................................................ - 9 - 六、运行结果: ............................................................................... - 14 - 七、课程设计的总结体会................................................................ - 15 - 八、参考资料: ............................................................................... - 15 - 简单的即时通信软件

Delphi程序设计复习题

《Delphi程序设计》复习题 一、单项选择题 1、下面哪句话对Delphi的描述是正确的()。 A.只能用于数据库客户端开发的工具B.Delphi的编程语言全部是面向过程的C.Delphi的编程语言是Java D.面向对象的可视化的开发环境 2、在Delphi中,建立一个文本编辑区域,可采用下列()。 A、命令按钮 B、文本标签控件 C、Edit控件 D、Timer控件 3、表达式60 +19 div 2 的值是() A.67 B.79 C.69 D.80 4、一个Delphi应用程序必有一个()文件和至少一个单元文件。 A) 执行程序B) 项目C) 数据D)图形 5、最适合于在工具栏上放置的工具按钮是() A.Button B.RadioButton C.SpeedButton D.BitBtm 6、Delphi应用程序设计基于()语言。 A) Basic B) C++ C) Pascal D) Object Pascal 7、下列表达式中()不是布尔表达式。 A) A=3 B) A div B C) A and B D) A>B 8、“x 是小于100的非负数”的Object Pascal表达式是()。 A.0 ≤x < 100 B.x >= 0, x<100 C.(x >=0) AND (x < 100) D.(x >= 0 ) OR (x<100) 9、利用Image对象的哪个属性设置,可以使加载的图像自动放大或缩小,以适应Image的显示区域() A.Stretch B.AutoSize C.Align D.Center 10、工具栏上的一个SpeedButton按钮如果要设置为状态按钮,则正确设置的方法是() A.将SpeedButton按钮的GroupIndex属性设置为0,且AllowAllUp属性设置为True。 B.将SpeedButton按钮的GroupIndex属性设置为0,且AllowAllUp属性设置为False。 C.将SpeedButton按钮的GroupIndex属性设置为非0值,且AllowAllUp属性设置为True。 D.将SpeedButton按钮的GroupIndex属性设置为非0值,且AllowAllUp属性设置为False。 11、要改变一个对象的高度,应使用属性()。 A、Font B、ForcColor C、Name D、Height 12、表达式30 +19 div 2 的值是() A.37 B.49 C.39 D.40 13、下列合法的变量名是()。 A、na + e B、e- 3r C、r_3 D、5we

利用Socket实现双机通信(计算机网络课程设计)

目录 1、目录 (1) 2、题目 (2) 3、设计任务 (2) 4、WinSocket简介及特点原理 (2) 5、T C P简介及特点原理 (3) 6、Vis ual C++简介 (7) 7、设计方案 (8) 8、系统的原理框图和程序流程图 (10) 9、实验中的问题 (14) 10、实验结果及分析 (14) 11、课程设计的总结体会 (16) 12、参考文献 (16)

利用Socket实现双机通信 一、设计任务 1.利用WinSock来实现双机通信,理解TCP状态机图。 2.要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。 二、WinSocket简介及特点原理 2.1、什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket 也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket 描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket

(DELPHI)API函数大全

(DELPHI)API函数大全 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC (统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件

Delphi常见错误代码

Delphi常见错误代码及中文解释 ';' not allowed before 'ELSE' ElSE前不允许有“;” '' clause not allowed in OLE automation section 在OLE自动区段不允许“”子句 '' is not a type identifier 不是类型标识符 '' not previously declared as a PROPERTY 前面没有说明PROPERTY 'GOTO

Socket通信原理

Socket通信原理 对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 1. 什么是TCP/IP、UDP? 2. Socket在哪里呢? 3. Socket是什么呢? 4. 你会使用它们吗? 什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。 这里有一张图,表明了这些协议的关系。 图1 TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。

Socket在哪里呢? 在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。 图2 原来Socket在这里。 Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。你会使用它们吗? 前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket 编程的工作原理,神秘的面纱也就揭开了。 一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

delphi函数参考手册

delphi函数参考手册 名称类型说明 abort 函数引起放弃的意外处理 abs 函数绝对值函数 addexitproc 函数将一过程添加到运行时库的结束过程表中addr 函数返回指定对象的地址 adjustlinebreaks 函数将给定字符串的行分隔符调整为cr/lf序列align 属性使控件位于窗口某部分 alignment 属性控件标签的文字位置 allocmem 函数在堆栈上分配给定大小的块 allowgrayed 属性允许一个灰度选择 ansicomparestr 函数比较字符串(区分大小写)ansicomparetext 函数比较字符串(不区分大小写)ansilowercase 函数将字符转换为小写 ansiuppercase 函数将字符转换为大写 append 函数以附加的方式打开已有的文件 arctan 函数余切函数 assignfile 函数给文件变量赋一外部文件名 assigned 函数测试函数或过程变量是否为空 autosize 属性自动控制标签的大小 backgrounddi2001.jpg 属性背景色 beginthread 函数以适当的方式建立用于内存管理的线程bevelinner 属性控件方框的内框方式

bevelouter 属性控件方框的外框方式 bevelwidth 属性控件方框的外框宽度 blockread 函数读一个或多个记录到变量中blockwrite 函数从变量中写一个或多个记录borderstyle 属性边界类型 borderwidth 属性边界宽度 break 命令终止for、while、repeat循环语句 brush 属性画刷 caption 属性标签文字的内容 change 函数改变文件的后缀 chdir 函数改变当前目录 checked 属性确定复选框选中状态 chr 函数返回指定序数的字符 closefile 命令关闭打开的文件 color 属性标签的颜色 columns 属性显示的列数 comparestr 函数比较字符串(区分大小写)concat 函数合并字符串 continue 命令继续for、while、repeat的下一个循环copy 函数返回一字符串的子串 cos 函数余弦函数 ctl3d 属性是否具有3d效果

相关主题
文本预览
相关文档 最新文档