客户端程序和服务器之间通信用的是什么技术?

客户端程序和服务器之间通信用的是什么技术?,第1张

客户端程序和服务器之间通信用这是网络传输层的问题,在传输层上主要就是两种数据包,即为TCP(可靠连接)、UDP(不可靠连接),这个其实与你想要做的服务器和程序设计没有大的关系,不知道你要搭建什么服务器,是windows还是linux 服务器,在windows下面一般是ASPnet +SQL server (很多人现在也在windows下做apacha+php+mysql); 在linux下面是apacha+php+mysql;网站使用的是>如果客户端和服务端协议不一致,那么客户端和服务端之间的通信就会出现问题,因为它们之间可能无法正确地解释互相发送的数据。如果出现这种情况,可以尝试提供一个中间层来充当客户端和服务端之间的翻译,使二者能够相互理解。另外,还可以调整协议以在两者之间建立一致性。无论哪种方式,都需要确保客户端和服务端之间的通信能够正常地进行以确保应用程序的正确运行。

首先,为了便于理解,我们一般把网络分为多个层次,这个层次的概念是很重要的基础概念,你可以参考阅读经典的谢希仁老师翻译的《计算机网络》。 在进程之间的网络通信一般都是在“网络层”即IP层,我们编写程序一般也都是基于这个层次或者这个层次之上的传输层或者应用层。语言(实际上是 *** 作系统和库函数)提供了封装好的函数,让我们可以不用关心链路层以及物理层的细节。 下面逐一回答你的问题: 1)初始化网络环境是什么意思,有什么作用? 为了建立通信连接,我们需要明确当前的网络环境是怎样的,因为和单机系统的进程通信不同,网络进程间通信比较复杂,而且 *** 作系统支持的网络协议也会很多,不同协议的工作方式不同,地址格式也不同。为了解决多重协议的识别问题,我们必须引入一些用于区分的概念并对其初始化。 2)套接字的意思和作用是什么? 套接字提供了对网络连接的一系列封装——虽然你可以自己写,但完全没有必要不是么?它根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。例如TCP/IP的socket提供三种类型套接字(流式、数据报、原始),分别对应面向连接的服务(例如FTP)、无连接服务(例如NFS)和较底层的连接服务(例如IP或者自定义协议),你可以基于套接字提供的封装比较方便的实现网络连接服务。 在IP层次以上网络通信的基本原理和电话或者电报的基本原理是非常相近的。TCP连接类似电话,UDP连接类似电报。 下面我以一些代码片段(注意是帮助理解的片段,不能编译执行)简单地对其进行类比: fd = socket(AF_INET, SOCK_STREAM, 0); addresssin_family = AF_INET; addresssin_addrs_addr = htonl(INADDR_ANY); addresssin_port = htons(1234); address_len = sizeof(address); //这就是在初始化网络环境,类似于你朋友买了一个电话,同时到电信公司申请了号码,然后登记的分机是1234 bind(fd, (struct sockaddr )&address, address_len); //好了,这是做了一个bind(绑定),类似于电信公司把电话号码和你朋友家的哪个端口线连上了。 listenfd = listen(fd, 64) while(1){ 一系列等待客户端的 *** 作,从略 } //这里在服务器端一般会有一个无限循环,服务器会一直等待来自客户端的消息,类似于你朋友一直在等待你的电话。客户端,类似的也有买电话(socket创建)和初始化,我就不写了,预先设定好你要拨打的分机号码是1234 rtval = connect(fd, (struct sockaddr )&address, address_len); //上面的语句表示开始拨打电话了: //如果你的朋友接了电话,通话建立了(上面语句的返回值rtval不为-1),你就可以讲话: writen(fd, (void )data, strlen(data)); //对方讲话,你听: len = readline(fd, (void )data2, 100); //讲完了,挂电话,类似于下面的语句: close(fd); 整体情况大概就是这样,所以可以看到计算机的实现和日常生活是很接近的!希望这可以帮助你理解网络通信。 最后建议阅读TCP/IP详解之卷2(实现),里面很多例子不长但很经典,对于打好基础很有帮助。

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

RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础但它只能用于JAVA程序之间的通讯Hessian和Burlap是caucho公司提供的开源协议,基于>先发服务端的(Server)完整代码如下:
引入命名空间:
[csharp] view plain copy print
using SystemNetSockets;
using SystemNet;
using SystemThreading;
完整代码如下:
[csharp] view plain copy print
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;
}
}
}
}
}
以上是服务端(server)的完整代码。
客户端(Client)的完整代码如下:
引入命名空间:
[csharp] view plain copy print
using SystemNet;
using SystemNetSockets;
using SystemThreading;
完整代码:
[csharp] view plain copy print
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();
}
}
}
编译成功后,先运行 服务端(server),再运行客户端(client)即可达到通信效果。
效果如下图:
该程序已在局域网测试通过。(192168XX)

默认情况下,SQL Server使用1433端口监听,很多人都说SQL Server配置的时候要把这个端口改变,这样别人就不能很容易地知道使用的什么端口了。可惜,通过微软未公开的1434端口的UDP探测可以很容易知道SQL Server使用的什么TCP/IP端口了。不过微软还是考虑到了这个问题,毕竟公开而且开放的端口会引起不必要的麻烦。在实例属性中选择TCP/IP协议的属性。选择隐藏 SQL Server 实例。如果隐藏了 SQL Server 实例,则将禁止对试图枚举网络上现有的 SQL Server 实例的客户端所发出的广播作出响应。这样,别人就不能用1434来探测你的TCP/IP端口了(除非用Port Scan)。


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

原文地址: http://outofmemory.cn/yw/13396359.html

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

发表评论

登录后才能评论

评论列表(0条)

保存