在本文中,我们将讨论使用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。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)