#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <ctype.h>
#define SERV_PORT 7000
//running command: "./server_tcp -p 7001"
int main(int argc, char** argv)
{
int opt
int port = SERV_PORT
while((opt = getopt(argc, argv, "p:")) != -1){
switch (opt){
case 'p': port = atoi(optarg)
break
default: break
}
}
struct sockaddr_in serv_addr, clnt_addr
socklen_t clnt_len
int lfd, cfd
int n, i
char buf[BUFSIZ]
lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
if(lfd <0){
printf("%s\n", "socket error")
exit(1)
}
serv_addr.sin_family = AF_INET
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")
serv_addr.sin_port = htons(port)
bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))
listen(lfd, 128)
clnt_len = sizeof(serv_addr)
cfd = accept(lfd, (struct sockaddr*)&clnt_addr, &clnt_len)
if(cfd == -1){
printf("accept error\n")
if(errno == EAGAIN || errno == EWOULDBLOCK){
printf("normal error")
}else{
printf("innormal error\n")
return -1
}
}
while(1){
n = read(cfd, buf, BUFSIZ)
if(n >0){
printf("receive centent: %s\n", buf)
for(i = 0i <ni++){
buf[i] = toupper(buf[i])
}
}
write(cfd, buf, n)
}
close(cfd)
close(lfd)
return 0
}
客户端可以省略,使用nc命令可以模拟客户端连接: nc 127.1 7001
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
struct sockaddr_in serv_addr
int lfd
lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
serv_addr.sin_family = AF_INET
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")//服务器和客户端IP相同
serv_addr.sin_port = htons(6666)
connect(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))
write(lfd, "hello socket", strlen("hello socket"))
char rbuf[BUFSIZ]
read(lfd, rbuf, BUFSIZ)
printf("rbuf=%s\n", rbuf)
close(lfd)
return 0
}
打开背包向服务器申请数据服务器下发被背包内的物品 ID 、Count(结构体形式以List发送到客户端)
客户端根据接受的ID、Count去本地配置表中配置物品然后显示在背包中
(从服务器接受后在本地查找ID对应的图片 属性 类型后加入Count显示在背包中)
点击物品,将物品ID发送到服务器,服务器扣除物品数量,并将使用物品后所需的效果(如 增加经验、属性等),增加完毕之后将数值返回给客户端,客户端更新背包内容并将对应属性同步刷新显示(如果物品用完 将物品从储存的List中将物品进行删除操作)
服务器向背包发送ID、Count,在本地配置表中生成后 刷新显示到背包中。
客户端发送 角色ID 到客户端,客户端在库中搜索角色
(1).玩家2同意添加好友,玩家2客户端向服务器发送消息,服务器将两 人绑定为好友关系,将数据(玩家ID等)下发到双方客户端,并刷新 显示双方客户端好友列表。
(2).玩家2拒绝添加好友,玩家2客户端向服务器发送消息,服务器向玩 家1发送消息,玩家1客户端显示被拒绝消息提醒。
玩家1向服务器发送消息,服务器取消双方好友关系的绑定,并将数据发回双方客户 端,客户端更新显示好友框。
通常以动态生成和隐藏方式显示,只显示上下5个范围内容。。。。。
客户端向服务器发送消息,服务器判断当前时间,并判断当天是否签到过,如未签到 过,向客户端发送信息,客户端显示签到成功,并修改签到按钮为已经签到,如需领 取签到奖励,参考背包获得物品。
服务器记录账号签到天数,如需要补签将补签日期ID发送到服务器,服务器判定当 天是否签到,未签到则执行签到操作,获取奖励物品。
服务器向客户端发送消息(邮件名、邮件内容、是否有附件、附件ID、Count),客 户端接受信息后显示有新邮件的提示,在本地配置表中填入接受的消息,并显示在邮 件中。客户端点击领取附件(向服务器发送消息,已经领取),并且做背包操作,参 考背包系统获取物品。
玩家1编辑邮件,点击发送按钮,将邮件(名称、内容、是否有附件、附件、收件 人)发送到服务器,服务器在库中索搜收件人,然后参考系统附件邮件操作。
过程大概是KGSocketClient/KGSocketServe 创建了KGNetSession 会话管理进行发送/接收数据的监听会进行一次开启事件 OnStartRecive() 函数回调, 监听到的数据包KGNetPacket 通过KGPackExtension 转化成KGNetData自已定义的数据结构类,然后在KGNetSession里面的 OnReciveData(T) 函数 进行回调
这个好像没啥好说的=。= 自定义的数据类都要继承他
[图片上传失败...(image-3c0ba8-1564388496437)]
因为每条消息包 你不知道他的长度 所以要在前面利用BitConverter.GetBytes获取一个包的长度Int值
这个int就站byte[]四个长度 所以HeadLength=4,然后获取到长度了在SetPackLen给PacketBuff赋值上获取到的长度
所有打印都是通过KLog()进行打印的 在别的地方可以在LogEvent就可以获取到打印事件了
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)