//服务器端
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】 codemap

    pwnable新的一题. download: http://pwnable.kr/bin/codemap.exe ssh codemap@pwnable.kr -p2222 (pw:guest) 这道 ...

  2. grep -w ,grep -e的使用

    1.grep -w -wDoes a word search.grep -w用于字符串精确匹配若文件中的内容包括如下:262 a326226如果 grep ‘26’ file,结果是三行全部都被显示若 ...

  3. idea中使用maven运行wordcount代码

    1.创建maven项目 pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  4. 三十一、SAP中的循环和判断图标和表格的混用

    一.代码如下 二.显示结果如下

  5. VIJOS-P1282 佳佳的魔法照片 排序

    Description 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从 ...

  6. 腾讯云服务器上搭建 2.176.3-1.1 版本的Jenkins,jdk 11

    [root@VM_0_12_centos fonts]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@VM_0 ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++ 接口(抽象类)

    接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至少有一个函数被声明为纯虚 ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 指针

    每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. #include <iostream> using namesp ...

  9. 手动搭建简单的vue项目

    创建项目根目录 切换到根目录下 , 并执行 npm init , 所有选项都默认即可. 安装 webpack webpack-cli vue vue-loader 添加项目结构         

  10. Struts1 的配置文件总结

    一.在web.xml中安装Struts 要想使用Struts,我们接触到的第一个配置文件就是web.xml.实际上,Struts的入口点是一个名为ActionServlet的Servlet.在第一次访 ...