//服务器端
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 服务和客户端 例子的更多相关文章

  1. Mina TCP服务端客户端 示例

    服务端代码: package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; im ...

  2. python网络编程TCP服务多客户端的服务端开发

    #服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...

  3. .net for TCP服务端 && 客户端

    关键代码 详细代码请看示例代码 Service //创建套接字 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipaddress), port); / ...

  4. c++ tcp 服务器和客户端例子

    目标:  完成一个精简TCP服务器,可接收来自多个用户的请求,并返回结果. 思路:  (1)服务器      C++ TCP服务器的实现主要由以下几个函数来完成:        a)socket    ...

  5. [javaSE] 网络编程(TCP服务端客户端互访阻塞)

    客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...

  6. vertx 从Tcp服务端和客户端开始翻译

    写TCP 服务器和客户端 vert.x能够使你很容易写出非阻塞的TCP客户端和服务器 创建一个TCP服务 最简单的创建TCP服务的方法是使用默认的配置:如下 NetServer server = ve ...

  7. TCP/IP网络编程之基于UDP的服务端/客户端

    理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...

  8. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流(stream)的套接字.TCP是Transmissi ...

  9. go --socket通讯(TCP服务端与客户端的实现)

    这篇文章主要使用Go语言实现一个简单的TCP服务器和客户端.服务器和客户端之间的协议是 ECHO, 这个RFC 862定义的一个简单协议.为什么说这个协议很简单呢, 这是因为服务器只需把收到的客户端的 ...

随机推荐

  1. 【pwnable.kr】blackjack

    又一道pwnable nc pwnable.kr 9009 读题找到源代码在:http://cboard.cprogramming.com/c-programming/114023-simple-bl ...

  2. nginx的日志切换

    #touch /usr/local/nginx/sbin/cut_nginx_log.sh #chmod 755  /usr/local/nginx/sbin/cut_nginx_log.sh 下面是 ...

  3. PHP页面跳转以及伪登录实例

    PHP页面跳转一.header()函数header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器. header() ...

  4. 对plotTree的解释

    1.>>>a = 1/2/2   >>>a >>>0.25 2.def plotMidText(cntrPt,parentPt,txtString ...

  5. 【iOS】Swift4.0 GCD的使用笔记

    https://www.jianshu.com/p/47e45367e524 前言 在Swift4.0版本中GCD的常用方法还是有比较大的改动,这里做个简单的整理汇总. GCD的队列 队列是一种遵循先 ...

  6. border-radius 在 浏览器开发者工具移动端里是有效的,在真机是无效的。

    border-radius 在 浏览器开发者工具移动端里是有效的,在真机是无效的,怎么解决? 答案是 border-radius:20px !important 加上!important 就好了.

  7. 使用UltraISO(软碟通)制作U盘制作启动盘完整教程

    背景:服务器需要安装系统,但是没有启动盘只有镜像. 前提:U盘和安装镜像准备好 步骤一:首先我们先安装软碟通,完成安装后打开软碟通,文件->打开,打开我们需要制作的iso镜像.如下图(也可下本地 ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 命名空间

    假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等. 同样的情况也出现在 C++ 应用程 ...

  9. spring boot 连接Mysql介绍

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  10. 大二暑假第四周总结--开始学习Hadoop基础(三)

    简单学习云数据库系统架构(以UMP系统为例) 一.UMP系统概述 低成本和高性能的MySQL云数据库方案 二.UMP系统架构 架构设计遵循以下原则: 保持单一的系统对外入口,并且为系统内部维护单一的资 ...