delphi怎样用socket发送,接受record类型的数据

delphi怎样用socket发送,接受record类型的数据,第1张

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础、各式各样的连接方式、get和set方法、连接过程中的超时以及关闭网络连接等。

在本文中,我们将讨论使用Socket类的基本步骤和方法。一般网络客户端程序在连接服务程序时要进行以下三步操作。

1.连接服务器

2.发送和接收数据

3.关闭网络连接

一、连接服务器

在客户端可以通过两种方式来连接服务器,一种是通过IP的方式来连接服务器,而另外一种是通过域名方式来连接服务器。

其实这两种方式从本质上来看是一种方式。在底层客户端都是通过IP来连接服务器的,但这两种方式有一定的差异,如果通过IP方式来连接服务端程序,客户端只简单地根据IP进行连接,如果通过域名来连接服务器,客户端必须通过DNS将域名解析成IP,然后再根据这个IP来进行连接。

在很多程序设计语言或开发工具中(如C/C++、Delphi)使用域名方式连接服务器时必须自己先将域名解析成IP,然后再通过IP进行连接,而在Java中已经将域名解析功能包含在了Socket类中,因此,我们只需象使用IP一样使用域名即可。

通过Socket类连接服务器程序最常用的方法就是通过Socket类的构造函数将IP或域名以及端口号作为参数传入Socket类中。Socket类的构造函数有很多重载形式,在这一节只讨论其中最常用的一种形式:public Socket(String host, int port)。从这个构造函数的定义来看,只需要将IP或域名以及端口号直接传入构造函数即可。下面的代码是一个连接服务端程序的例子程序:

package mysocket

import java.net.*

public class MyConnection

{

public static void main(String[] args)

{

try

{

if (args.length >0)

{

Socket socket = new Socket(args[0], 80)

System.out.println(args[0] + "已连接成功!")

}

else

System.out.println("请指定IP或域名!")

}

catch (Exception e)

{

System.err.println("错误信息:" + e.getMessage())

}

}

}

在上面的中,通过命令行参数将IP或域名传入程序,然后通过Socket socket = new Socket(args[0], 80)连接通过命令行参数所指定的IP或域名的80端口。由于Socket类的构造函数在定义时使用了throws,因此,在调用Socket类的构造函数时,必须使用try…catch语句来捕捉错误,或者对main函数使用throws语句来抛出错误。

测试正确的IP

java mysocket.MyConnection 127.0.0.1

输出结果:127.0.0.1已经连接成功!

测试错误的IP

java mysocket.MyConnection 10.10.10.10

输出结果:错误信息:Connection timed out: connect

注:10.10.10.10是一个并不存在的IP,如果这个IP在你的网络中存在,请使用其它的不存在的IP。

测试正确的域名

java mysocket.MyConnection www.ptpress.com.cn

输出结果:www.ptpress.com.cn已经连接成功!

测试错误的域名

java mysocket.MyConnection www.ptpress1.com.cn

输出结果:错误信息:www.ptpress1.com.cn

使用Socket类连接服务器可以判断一台主机有哪些端口被打开。下面的代码是一个扫描本机有哪些端口被打开的程序。

Delphi中动态数组是一种使用非常灵活的数据类型,这里探讨几个和地址有关的概念:

1、数组地址:动态数组的数组地址(太拗口了),即动态数组存储数据的地址,一般我们用数组名称直接代替:

比如:

动态数组定义为:

x:array of integer

x本身代表的是数组存储数据的地址。那么问题来了,x是一个变量名称,一般取地址不是@x吗?且看2↓

2、数组变量地址:这个说起来更拗口......动态数组变量的变量地址,怎么说呢?程序中定义了一个变量x(接上节),我们为x这个变量分配了一个地址,对比一下啊:

x:array of integer

y:integer

那么作为一个变量,我们老老实实取变量地址的时候,@x,@y,取出来的值是连续的,并且差值为4

3、数组元素地址:这个可以看作是一个普通变量的地址,取一个数组元素x[0],那么x[0]的取地址为@x[0],既然x是动态数组存储数据的地址,而x[n]是数组元素的地址,那么,x[0]=x,因为x[0]是数组的第一个元素,第一个元素的地址不就是数组存储数据的开始吗?!

综上:

对于定义:

x:array of double

x:表示数组元素存储空间的首地址

@x:表示存储变量名称的地址

x[0]:表示数组的第一个元素

@x[0]:表示数组的第一个元素地址,等同于x

Sql Server远程连接数据库时发生“[DBNETLIB][ConnectionOpen(connect()).]SQL Server 不存在或拒绝访问 ”的情况,原因有很多种,一般情况都是用过检查:

1、 防火墙;

2、1433端口;

来排除故障,但今天发现有以下情况同样会造成这个现象。

排除过程:

1、检查防火墙设置和1433端口设置正确;

2、如果出现“找不到网络路径”的报错,那么最好先PING一下它的IP地址。如果PING不通,那么需要先确认它是否连在网络或者网络连通性是否正常。然后查看是否启用了防火墙或者屏蔽掉了相应的端口。如果PING IP地址是正常的,但PING目标机器的计算机名不通,则需要查看是事网络名称解析有问题。关于如何诊断名称解析问题,可以先查看是所有客户端机器有问题还是某一台机器有问题。如果是所有机器的名称解析都有问题,那么你需要到网络的DNS或WINS服务器上检查了。如果只是某一台机器有问题,你需要先检查一下hosts和lmhosts文件;如果正常,可以重新注册一下DNS名字(ipconfig/reisterdns)。

----正常;

3、如果出现“xxx计算机无法访问,您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限”的报错,这可能是计算机的安全设置被改动过了,导致目标计算机无法被访问。可以采取以下步骤解决:

---存在这个问题,通过以下方法来解决

a. 打开“我的电脑”,在菜单上选择“工具”->“文件夹选项”->“查看”,清除“使用简单文件共享(推荐)”的选择。

b. 右键点击“我的电脑”,选择“管理”,选择“本地用户和组”->“用户”,右键点击Guest用户,选“属性”,清除“帐户已停用”的选择。

c. 点击“开始”->“运行”,输入secpol.msc,选择左边的“本地策略”->“用户权力指派”,双击右边的“从网络访问此计算机”,保证其中有Everyone,双击左边的“拒绝从网络访问此计算机”,保证其是空的。

d. 选择左边的“本地策略”->“安全选项”,a.确认右边的“网络访问:本地帐户的共享与安全模式”为“经典”;b.确认右边的“Microsoft网络客户:为通讯启用数字签名(总是)”为“已停用”;c.确认右边的“Microsoft网络客户:为通讯启用数字签名(如果服务器允许)”为“已启用”;d.确认右边的“Microsoft网络服务器:为通讯启用数字签名(总是)”为“已停用”;e.确认右边的“Microsoft网络服务器:为通讯启用数字签名(如果服务器允许)”为“已启用”。

4、用ODBC连接,结果一切OK。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/55133.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存