//服务器端
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. 洛谷 P3133 [USACO16JAN]Radio Contact G

    题目传送门 解题思路: f[i][j]表示FJ走了i步,Bessie走了j步的最小消耗值.方程比较好推. 横纵坐标要搞清楚,因为这东西WA了半小时. AC代码: #include<iostrea ...

  2. cf 785#

    23333再次水惨了..(心酸啊) A题呵呵呵呵呵 #include<cstdio> #include<iostream> using namespace std; int m ...

  3. Oracle 组函数count()

    1.count() 函数的参数除了可以是字段值和表达式外,还可以是“ * ”.如果是字段值或表达式,则忽略空值且考虑重复值:如果是“ * ”,则计算所有的行,也包括空值.如果要查询某字段非重复值的个数 ...

  4. Arduino函数

    输入输出函数 pinMode(pin, mode)将数位脚位(digital pin)指定为输入或输出.如:pinMode(7,INPUT); // 将脚位 7 设定为输入模式 digitalWrit ...

  5. request.getParameter() 接收参数中文乱码

    修改tomcat配置文件 设置url编码集 <Connector port="8080" protocol="HTTP/1.1" connectionTi ...

  6. php观察者模式。

    第一次写博客,大家多多关照!欢迎拍砖哦! 我也刚学设计模式,所以记录下来. <?php class person{ public $name; public $birthday; public ...

  7. JAVA-数据类型-复习

    JAVA-数据类型-复习 Java中,一共有8种数据类型,4种整型,2种浮点型,1种用于表示Unicode编码的字符单元的字符类型char,1种布尔类型. 整型 类型 存储需求(字节)一个字节包含8个 ...

  8. JavaScript的函数和对象介绍

    一.JavaScript中的函数 1.函数的概述 JavaScript中的函数是一段可执行代码的合集,在需要执行的时候可以在方法名之后添加一对小括号执行方法.是一段可执行的字符串. 2.函数中隐藏的属 ...

  9. spring源码 BeanFactory根接口

    /* * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Vers ...

  10. html特殊字符的写法

    符号 写法 (空格)   <(小于号) < >(大于号) > " " ®(已注册) ® ©(版权) © ™(商标) ™ (半方大的空白)   (全方大的空白 ...