delphpi tcp 服务和客户端 例子
//服务器端
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,Winapi.WinSock; type
clients = record
soc :TSocket;
add :sockaddr_in;
end;
pclients = ^clients; TForm1 = class(TForm)
btn1: TButton;
mmo1: TMemo;
procedure btn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
s :TSocket;
acThreadID :DWORD;
end; procedure ServerAccept(s :TSocket);stdcall;
procedure SocketWorkThread(ns :TSocket);stdcall;
const
buflen=;
var
Form1: TForm1; clientslist :TList; implementation {$R *.dfm} procedure SocketWorkThread(ns :TSocket);stdcall;
var
recvbuf :array[..buflen -] of Char;
rtn,k :Integer;
rs :string[buflen];
rs2:string;
error :string;
begin
try
while true do
begin
rtn := recv(ns,recvbuf,buflen,);
if rtn < then
begin
for k := to clientslist.Count - do
begin
if ns = pclients(clientslist.Items[k]).soc then
begin
freemem(clientslist.Items[k]); //zl 我自己增加的,感觉要释放下
clientslist.Delete(k);
Break;
end
else
Continue;
end;
CLOSESOCKET(ns);
error := IntToHex(ns,)+'退出';
Form1.mmo1.Lines.Add(error);
ExitThread();
end;
//rs := PChar(@recvbuf);
rs2 := StrPas(recvbuf);
//ShowMessage('rs=='+rs);
Form1.mmo1.Lines.Add(rs2);
end;
except
end;
end; procedure ServerAccept(s :TSocket);stdcall;
var
ra :sockaddr_in;
ra_len :integer;
recev :TSocket;
ThreadID :DWORD;
ip :string;
newclient :pclients;
begin
ra_len := SizeOf(ra);
try
while True do
begin
recev := accept(s,@ra,@ra_len);
if recev = - then
begin
ExitThread();
end;
ip := IntToHex(recev,)+'-'+ IntToStr(Ord(ra.sin_addr.S_un_b.s_b1))+'.'+
IntToStr(Ord(ra.sin_addr.S_un_b.s_b2))+'.'+
IntToStr(Ord(ra.sin_addr.S_un_b.s_b3))+'.'+
IntToStr(Ord(ra.sin_addr.S_un_b.s_b4));
Form1.mmo1.Lines.Add(ip);
GetMem(newclient,SizeOf(clients));
newclient.soc := recev;
newclient.add := ra;
clientslist.Add(newclient);
CreateThread(nil,,@SocketWorkThread,Pointer(recev),,ThreadID);
end;
except
end;
end; procedure TForm1.btn1Click(Sender: TObject);
var
wsa:TWSAData;
wsstatus:Integer;
sa:sockaddr_in;
begin
wsstatus := WSAStartup($,wsa);
if wsstatus<> then
begin
ShowMessage('初始化socket出错!');
Exit;
end; s := Socket(AF_INET,SOCK_STREAM,);
if s < then
begin
ShowMessage('创建socket出错!');
WSACleanup;
Exit;
end; sa.sin_port := htons(StrToInt(''));
sa.sin_family := AF_INET;
sa.sin_addr.S_addr := INADDR_ANY;
wsstatus := bind(s,sa,SizeOf(sa));
if wsstatus <> then
begin
ShowMessage('绑定socket出错');
WSACleanup;
Exit;
end; wsstatus := listen(s,);
if wsstatus <> then
begin
ShowMessage('监听出错!');
WSACleanup;
Exit;
end; clientslist := TList.Create;
CreateThread(nil,,@ServerAccept,Pointer(s),,acThreadID);
btn1.Enabled := False;
form1.Caption:= '服务端已启动';
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
clientslist.Free; //zl 我自己增加的,感觉要释放
end; end. //客户端 unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Winapi.WinSock, Vcl.StdCtrls; type
TForm1 = class(TForm)
btnCon: TButton;
btnSend: TButton;
btnDis: TButton;
mmo1: TMemo;
edtSend: TEdit;
procedure btnConClick(Sender: TObject);
procedure btnDisClick(Sender: TObject);
procedure btnSendClick(Sender: TObject);
private
{ Private declarations }
public
s:TSocket;
end;
procedure Receive(server :TSocket);stdcall;
const buflen = ;
var
Form1: TForm1; implementation {$R *.dfm} procedure Receive(server :TSocket);stdcall;
var
recbuf:array[..buflen -] of Char;
rtn :Integer;
rs :string;
begin
while True do
begin
rtn := recv(server,recbuf,buflen,);
if rtn < then
begin
closesocket(server);
ExitThread();
end;
rs := pchar(@recbuf);
Form1.mmo1.Lines.Add(rs);
end;
end; procedure TForm1.btnConClick(Sender: TObject);
var
sa :TWSAData;
wstates :Integer;
ad :sockaddr_in;
threadid :DWORD;
begin
wstates := WSAStartup($,sa);
if wstates <> then
begin
ShowMessage('socket初始化出错!');
Exit;
end; s := socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
if s = INVALID_SOCKET then
begin
ShowMessage('建立socket出错!');
WSACleanup;
Exit;
end; ad.sin_family := PF_INET;
ad.sin_port := htons(StrToInt(''));
ad.sin_addr.S_addr := inet_addr(PAnsiChar('127.0.0.1'));
wstates := connect(s,ad,SizeOf(ad));
if wstates <> then
begin
ShowMessage('连接错误');
WSACleanup;
btnCon.Enabled := false;
Exit;
end; CreateThread(nil,,@Receive,Pointer(s),,threadid);
end; procedure TForm1.btnDisClick(Sender: TObject);
begin
try
closesocket(s);
WSACleanup;
finally
btnCon.Enabled := True;
end;
end; procedure TForm1.btnSendClick(Sender: TObject);
var
sendbuf :array[..buflen -] of Char;
sendLen :Integer;
i :Integer;
begin
if edtSend.Text <> '' then
begin
FillChar(sendbuf,,); //此处重要: 否则接收端 容易出现个别乱码现象 for i := to Length(edtSend.Text) - do
sendbuf[i] := (edtSend.Text)[i+];
sendLen := send(s,sendbuf,buflen,); if sendLen < then
begin
ShowMessage('发送出错');
WSACleanup;
btnCon.Enabled := False;
Exit;
end;
end;
end; end.
delphpi tcp 服务和客户端 例子的更多相关文章
- Mina TCP服务端客户端 示例
服务端代码: package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; im ...
- python网络编程TCP服务多客户端的服务端开发
#服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...
- .net for TCP服务端 && 客户端
关键代码 详细代码请看示例代码 Service //创建套接字 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port); / ...
- c++ tcp 服务器和客户端例子
目标: 完成一个精简TCP服务器,可接收来自多个用户的请求,并返回结果. 思路: (1)服务器 C++ TCP服务器的实现主要由以下几个函数来完成: a)socket ...
- [javaSE] 网络编程(TCP服务端客户端互访阻塞)
客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...
- vertx 从Tcp服务端和客户端开始翻译
写TCP 服务器和客户端 vert.x能够使你很容易写出非阻塞的TCP客户端和服务器 创建一个TCP服务 最简单的创建TCP服务的方法是使用默认的配置:如下 NetServer server = ve ...
- TCP/IP网络编程之基于UDP的服务端/客户端
理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...
- TCP/IP网络编程之基于TCP的服务端/客户端(一)
理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流(stream)的套接字.TCP是Transmissi ...
- go --socket通讯(TCP服务端与客户端的实现)
这篇文章主要使用Go语言实现一个简单的TCP服务器和客户端.服务器和客户端之间的协议是 ECHO, 这个RFC 862定义的一个简单协议.为什么说这个协议很简单呢, 这是因为服务器只需把收到的客户端的 ...
随机推荐
- django 中从外界借助多个网站时 static 的存放和整理
在 模板之家中 前端页面直接上去抓取 可是遇到重复 或者 版本不统一 所以 在每个app下面建立自己的 stastic 在制作的html 页面上方 导入静态页面 {% load static ...
- AS经济Essay写作想拿高分其实并不难!
在ALEVEL经济学这门课中,最难的部分应该属于essay question部分,因为很多题目的问题方式是很多变的,考官对于考生的期望值要求也是非常高的. 很多学生觉得自己清楚题目中的知识点,但是最终 ...
- 小程序Promise
/** 异步函数回调简化处理 const promisify = require('./promisify') const getSystemInfo = promisify(wx.getSystem ...
- JAVA基本数据类型和注释
一.注释 1.注释的概念 注释是程序中给人看的提示信息,会被编译器忽略:在程序编译和执行过程中不会有任何影响,仅仅在代码阅读时提供提示信息. 2.注释的形式 基本语法://注释的内容 a.行注释 ...
- composer install、require、update的区别
- rdlc报表带参数打印
1.新建rdlc文件报表 2.选中rdlc文件=>视图=>报表资料 添加几个参数,如图 设计报表页面 int WaitNum = this.queueDTOs.Where(m=>m. ...
- 实验吧Web-中-登陆一下好吗??
题目上说:不要怀疑,我已经过滤了一切,还再逼你注入,哈哈哈哈哈! 可以试试,只要是输入的关键字都被过滤了,双写也被过滤掉了. 用万能密码发现,or被过滤掉了. 这里用到的是admin为:'=',密码为 ...
- 51Nod1085 0-1背包(一维和二维数组实现)
背包是典型的动态规划问题,关于背包问题的详解,推荐博客:点击打开链接(这篇博客有点错误,代码for循环里错了,不过讲解 的很详细) 题目如下: 在N件物品取出若干件放在容量为W的背包里,每件物品的体积 ...
- 春节前“摸鱼”指南——SCA命令行工具助你快速构建FaaS服务
春节将至,身在公司的你是不是已经完全丧失了工作的斗志? 但俗话说得好:"只要心中有沙,办公室也能是马尔代夫." 职场人如何才能做到最大效能地带薪"摸鱼",成为了 ...
- Nginx系列p2:重载,热部署,日志分割
今天我们来学习 nginx 的 重载.热部署.日志分割功能 重载:当我们需要修改配置文件中的一些值,我们可以直接修改该配置文件,然后重新启动 nginx 服务,就可以实现在 nginx 不停止服务的情 ...