如何在一台电脑上同时运行socket的客户端与服务端

如何在一台电脑上同时运行socket的客户端与服务端,第1张

可以做一个简单的比喻,就像在一个文件夹中不能有两个同名的文件,但是你却可以打开很多个同一个文件socket的原理是:服务器是在本机上新建一个服务端口,比如建一个3128的服务端口,这个时候它就会占住这个端口不让别人再的服务器再使用这个端口客户端是向某一个IP地址请求端口,不需要占服务的端口。即:一个电脑(更严格的说是网卡)上,不能新建2个有相同socket端口的服务器,但是可以有N个连相同端口的客户端

这个嘛得知道各自的ip和程序的编号,
然后服务器绑定自己的ip和编号bind然后监听连接请求 listen 客户端申请所要链接的ip和对方的编号connect
这是tcp
udp就是都绑定各自的ip和程序的编号,谁主动connect,谁就是客户端,服务器端listen就行 ,这个传输数据快,但是不可靠,一般网页播放的媒体影音,就是用。
跨网段,这个不用你 *** 心,协议已经考虑到了。

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等 *** 作都是通过该Socket实现的。
下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
服务器端
#include "stdafxh"
#include <stdioh>
#include <winsock2h>
#include <winsock2h>
#define SERVER_PORT 5208 //侦听端口
void main()

Socket 和ServerSocke 是一对 他们是javanet下面实现socket通信的类
SocketChannel 和ServerSocketChannel是一对 他们是javanio下面实现通信的类 支持异步通信
服务器必须先建立ServerSocket或者ServerSocketChannel 来等待客户端的连接
客户端必须建立相对应的Socket或者SocketChannel来与服务器建立连接
服务器接受到客户端的连接受,再生成一个Socket或者SocketChannel与此客户端通信
不过Socket和SocketChannel可以通过 socketchannel() SocketChannelsocket() 方法相互转换
同理ServerSocket 和ServerSocketChannel 也可以相互转换

一:服务器端代码
namespace SocketServer
{
class Program
{
private static byte[] result = new byte[1024];
private static int myProt = 8885; //端口
static Socket serverSocket;
static void Main(string[] args)
{
//服务器IP地址
IPAddress ip = IPAddressParse("127001");
serverSocket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);
serverSocketBind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口
serverSocketListen(10); //设定最多10个排队连接请求
ConsoleWriteLine("启动监听{0}成功", serverSocketLocalEndPointToString());
//通过Clientsoket发送数据
Thread myThread = new Thread(ListenClientConnect);
myThreadStart();
ConsoleReadLine();
}
/// <summary>
/// 监听客户端连接
/// </summary>
private static void ListenClientConnect()
{
while (true)
{
Socket clientSocket = serverSocketAccept();
clientSocketSend(EncodingASCIIGetBytes("Server Say Hello"));
Thread receiveThread = new Thread(ReceiveMessage);
receiveThreadStart(clientSocket);
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientSocket"></param>
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
while (true)
{
try
{
//通过clientSocket接收数据
int receiveNumber = myClientSocketReceive(result);
ConsoleWriteLine("接收客户端{0}消息{1}", myClientSocketRemoteEndPointToString(), EncodingASCIIGetString(result, 0, receiveNumber));
}
catch(Exception ex)
{
ConsoleWriteLine(exMessage);
myClientSocketShutdown(SocketShutdownBoth);
myClientSocketClose();
break;
}
}
}
}
}
二:客户端代码:
namespace SocketClient
{
class Program
{
private static byte[] result = new byte[1024];
static void Main(string[] args)
{
//设定服务器IP地址
IPAddress ip = IPAddressParse("127001");
Socket clientSocket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);
try
{
clientSocketConnect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口
ConsoleWriteLine("连接服务器成功");
}
catch
{
ConsoleWriteLine("连接服务器失败,请按回车键退出!");
return;
}
//通过clientSocket接收数据
int receiveLength = clientSocketReceive(result);
ConsoleWriteLine("接收服务器消息:{0}",EncodingASCIIGetString(result,0,receiveLength));
//通过 clientSocket 发送数据
for (int i = 0; i < 10; i++)
{
try
{
ThreadSleep(1000); //等待1秒钟
string sendMessage = "client send Message Hellp" + DateTimeNow;
clientSocketSend(EncodingASCIIGetBytes(sendMessage));
ConsoleWriteLine("向服务器发送消息:{0}" + sendMessage);
}
catch
{
clientSocketShutdown(SocketShutdownBoth);
clientSocketClose();
break;
}
}
ConsoleWriteLine("发送完毕,按回车键退出");
ConsoleReadLine();
}
}
}

进入mysql,创建一个新用户xuys:
格式:grant 权限 on 数据库名表名 用户@登录主机 identified by "用户密码";
grant select,update,insert,delete on to xuys@19216888234 identified by "xuys1234";
查看结果,执行:
use mysql;
select host,user,password from user;
可以看到在user表中已有刚才创建的xuys用户。host字段表示登录的主机,其值可以用IP,也可用主机名,
将host字段的值改为%就表示在任何客户端机器上能以xuys用户登录到mysql服务器,建议在开发时设为%。
update user set host = '%' where user = 'xuys';
2、 /mysqladmin -uroot -p21century reload
/mysqladmin -uroot -p21century shutdown
3、/mysqld_safe --user-root &
记住:对授权表的任何修改都需要重新reload,即执行第3步。
如果经过以上3个步骤还是无法从客户端连接,请执行以下 *** 作,在mysql数据库的db表中插入一条记录:
use mysql;
insert into db values('19216888234','%','xuys','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
update db set host = '%' where user = 'xuys';
重复执行上面的第2、3步。

过程大概是KGSocketClient/KGSocketServe 创建了KGNetSession 会话管理进行发送/接收数据的监听会进行一次开启事件 OnStartRecive() 函数回调, 监听到的数据包KGNetPacket 通过KGPackExtension 转化成KGNetData自已定义的数据结构类,然后在KGNetSession里面的 OnReciveData(T) 函数 进行回调

这个好像没啥好说的=。= 自定义的数据类都要继承他

[上传失败(image-3c0ba8-1564388496437)]

因为每条消息包 你不知道他的长度 所以要在前面利用BitConverterGetBytes获取一个包的长度Int值

这个int就站byte[]四个长度 所以HeadLength=4,然后获取到长度了在SetPackLen给PacketBuff赋值上获取到的长度

所有打印都是通过KLog()进行打印的 在别的地方可以在LogEvent就可以获取到打印事件了


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10584014.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-09
下一篇2023-05-09

发表评论

登录后才能评论

评论列表(0条)

    保存