【测试】用socket网络编程写了个聊天程序
pascal吧
全部回复
仅看楼主
level 9
ax_pokl 楼主
2014年02月12日 22点02分 1
level 9
ax_pokl 楼主
附上源码:
[socket_def.inc]
const domain=AF_INET;
_type=SOCK_STREAM;
protocol=IPPROTO_TCP;
var sockfd:longint;
const backlog:longint=100;
const ports=9313;//服务器端口
portc=8795;//客户端端口
const ips=699574464;//服务器IP
ipc=749906112;//客户端IP
var addrs:TInetSockAddr=(family:domain;port:ports;addr:ips);
addrc:TInetSockAddr=(family:domain;port:portc;addr:ipc);
const addrlens:longint=sizeof(addrs);
addrlenc:longint=sizeof(addrc);
const flags=0;
var sockin,sockout:text;
var buff:string;
[socket_service.pas]
program socket_service;
uses sockets;
{$I socket_def.inc}
var addrlen:longint;
begin
sockfd:=socket(domain,_type,protocol);
bind(sockfd,addrs,addrlens);
listen(sockfd,backlog);
accept(sockfd,addrc,sockin,sockout);
reset(sockin);
rewrite(sockout);
writeln('Service online. Please type in message.');
repeat
write('Service send: ');
readln(buff);
writeln(sockout,buff);
write('Client recv: ');
readln(sockin,buff);
writeln(buff);
until false;
close(sockout);
close(sockin);
end.
[socket_client.pas]
program so_cket_client;
uses sockets;
{$I socket_def.inc}
begin
sockfd:=socket(domain,_type,protocol);
bind(sockfd,addrc,addrlenc);
connect(sockfd,addrs,sockin,sockout);
reset(sockin);
rewrite(sockout);
writeln('Client online. Please wait for message.');
repeat
write('Service recv: ');
readln(sockin,buff);
writeln(buff);
write('Client send: ');
readln(buff);
writeln(sockout,buff);
until false;
close(sockout);
close(sockin);
end.
2014年02月12日 22点02分 2
level 13
前排
围观
2014年02月13日 01点02分 4
level 9
ax_pokl 楼主
加了个多线程,目前支持读取消息同时发送消息。
注意socketsh.inc里有个{$ifdef legacysocket}编译开关需要关掉,否则所有socket有关的函数都必须加fp,比如bind()要用fpbind()。
[socket_def.inc]
uses sockets,windows;
var tid:longword;
var sendthread,recvthread:boolean;
const domain=AF_INET;
_type=SOCK_STREAM;
protocol=IPPROTO_TCP;
var sockfd:longint;
const backlog:longint=100;
const ports=9313;//服务器端口
portc=8795;//客户端端口
const ips=749906112;//服务器IP
ipc=699574464;//客户端IP
var addrs:TInetSockAddr=(family:domain;port:ports;addr:ips);
addrc:TInetSockAddr=(family:domain;port:portc;addr:ipc);
const addrlens:longint=sizeof(addrs);
addrlenc:longint=sizeof(addrc);
const flags=0;
var sockin,sockout:text;
var buff:string;
procedure sendmessage;
begin
sendthread:=true;
readln(buff);
writeln(sockout,buff);
sendthread:=false;
end;
procedure recvmessage;
begin
recvthread:=true;
readln(sockin,buff);
writeln(buff);
recvthread:=false;
end;
[socket_service.pas]
program socket_service;
{$I socket_def.inc}
begin
sockfd:=socket(domain,_type,protocol);
bind(sockfd,addrs,addrlens);
listen(sockfd,backlog);
accept(sockfd,addrc,sockin,sockout);
reset(sockin);
rewrite(sockout);
writeln('Service online. Please type in message.');
repeat
if not sendthread then createthread(nil,0,@sendmessage,nil,0,tid);
if not recvthread then createthread(nil,0,@recvmessage,nil,0,tid);
sleep(1);
until buff='end';
close(sockout);
close(sockin);
end.
[socket_client.pas]
program so_cket_client;
{$I socket_def.inc}
begin
sockfd:=socket(domain,_type,protocol);
//bind(sockfd,addrc,addrlenc);
while not connect(sockfd,addrs,sockin,sockout) do ;
reset(sockin);
rewrite(sockout);
writeln('Client online. Please wait for message.');
repeat
if not sendthread then createthread(nil,0,@sendmessage,nil,0,tid);
if not recvthread then createthread(nil,0,@recvmessage,nil,0,tid);
sleep(1);
until buff='end';
close(sockout);
close(sockin);
end.
2014年02月13日 03点02分 5
服务器端IP和端口是必须要知道的,因为服务器端必须打开这个IP和端口监听信号,然后客户端连接上这个指定的IP和端口,而客户端的IP则不需要指定。
2014年02月13日 03点02分
@ax_pokl:"bind(sockfd,addrs,addrlens);"addrs类型不对是怎么回事(Lazarus)?
2015年06月13日 11点06分
level 13
赞,能打成rar发给我吗。[email protected]
2014年02月13日 03点02分 6
2014年02月13日 04点02分
level 13
service闪退
2014年02月13日 07点02分 7
IP必须有,得重新编译。
2014年02月13日 20点02分
回复 ax_pokl :关键是我输127.0.0.1会编译错误
2014年02月14日 03点02分
level 12
嗯,界面很不友好
2014年02月13日 08点02分 8
level 12
嗯,界面很野蛮
2014年02月13日 09点02分 9
level 13
如果有ui,便是极好的。
2014年02月13日 09点02分 10
level 14
斯锅咦~
虽然源代码一点都没看懂,但不明觉厉啊~
对了,能不能帮我写一个回帖的工具,就是那种抢楼活动时用的。
输入帖子的地址,自动回复100楼之类的,最好多几个选择。
谢谢。
2014年02月14日 05点02分 11
额,许多爆吧软件都支持的
2014年02月14日 06点02分
www.2a ia.com你可以在里面找
2014年02月14日 06点02分
我只知道一种回复12楼的方法,超过12楼会被系统暂时屏蔽。
2014年02月16日 03点02分
回复 ax_pokl :我要啊。
2014年02月16日 03点02分
level 14
对了,你学这个用的是什么教材?
2014年02月14日 05点02分 12
fp自带的units.pdf。
2014年02月16日 03点02分
回复 ax_pokl :初三英语渣路过
2014年02月16日 03点02分
同上
2014年10月08日 12点10分
level 11
好顶赞
2014年02月14日 07点02分 14
发现
2014年02月16日 11点02分
level 12
大神解释下原理呗[委屈]
2014年02月14日 10点02分 15
服务器端:socket();创建套接字(协议),bind();绑定套接字和IP,listen();监听,accept();接受请求。
2014年02月14日 22点02分
客户端:socket();创建套接字,connect();连接。
2014年02月14日 22点02分
关键是addrs,这是个record,结构比较复杂,定义了IP地址,端口号灯信息。
2014年02月14日 22点02分
对网络的东西不太理解[委屈]
2014年02月15日 00点02分
level 12
界面。。。用lazarus怎么样,delphi与fp不知是否通用
2014年02月14日 10点02分 16
必须通用的。
2014年02月14日 22点02分
回复 ax_pokl :有些库函数不一样
2014年02月15日 00点02分
回复 fp4869 :确实是,不过既然fp是开源的,把单元库源码直接复制过去不就能用了?
2014年02月16日 03点02分
level 1
我只是个初学者,求大师解释原理!!!!![乖]
2014年02月14日 10点02分 17
level 11

顶一个
2014年02月16日 11点02分 18
level 12
解决了我长久以来的困扰!好顶赞,我的laz互联网计划可以正式开启啦!OwO
2014年02月18日 09点02分 19
level 15
话说新人小盆友不会用咋办。。
2014年02月19日 04点02分 20
level 1
点赞,有空测试(校友你好[太开心]
2014年02月20日 14点02分 21
level 7
围观
2014年02月22日 08点02分 22
1 2 尾页