当前位置:文档之家› tcp的java通信

tcp的java通信

tcp的java通信
tcp的java通信

未曾那么爱你

实验课堂上,大家都在忙什么?

中国纺织工程网

萝莉变御姐的历练

轻博客

椅边树,四季的等候

荷舞东风

喵星人,地球上最萌的动物

Dear-魑魅

法国——浪漫的国度

微笑末见

查看更多>>

相关博文

家是心里那盏永不熄灭的灯

新浪Qing

青春是一场久治不愈的病

新浪Qing

《月色狰狞》:悬疑细腻犹胜《

言小夫

日本从社会“无核”走向政治“

日本新華僑報總編蔣豐

新婚夜弄脏床我遭洁癖婆婆侮辱

雨中竹

犀利哥成为湖人X因素,莫雷不

火箭大帝

让男人爱到痴迷的5种女人

健康达人

5月7 新派木须肉&

谁是美狗?

坐着赚钱

赖床不吃早餐的儿子咋会被母亲赵化鲁

更多>>

推荐博文

冥王星5大奇特之处:地表零下2 艾利

俄美女酷似芭比娃娃,蹿红网络杨孝文

恶心与郁闷:全球八大最怪异科百科汇

古洞穴发现神秘细菌可拯救人类康斯坦丁

谷歌正式推出在线云储存服务Go 飞刀李

最新研究发现人类祖先脱毛是为星光

十种奇美的螃蟹

杨孝文

谷歌称未来数周结束Android版C 飞刀李

Facebook被指贵得离谱:盈利增飞刀李

国内移动操作系统之争进入白热刘兴亮

人死前1秒的14种感受

可安乐死的过山车

浪漫无比的“爱情隧道”

普京授权研发僵尸枪

正文字体大小:大中小

基于TCP/IP协议的Socket JAVA编程

(2011-10-22 12:52:19)

转载▼

分类:Android_SDK

基于TCP/IP协议的Socket编程

1 TCP/IP协议

2 套接字(Socket)

2.1 Client/Server模式

2.2 套接字(Socket)概念

3 Socket类和ServerSocket类

3.1 Socket类

3.2 ServerSocket类

4 Socket编程应用举例

4.1 Socket编程的基本步骤

4.2单客户/服务器Socket编程应用举例

4.3多客户/服务器Socket编程应用举例本章小结

1 TCP/IP协议

TCP/IP协议(传输控制协议/网际协议)是一种网络通信协议,是一种面向连接的可靠的传输协议。它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据传输格式以及传送方式。TCP/IP是Internet的基础协议。ν

TCP/IP协议的基本传输单位是数据包(datagram)。TCP协议负责把数据分成若干个datagram,并给每个datagram加上包头;IP在每个包头上再加上接收端主机地址,以确定数据传输的目的地。如果传输过程中出现数据丢失或数据失真等异常情况,TCP协议会自动要求数据重发,并重新分包。TCP保证数据传输的质量,IP协议保证数据的传输。ν

TCP/IP协议数据的传输是基于TCP/IP模型的4层结构:应用层、传输层、网络层和网络接口层。ν

在TCP/IP协议组中两种主要协议

1、传输层协议ν

有两个主要的传输层协议:传输控制协议(TCP)和用户数据报协议(UDP)。ν

TCP传输数据建立在面向连接的基础上,实现了一种“虚电路”的概念。双方通信之前,先建立连接,然后双方即可在其上发送数据流,发送完毕后再关闭连接。这种数据交换方式的优点是效率高,缺点是建立连接和关闭连接需要额外的开销。ν(1)传输控制协议(TCP)ν(1)TCP协议主要提供下列服务:

可靠的数据传输ν

面向连接的虚电路ν

缓冲的传输ν

重新排序ν

多路复用技术ν

高效的、全双工传输ν

流量控制ν

TCP协议提供的是一种可靠的数据流服务。得到的是一个顺序的无差错的数据流。ν

(2)用户数据报协议(UDP)。UDP是比TCP简单得多的协议,是对IP协议组的扩充。

由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地址机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用UDPν的“端口号”完成的。源端口号标识了请求域名服务的本地计算机的应用程序,同时需要将所有由目的主机生成的响应包都指定到源主机的这个端口上。

(3)UDP与TCP比较

与TCP不同,UDP提供的是面向无连接、“不可靠”的数据报服务。它不提供对IP 协议的可靠机制、流控制以及错误恢复功能等。ν

由于UDP比较简单,比TCP负载消耗少。主要用于不需要TCP排序和流量控制能力而是自己完成这些功能的应用程序。

2、应用层协议

在应用层中定义了许多高层协议:ν

(1)TELNET(远程终端访问)。TELNET连接是一个TCP连接。允许一台计算机上的用户登录到远程计算机上并进行交互。支持终端到终端的连接及进程到进程分布式计算的通信。νFTP使得主机间可以共享文件。FTP使用TCP生成一个虚拟连接用于控制信息,然后再生成一个单独的TCP连接用于数据传输。FTP主要提供文件共享、支持间接使用远程计算机、使用户不因各类主机文件存储器系统的差异而受影响、可靠且有效的传输数据等功能。ν(2)FTP(文件传输协议)ν

SMTP支持在因特网上传递电子邮件,用于可靠且有效的数据传输。它保证把各种类型的电子邮件通过这一协议从一台邮件服务器发送到另一台邮件服务器上。ν(3)SMTP(简单邮件传输协议)ν

DNS提供域名到IP地址的转换,允许对域名资源进行分散管理。ν(4)DNS(域名服务)ν是Web浏览器和Web服务器之间通信的标准协议。它指明客户端如何与服务器建立连接,客户端如何从服务器请求数据,服务器如何响应请求,最后连接如何关闭等。HTTP连接是一个TCP连接。ν(5)HTTP(超文本传输协议)ν

TCP/IP模型中还有其他一些协议,如地址解析协议(ARP)、因特网控制消息协议(ICMP)等。ν

2 套接字(Socket)

套接字允许程序员把网络连接当成一个流(Stream),并向这个流读写字节。Socket对程序员掩盖了网络的低层细节,如纠错、包大小、包重传、网络地址等。本节将介绍Client/Server 模式、套接字(Socket)概念。ν

2.1 Client/Server模式

计算机网络最重要的3个功能是数据通信、资源共享和分布处理。为了满足这些功能需求,计算机网络产生了两种重要的应用模式:客户端/服务器(Client/Server,C/S)模式和浏览器/服务器(Brower/Server,B/S)模式。采用何种应用模式在编程实现时非常重要。下面将主要介绍C/S模式。ν

在C/S模式下,客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。其工作方式可通过现实生活中一个例子来说明。在一个酒店中,顾客向服务员点菜,服务员把点菜单通知厨师,厨师按点菜单做好菜后让服务员端给顾客,这就是一种C/S工作方式。如果把酒店看作一个系统,服务员就是客户端,厨师就是服务器,这种系统分工和协同工作的方式就是C/S的工作模式。ν

由此可见,工作在C/S模式下的系统被分成两大部分:ν

(1)客户端部分:为每个用户所专有的,负责执行前台功能。ν

(2)服务器部分:由多个用户共享的信息与功能,招待后台服务。ν

C/S模式的建立基于以下两点:νC/S模式建立的基础

一是建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。

二是网间进程通信完全是异步的,相互通信的进程既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程建立联系,为二者的数据交换提供同步,这就是基于C/S的TCP/IP。ν

图 1 基于C/S模式系统结构

C/S模式在操作过程中采取“请求/响应”的工作模式。当用户需要访问服务器资源时由客户端发出请求,服务器接收到请求后做出响应,然后执行相应的服务,把执行结果返回到客户端,再由客户端作一定处理后返回给用户。执行过程如下:

(1)服务器侦听相应端口的请求;ν

(2)客户端发出一个请求;ν

(3)服务器接收到此请求;ν

(4)服务器处理这个请求,并把处理结果返回给客户端。ν

从上面所描述的过程可知:客户与服务器进程的作用是非对称的,因此编码不同。服务进程一般是先于客户请求而启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。ν

2.2 套接字(Socket)概念

但由于分组长度有限,通常必须将数据分解为多个分组,在目的地再重新组合。在传输过程中,有可能发生一个或多个分组丢失或被破坏的情况,此时就需要重传分组。或者分组乱序到达,则需要重新排序。这些工作将是非常繁重的。ν数据在Internet中是以有限大小的分组的形式传输的。一个分组是一个数据报,包括首部和负载。首部包含目的的地址和端口、源地址和端口以及用于保证可靠传输的各种其他管理信息。负载包含数据本身。ν

幸运的是,套接字(Socket)的出现使我们不必关心这些事情,我们只需要把网络看成一个流,就象对文件操作一样对这个流进行操作就行了。

套接字(Socket)是网络协议传输层提供的接口。Socket是两个程序之间进行双向数据传输的网络通讯端点,有一个地址和一个端口号来标识。每个服务程序在提供服务时都要在一个端口进行,而想使用该服务的客户机也必须连接该端口。

图2 基于

Socket的点对点通信

目前共有两种套接字

流套接字提供一个面向连接的、可靠的数据传输服务,保证数据无差错、无重复、按顺序发送。具有流量控制功能。数据被看作字节流,无长度限制。TCP即是一种基于流套接字的通信协议。ν

数据报套接字提供一个面向无连接的数据传输服务,不保证数据传输是可靠的、有序的、无重复的。UDP即是一种基于数据报套接字的通信协议。ν

本章主要介绍基于TCP/IP协议的C/S模式下的Socket编程。ν

图3 基于TCP/IP的Socket通信模式

值得注意的是,习惯上将低于1024的端口号保留给系统服务使用。ν在该种模式下,Socket 可以看成是在两个程序进行通信连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送到另外一个Socket中,使这段信息能传送到其他程序。每一个基于TCP/IP的程序都赋予了一个端口号(0~65535),通过不同的端口号,区别服务器上运行的每一个应用程序和所提供的服务。

在两个网络应用程序发送和接收信息时都需建立一个可靠的连接,流套接字依靠TCP来保证信息正确到达目的地。实际上,IP分组有可能在网络中丢失或者在传送过程中发生错误。当任何一种情况发生时,作为接收方的TCP将请求发送方TCP重发这个IP分组。因此,两个流套接字之间建立的连接是可靠的连接。ν

Socket可进行的基本操作

(1)连接远程主机ν

(2)发送数据ν

(3)接收数据ν

(4)关闭连接ν

(5)绑定端口ν

(6)侦听入站数据ν

(7)在所绑定端口上接收远程主要的连接ν

利用Socket编程的一般步骤:

(1)分别为服务器和客户端创建Socket对象,建立Socket连接。

(2)打开连接到Socket的输入输出流。Socket对象包含两个流:一个是输入流,表示流入的数据流,其作用是接收数据;一个是输出流,表示流出的数据流,其作用是向外发送数据,其流操作与I/O流相同。ν

(3)按照一定的协议对Socket进行读/写操作,在本章里是基于TCP/IP协议;

(4)读/写操作结束后,关闭Socket连接。

3 Socket类和ServerSocket类

在Java语言中,服务器端Socket使用ServerSocket类,客户端Socket使用Socket类,由此来区别服务器端和客户端。ν

3.1 Socket类

https://www.doczj.com/doc/bc10594786.html,ν .Socket类是Java用来实现客户端TCP操作的基础类,在Java编程中一切与TCP有关的操作包括连接的建立、传输、连接关闭及Socket选项的设置都由Socket类负责,这个类本身使用直接代码通过主机操作系统的本地TCP栈进行通信。Socket类的输入输出都是通过流来实现的。 Socket类常用方法如下:

1.Socket类的构造函数

(1)public Socket(String host,int port) throws UnknownHostException,ν功能:在客户端以指定的服务器host和端口号port创建一个Socket对象,并向服务器发出连接请求。νIOException 参数:ν

host:服务器主机名。

port:端口号。

若域名服务器无法解析该服务器名或域名服务器没有运行,此时host无法可知,则抛出UnknownHostException异常;若生成Socket时发生I/O错误则抛出IOException异常。ν(2)public Socket(InetAddress address,int port) throwsν功能:在客户端以指定的服务器地址address和端口号port创建一个Socket对象,并向服务器发出连接请求。νIOException

参数:ν

address:服务器IP地址。

port:端口号。

若生成Socket时发生I/O错误则抛出IOException异常。ν

(3)public Socket(String host,int port,boolean stream) throwsν功能:在客户端以指定的服务器host和端口号port创建Socket对象,并向服务器发出连接请求。如果stream值为true,则创建流Socket对象,否则创建数据报SocketνIOException 对象。

参数:ν

host:服务器名。

port:端口号。

stream:创建流Socket对象或创建数据报Socket对象的标志。

若生成Socket时发生I/O错误则抛出IOException异常。ν

(4)public Socket(InetAddress address,int port,boolean stream) throwsν功能:在客户端以指定的服务器IP地址address和端口号port创建Socket对象,并向服务器发出连接请求。如果stream值为true,则创建流Socket对象,否则创建数据报SocketνIOException 对象。

参数:ν

address:服务器IP地址。

port:端口号。

stream:创建流Socket对象或创建数据报Socket对象的标志。

若生成Socket时发生I/O错误则抛出IOException异常。ν

(5)public Socket(InetAddress address,int port,InetAddress localAddr,intνthrowsνlocalPort) 功能:生成一个Socket并且连接到由address指定的服务器的端口port上。该Socket将捆绑到由localAddr指定的本地主机的localPort端口上。νIOException

参数:ν

address:服务器IP地址。

port:端口号。

localAddr:本地主机的IP地址。

localPort:本地主机上的端口号。

若生成Socket时发生I/O错误则抛出IOException异常。ν

(6)public Socket(String host,int port, InetAddress localAddr,int localPort)ν throwsν功能:生成一个Socket并且连接到由host指定的服务器的端口port上。该Socket将捆绑到由localAddr 指定的本地主机的localPort端口上。νIOException

参数:ν

host:服务器名。

port:端口号。

localAddr:本地主机的IP地址。

localPort:本地主机上的端口号。

若生成Socket时发生I/O错误则抛出IOException异常。ν

(7)protected Socket(SocketImpl impl) throwsν功能:根据用户指定的SocketImpl生成一个无连接的socket。νSocketException

参数:ν

impl:子类希望用在Socket上的SocketImpl 实例。

建立无连接失败时抛出SocketException异常。ν

客户端流Socket的创建可通过使用Socket类的构造函数完成。构造函数不仅可以创建Socket 对象,并且会尝试连接服务器端的Socket。可通过这个方法测试某个端口的连接是否允许。ν

2.与Socket数据读写有关的常用方法

(1)public InetAddress getInetAddress()ν

功能:获取创建socket连接时指定服务器的IP地址。ν

(2)public InetAddress getLocalAddress()ν

功能:获取创建socket连接时客户端主机的IP地址。ν

(3)public int getPort()ν

功能:获取创建Socket连接时指定的服务器的端口号。ν

(4)public int getLocalPort()ν

ν功能:获取创建Socket连接时客户端的端口号。

(5)public InputStream getInputStream() throws IOExceptionν

功能:为当前的socket对象创建输入流。ν

(6)public OutputStream getOutputStream() throws IOExceptionν

功能:为当前的socket对象创建输出流。ν

(7)public String toString()ν

功能:转换该Socket成一个String.字符串表示。ν

3.关闭Socket连接的方法

public synchronized void close() throws IOExceptionν

功能:关闭建立的Socket连接。当通信结束时,应调用该方法关闭Socket连接。若在关闭Socket连接时发生I/O错误则抛出IOException异常。ν

【例1】

//创建socket连接后获取socket连接的相关信息

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class SocketInfo {

public static void main(String args[]){

try{

Socket sktobj = new Socket("https://www.doczj.com/doc/bc10594786.html,",8080);

System.out.println("1:connect to "+sktobj.getInetAddress()+"on port "+sktobj.getPort()); System.out.println("2:from port "+sktobj.getLocalPort()+" of"+sktobj.getLocalAddress()); }

catch(UnknownHostException e){System.out.println(e);}

catch(IOException e){System.out.println(e);}

}

}

运行结果:

图4

【例2】

//客户端向服务器发送一个字符串,服务器接收并返回

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class SocketAppClient{

public static void main(String args[]){

int port=134;

try{

Socket sc = new Socket("127.0.0.1",port);//创建本地socket连接

OutputStream out = sc.getOutputStream();

DataOutputStream dout = new DataOutputStream(out);

//获取输出流,并创建相应的数据输出流

dout.writeUTF("Tom"); //将tom写入输出流

InputStream in = sc.getInputStream();

DataInputStream din = new DataInputStream(in);

//获取输入流,并创建相应的数据输入流

String str = din.readUTF();

System.out.println(str);

in.close();

out.close();

sc.close();

}

catch(UnknownHostException e){System.out.println(e);}

catch(IOException e){System.out.println(e);}

}

}

运行结果:单方通信,缺服务器

图5

3.2 ServerSocket类

ServerSocket类用在服务器端,侦听和响应客户端的连接请求,并接收客户端发送的数据。ServerSocket类的主要任务是在服务器端耐心地等候客户端的连接请求,一旦客户端应用程序申请建立一个Socket连接,ServerSocket类就会通过accept()方法返回一个对应的服务器端Socket对象,以便进行直接通信。从两台计算机连接成功时起,服务器端与客户端就得到了一个真正的“Socket-Socket”连接。ν

1.ServerSocket类构造函数

(1)public ServerSocket(int port) throws IOExceptionν

功能:创建一个指定端口号的服务器端的socket。请求连接队列的最大队列长度为50,若连接请求到达时队列已满,则拒绝连接。端口号为0指在任何空闲端口上创建socket。νport:端口号。ν参数:ν

若无法创建Socket并绑定于所请求的端口号则抛出IOException异常。ν

(2)public ServerSocket(int port,int backlog) throws IOExceptionν

功能:创建一个指定端口号的服务器端的socket。请求连接队列的最大队列长度设置为backlog,若连接请求到达时队列已满,则拒绝连接。端口号为0指在任何空闲端口上创建

socket。ν

ν参数:

port:端口号。ν

νbacklog:请求连接队列的最大长度。

若无法创建Socket并绑定于所请求的端口号则抛出IOException异常。ν

(3)public ServerSocket(int port,int backlog,InetAddress bindAddr) throwsν IOException

功能:创建一个指定端口号的服务器端的socket。请求连接队列的最大队列长度设置为backlog,若连接请求到达时队列已满,则拒绝连接。端口号为0指在任何空闲端口上创建socket。与其它构造函数不同的是,该构造函数要指定要绑定到的本地IP地址。主要用于在多IP地址系统上运行的服务器。此时,它允许先把所侦听的地址,服务器Socket只在指定的地址侦听入站连接,不会侦听通过主机其他地址进入的连接。其他构造函数默认绑定本地主机的所有IP地址。当bindAddr为null时,缺省地接受对任何所有本地IP地址的连接。νν参数:

port:端口号。ν

νbacklog:请求连接队列的最大长度。

bindAddr:将捆绑到的本地IP地址.

若无法创建Socket并绑定于所请求的端口号则抛出IOException异常。ν

【例3】

//采用ServerSocket类查询端口号为130~140的端口号中哪个端口可创建连接。

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class PortScan2{

public static void main(String args[]){

String host="localhost";

for(int i=130;i<140;i++)

try{ServerSocket a=new ServerSocket(i);

//在端口号i创建连接

System.out.println("there is a server on port:"+i);

//若可以创建连接,则输出提示信息

}catch(IOException e){System.out.println(e);

}//若端口已被占用,则抛出异常

}

}

运行结果:断口号为135的端口已被占用,当试图在端口135建立连接时抛出异常,即端口已被绑定.

图6

2.ServerSocket类的常用方法

功能:获取服务器端Socket的IP地址。ν(1)public InetAddress getInetAddress()

功能:获取服务器正侦听的端口号。ν(2)public int getLocalPort()

(3)public Socket accept() throws 功能:在服务器端指定端口侦听客户端发出的连接请求并与之连接。该方法一直阻塞直到连接成νIOException功。该方法返回一个新的Socket对象,通过该对象与客户端进行通信。若等待连接时发生I/O错误则抛出IOException异常。

功能:返回该socket的字符串表示ν(4)public String toString()

3.关闭Socket连接的方法

public void close() throws IOException

功能:关闭该socket连接。当服务器需要关闭,不处理任何其他入站连接时,调用该方法。若关闭socket时发生I/O错误则抛出IOException异常。

【例4】

//与8.2对应的服务器端程序

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class SocketAppServer{

public static void main(String args[]){

ServerSocket ss = null;

int port = 134;

String hello = "From Server:Hello World!";

try{

ss = new ServerSocket(port);

//建立服务器Socket连接,其侦听端口为port,port与客户端相同

}

catch(IOException e){

System.out.println(e);//若端口已被占用,则抛出异常

System.exit(1);

}

while(true){

try{

System.out.println("正在等待连接端口port=" + port + "...");

Socket cs = ss.accept();

InputStream in = cs.getInputStream();

DataInputStream din = new DataInputStream(in);

//获取输入流,并创建相应的数据输入流

String name = din.readUTF();

OutputStream out = cs.getOutputStream();

DataOutputStream dout = new DataOutputStream(out);

//获取输出流,并创建相应的数据输出流

dout.writeUTF(hello+"Your name:" + name);//将字符串写入输出流

System.out.println("已成功连接端口port=" + port);

System.out.println("========================================="); in.close();

out.close();

cs.close();

}

catch(IOException e){

System.out.println(e);//若端口已被占用,则抛出异常

}

}

}

}

运行结果:

(1)首先运行例4的服务器端程序

图 7

(2)运行例2的客户端程序

图8 客户端

图9 服务器端变化 4 Socket编程应用举例

4.1 Socket编程的基本步骤

1.服务器端应用程序编写步骤

(1)创建一个等待连接的ServerSocket对象,如Sersocket;

(2)调用Sersocket对象的accept()方法侦听接收客户端的连接请求。当侦听到一个客户的连接请求时,连接成功,并返回一个用于通信的Socket对象;

(3)创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流;

(4)通过数据输入输出流与客户端进行数据读写,完成双向通信;

(5)当客户端断开连接时,关闭各个流对象,结束通信。(2)~(5)可循环执行。2.客户端应用程序编写步骤ν

(1)创建指定服务器上指定端口号的Socket对象;ν

(2)创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流;ν

(3)通过数据输入输出流与服务器端进行数据读写,完成双向通信;ν

(4)通过调用close()方法关闭与服务器端的连接,并关闭各个流对象,结束通信。ν

4.2单客户/服务器Socket编程应用举例

【例5】ν

编写一个基于TCP协议的Socket网络点对点聊天程序,可实现客户端和服务器端信息的互发。

1.服务器端程序talkserver.javaν

//点对点聊天程序,服务器端

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class talkserver{

public static void main(String args[]){

ServerSocket server = null;

Socket socket;

String s;//中间字符串

int port = 2000;

String hello = "From Server:Hello World!";

try{

server = new ServerSocket(port);

//建立服务器Socket连接,其侦听端口为port,port与客户端相同

System.out.println("正在等待连接端口port=" + port + "...");

socket = server.accept();

System.out.println("已成功连接端口port=" + port);

System.out.println("=========================================");

InputStream in = socket.getInputStream();

DataInputStream din = new DataInputStream(in);

//获取输入流,并创建相应的数据输入流

OutputStream out = socket.getOutputStream();

DataOutputStream dout = new DataOutputStream(out);

//获取输出流,并创建相应的数据输出流

BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

System.out.println("请等待客户发送信息...");

while(true){

System.out.println("");

s = din.readUTF(); //读入从client传来的字符串

System.out.println("从客户端接收的信息为:" + s);//显示字符串

if(s.trim().equals("BYE")) {System.out.print("通话结束" );break;}

System.out.println("");

System.out.print("请输入要发送的信息:" );//显示字符串

s = sin.readLine(); //读入从client传来的字符串

dout.writeUTF(s);

if(s.trim().equals("BYE")) {System.out.print("通话结束" );break;}

}

din.close();

dout.close();

in.close();

out.close();

socket.close();

}

catch(IOException e){

System.out.println("Error" + e);//若端口已被占用,则抛出异常

System.exit(1);

}

}

}

程序分析:

程序首先在端口2000上创建一个等待连接请求的ServerSocket对象sever:

server=new ServerSocket(2000);

接着调用Server对象的accept()方法等待某客户程序发出的连接请求。该方法一直阻塞直到有客户连接到该端口。一旦有客户发送正确请求,则连接成功,accept()方法返回一个Socket 对象,于是得到一个新的用于通信的Socket对象,通信链路建立成功.然后利用Socket类提供的getInputStream()和getOutputStream()方法创建与Socket对象绑定的输入/输出流.此后即可与客户进行通信,直到客户端断开连接即关闭各个流结束通信.

2.客户端程序talkclient.java

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class talkclient{

public static void main(String args[]){

Socket socket;

String s;

int port = 2000;

try{

//向本地服务器申请连接

//注意端口号要和服务器的一致

socket = new Socket("localhost",port);//localhost=127.0.0.1

System.out.println("连接成功");

System.out.println("=========================================");

System.out.println("");

//获得对应Socket的输入/输出流

InputStream in = socket.getInputStream();

DataInputStream din = new DataInputStream(in);

//获取输入流,并创建相应的数据输入流

OutputStream out = socket.getOutputStream();

DataOutputStream dout = new DataOutputStream(out);

//获取输出流,并创建相应的数据输出流

BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

while(true){

System.out.print("请输入要发送的信息:" );//显示字符串

s = sin.readLine(); //读入从client传来的字符串

dout.writeUTF(s);

if(s.trim().equals("BYE")) {System.out.print("通话结束" );break;}

System.out.println("");

s = din.readUTF(); //读入从client传来的字符串

System.out.println("从服务器接收的信息为:" + s);//显示字符串

if(s.trim().equals("BYE")) {System.out.print("通话结束" );break;}

System.out.println("");

}

din.close();

dout.close();

in.close();

out.close();

socket.close();

}

catch(IOException e){

System.out.println("Error" + e);//若端口已被占用,则抛出异常

System.exit(1);

}

}

}

运行结果:

(1) 运行服务器端程序talkserver.java

(2)运行客户端程序talkclient.java

(3)客户端向服务端发送信息

(4)结束连接

4.3多客户/服务器Socket编程应用举例

【例6】ν

多客户/服务器程序。

1.服务器端程序ν

(1)ServerSocketThread.java:线程类的子类,为客户提供服务的所有操作都封装在该类中,该类的构造函数ServerSocketThread(Socket s)接收一个Socket对象,用来与客户进行数据通信。

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class ServerSocketThread extends Thread{

private Socket socket;

private DataInputStream din;

private DataOutputStream dout;

public ServerSocketThread(Socket s) throws IOException{

socket = s;

din = new DataInputStream(socket.getInputStream());

dout = new DataOutputStream(socket.getOutputStream());

start();

}

public void run(){

String str;

try{

System.out.println("连接成功");

System.out.println("=========================================");

System.out.println("请等待客户发送信息...");

System.out.println("");

while(true){

BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

System.out.println("");

str = din.readUTF(); //读入从client传来的字符串

System.out.println("从客户端接收的信息为:" + str);//显示字符串

if(str.trim().equals("BYE")) {System.out.print("通话结束" );break;}

System.out.println("");

System.out.print("请输入要发送的信息:" );//显示字符串

str = sin.readLine(); //读入从键盘传来的字符串

dout.writeUTF(str);

dout.flush(); // https://www.doczj.com/doc/bc10594786.html,/s/blog_82f2fc280100z3rr.html

if(str.trim().equals("BYE")) {System.out.print("通话结束" );break;}

}

din.close();

dout.close();

socket.close();

}

catch(IOException e){

System.out.println("Error" + e);//若端口已被占用,则抛出异常

System.exit(1);

}

}

}

(2)MultitalkServer.java:是一个应用程序,通过一个无限循环,等待并侦听多个客户的连接请求,每个客户的连接都由服务器端的一个单独线程来处理,实现了多用户/服务器之间的通信。

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class MultitalkServer{

public static void main(String args[]){

int port = 2000;

try{

System.out.println("正在等待连接...");

ServerSocket server = new ServerSocket(port);

Socket socket = null;

while(true){

socket = server.accept();

new ServerSocketThread(socket);//侦听连接请求,等待连接

}

}

catch(IOException e){

System.out.println("Error" + e);//若端口已被占用,则抛出异常

System.exit(1);

}

}

}

2.客户端程序

(1)ClientSocketThread.java:客户端线程子类,实现和服务器的数据通信

import https://www.doczj.com/doc/bc10594786.html,.*;

import java.io.*;

public class ClientSocketThread extends Thread{

private Socket socket;

private DataInputStream din;

private DataOutputStream dout;

private int port;

public ClientSocketThread(InetAddress addr,int port,String clientname) throws IOException{ super(clientname);

socket = new Socket(addr,port);

din = new DataInputStream(socket.getInputStream());

dout = new DataOutputStream(socket.getOutputStream());

start();

}

public void run(){

String str;

try{

System.out.println(getName());

BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

System.out.println("连接成功");

System.out.println("=========================================");

System.out.println("");

单片机串口通信协议程序

#include #include #define R55 101 #define RAA 202 #define RLEN 203 #define RDATA 104 #define RCH 105 //#define unsigned char gRecState=R55; unsigned char gRecLen; unsigned char gRecCount; unsigned char RecBuf[30]; unsigned char gValue; void isr_UART(void) interrupt 4 using 1 { unsigned char ch; unsigned char i; unsigned char temp; if (RI==1) { ch=SBUF; switch(gRecState) { case R55: // wait 0x55 if (ch==0x55) gRecState=RAA; break;

case RAA: if (ch==0xaa) gRecState=RLEN; else if (ch==0x55) gRecState=RAA; else gRecState=R55; break; case RLEN: gRecLen=ch; gRecCount=0; gRecState=RDATA; break; case RDATA: RecBuf[gRecCount]=ch; gRecCount++; if (gRecCount>=gRecLen) { gRecState=RCH; } break; case RCH: temp=0; for(i=0;i

模块通信协议

YL-0202通信协议 一、说明 本协议支持0~FF的全数据的传送,移植到其它通讯中可支持全双工通信模式,且带有自同步功能,无需超时。 二、串口 波特率:9600,1位起始位,1位停止位,8位数据位,无奇偶校验。

三、帧格式 1.命令帧格式概述 a.命令头——固定0x7F(数据中若有0x7F则发送双个0x7F,详见2) b.命令长度——命令长度包括:命令长度(1 byte)+命令字(1 byte)+数据(n byte),长 度不超过0x7E,不小于2 c.命令字——详见四:命令表 d.数据——n字节数据。 e.校验——校验内容包括:命令长度(1 byte)、命令字(1 byte)、数据(n byte)。 2.命令头说明 命令头固定为0x7F,数据或命令中若含有0x7F,则用(0x7F、0x7F)代替,此代替行为只传输时,所以在计算长度或校验时只按原数据计算,即一个0x7F。 如原命令:7F 0A 03 10 7F 37 50 7F 35 01 4A 实际传输数据为:7F 0A 03 10 7F 7F 37 50 7F 7F 35 01 4A 除去命令头实际传输数据共12字节,但命令长度则为0A即10字节,校验同理。 3.校验说明 校验为所有校验内容的异或值,校验函数如下: private byte checkSum(byte[] data, int offset, int length) { byte temp = 0; for (int i = offset; i < length + offset; i++) { temp ^= data[i]; } return temp; }

51串口通信协议(新型篇)

51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include #include //预定义 //帧 #define F_ST1 0x6e //帧头标志n #define F_ST2 0x79 //帧头标志y #define F_R 0x72 //帧类型读r #define F_W 0x77 //帧类型写w #define F_D 0x64 //帧类型数据帧d #define F_B 0x62 //帧类型写回应帧b #define F_C 0x63 //帧类型重发命令帧c #define F_Q 0x71 //帧类型放弃帧q #define F_ADDR 0x31 //器件地址0-9 #define F_END 0x7a //帧尾标志z #define F_SPACE 0x30 //空标志0 #define F_ERR1 0x31 //错误标志1,flagerr 1 #define F_ERR2 0x32 //错误标志2 2 //常数 #define S_MAXBUF 16 //接收/发送数据的最大缓存量 #define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为

微信通信HTTP协议抓取与分析

微信通信HTTP协议抓取与分析 一、实验目标 1、基本要求:利用HTTP协议抓取工具获得微信通信会话过程,并对数据包进行分析。 二、基础知识 1、了解HTTP两个基本命令GET与POST,并利用抓取工具获得数据包; 2、利用Telnet命令仿真测试命令GET与POST; 3、利用抓取工具获得微信通信会话数据包,并进行分析。 4、GET与POST get是从服务器上获取数据; post是向服务器传送数据。 三、实验过程与结果 1、网页上Httpwatch抓包结果 安装httpwatch抓包工具,使用IE浏览器,右击有显示httpwatch professional,进入抓包界面。点击Record按钮,输入网址https://www.doczj.com/doc/bc10594786.html,/,开始抓包 1.1.1 Get方式客户端向服务器发送数据 GET /gw/css/style.css HTTP/1.1 Accept: text/css, */* X-HttpWatch-RID: 26411-10018 Referer: https://www.doczj.com/doc/bc10594786.html,/gw/index/index.html Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko

Accept-Encoding: gzip, deflate Host: https://www.doczj.com/doc/bc10594786.html, Connection: Keep-Alive 1.1.2 Get方式服务器向客户端返回地数据 HTTP/1.1 200 OK Date: Thu, 25 Feb 2016 09:15:55 GMT Content-Type: text/css Content-Encoding: gzip Last-Modified: Tue, 15 Dec 2015 02:18:29 GMT Accept-Ranges: bytes ETag: "80487e3de36d11:0" Server: Microsoft-IIS/7.5 X-Powered-By: https://www.doczj.com/doc/bc10594786.html, Content-Length: 9039 Age: 1 X-Via: 1.1 lishui17:6 (Cdn Cache Server V2.0) Connection: keep-alive 在网页上输入快递单号查询,网页上发送请求 1.2.1 POST方式客户端向服务器发送地数据 POST /addTrace.ashx HTTP/1.1 X-Requested-With: XMLHttpRequest X-HttpWatch-RID: 73415-10085 Content-Type: application/x-www-form-urlencoded; charset=UTF-8

智能卡和指纹系统通讯协议和命令字-v

AN-0811212 智能卡和指纹系统通讯帧格式和命令字 文件息

目录 1 通讯帧格式描述 (5) 2 指令码描述 (5) 2.1 考勤门禁记录操作命令 (5) 2.1.1 上位机采集考勤门禁记录(考勤门禁,命令码:1) (7) 2.1.2 采集记录删除-考勤门禁、收费(命令码:2) (7) 2.1.3 考勤门禁数据实时上传(考勤门禁,命令码:3) (7) 2.1.4 考勤门禁数据补采(考勤门禁,命令码:4) (7) 2.1.5 记录清空-考勤门禁、收费(命令码:5) (7) 2.1.6 读卡序列号(命令码:6) (8) 2.1.7 读块数据(命令码:7) (8) 2.1.8 写块数据(命令码:8) (8) 2.1.9 充值(命令码:9) (9) 2.1.10 减值(命令码:10) (9) 2.1.11 初始化钱包(命令码:11) (9) 2.1.12 读扇区数据(命令码:12) (10) 2.1.13 写扇区数据(命令码:13) (10) 2.1.14 修改卡扇区密码(命令码:14) (10) 2.1.15 开LED(命令码:15) (11) 2.1.16 关LED(命令码:16) (11) 2.1.17 开BEEP(命令码:17) (11) 2.1.18 关BEEP(命令码:18) (11) 2.1.19 指纹机录入图像(命令码:19) (12) 2.1.20 指纹机生成特征(命令码:20) (12) 2.1.21 指纹机精确比对两枚指纹特征(命令码:21) (12) 2.1.22 指纹机搜索指纹(命令码:22) (12) 2.1.23 指纹机注册模板(命令码:23) (13) 2.1.24 指纹机储存模板(命令码:24) (13) 2.1.25 指纹机上传特征或模板(命令码:25) (13) 2.1.26 指纹机下载特征或者模板(命令码:26) (13) 2.1.27 指纹机清空指纹库(命令码:27) (14) 2.1.28 指纹机验证模块握手口令(命令码:28) (14) 2.1.29 指纹机设置芯片地址(命令码:29) (14) 2.1.30 终端出厂设置(命令码:30) (14) 2.1.31 终端参数配置(命令码:31) (15) 2.1.32 设置终端应用类型(命令码:32) (16) 2.1.33 设置终端标识号(命令码:33) (16) 2.1.34 设置终端通讯模式(命令码:34) (16) 2.1.35 设置终端地址(命令码:35) (16) 2.1.36 设置终端记录模式(命令码:36) (17) 2.1.37 设置终端响应时间(命令码:37) (17) 2.1.38 设置刷卡间隔(命令码:38) (17)

各种通信协议

分层及通信协议 协议软件是计算机通信网中各部分之间所必须遵守的规则的集合,它定义了通信各部分交换信息时的顺序、格式和词汇。协议软件是计算机通信网软件中最重要的部分。网络的体系结构往往都是和协议对应的,而且,网络管理软件、交换与路由软件以及应用软件等都要通过协议软件才能发生作用。 一、通信协议 1、什么是通信协议 通信协议(简称协议Protoco l),是指相互通信的双方(或多方)对如何进行信息交换所一致同意的一整套规则。一个网络有一系列的协议,每一个协议都规定了一个特定任务的完成。协议的作用是完成计算机之间有序的信息交换。 通信网络是由处在不同位置上的各节点用通信链路连接而组成的一个群体。通信网必须在节点之间以及不同节点上的用户之间提供有效的通信,即提供有效的接入通路。在计算机通信网中,将这种接入通路称为连接(connection)。建立一次连接必需要遵守的一些规则,这些规则也就是通信网设计时所要考虑的主要问题。 (l)为了能在两个硬件设备之间建立起连接,应保证在源、宿点之间存在物理的传输媒介,在该通路的各条链路上要执行某种协议。 如果传输线路使用电话线,则要通过调制解调器将信号从数字转换成模拟的,并在接收端进行反变换。 如果用的是数字传输线路,则在数据处理设备和通信设备之间,必须有一个数字适配器,以便将数字信号的格式转换成两种设备各自所期望的形式。 为了在两个端设备之间互换数据,需要协调和同步,调制解调器和数字适配器必须执行它们自己的协议。 无论是模拟的还是数字的通信设备,调制解调器和数字适配器的状态必须由接到节点上的设备来控制,这里必定有一个物理的或电气的接口来执行这种功能,执行某种适当的协议来达到这一控制目的。 (2)在计算机通信网中,许多信息源都是突发性的(bursty),问题是要利用信息的这种突发性质来降低消耗在线路上的费用,由此开发了许多共享通信资源的技术。所谓共享,是指允许多个用户使用同一通信资源,这就产生了多用户的接入问题。多路接入

http协议传输数据

竭诚为您提供优质文档/双击可除 http协议传输数据 篇一:详解http传输协议 何为http协议(hypertexttransferprotocol,超文本传输协议)? 所谓协议,就是指双方遵循的规范。http协议,就是浏览器和服务器之间进行“沟通”的一种规范。我们在看空间,刷微博...都是在使用http协议,当然,远远不止这些应用。 笔者一直听说http是属于“应用层的协议”,而且是基于tcp/ip协议的。这个不难理解,如果你上大学时候学过“计 算机网络”的课程,就一定知道osi七层参考协议(我当时是死记硬背的)。如果你接触过socket网络编程,就应该明白tcp和udp这两种使用广泛的通信协议(建立连接、三次握手等等,当然,这不是本文讨论的重点)。 如图: 既然tcp/udp是广泛使用的网络通信协议,那为啥有多出个http协议来呢?

笔者曾自己动手写过一个简单的web服务器处理软件,根据我的推断(不一定准确)。udp协议具有不可靠性和不安全性,显然这很难满足web应用的需要。 而tcp协议是基于连接和三次握手的,虽然具有可靠性,但仍具有一定的缺陷。但试想一下,普通的c/s架构软件,顶多上千个client同时连接,而b/s架构的网站,十万人同时在线也是很平常的事儿。如果十万个客户端和服务器一直保持连接状态,那服务器如何满足承载呢? 这就衍生出了http协议。基于tcp的可靠性连接。通俗点说,就是在请求之后,服务器端立即关闭连接、释放资源。这样既保证了资源可用,也吸取了tcp的可靠性的优点。 正因为这点,所以大家通常说http协议是“无状态”的,也就是“服务器不知道你客户端干了啥”,其实很大程度上 是基于性能考虑的。以至于后来有了session之类的玩意。 实战准备工作: 在监视网络方面,windows平台上有一款叫做sniffer 的优秀软件,这也是很多“黑客”经常使用的嗅探工具。 在 研究http协议时,推荐大家使用一款

HLP SV Modbus标准通讯协议格式

HLP_SV Modbus RTU 标准通讯协议格式 通信资料格式 Address Function Data CRC check 8 bits 8 bits N×8bits 16bits 1)Address通讯地址:1-247 2)Function:命令码8-bit命令 01 读线圈状态 上位机发送数据格式: ADDRESS 01 ADDRH ADDRL NUMH NUML CRC 注: ADDR: 00000 --- FFFF(ADDR=线圈地址-1);NUM: 0010-----0040 (NUM为要读线圈状态值的二进制数位数) 正确时变频器返回数据格式: ADDRESS 01 BYTECOUNT DATA1 DATA2 DATA3 DATAN CRC 注: BYTECOUNT:读取的字数 错误时变频器返回数据格式: ADDRESS 0X81 Errornum CRC 注: Errornum为错误类型代码 如:要检测变频器的输出频率 应发送数据:01 01 00 30 00 10 3D C9(16进制) 变频器返回数据:01 01 02 00 20 B8 24(16进制) 发送数据:0030hex(线圈地址49) 返回的数据位为“0020”(16进制),高位与低位互换,为2000。即输出频率为 303(Max Ref)的50%。关于2000对应50%,具体见图1。

03读保持寄存器 上位机发送数据格式: ADDRESS 03 ADDRH ADDRL NUMH NUML CRC 注:ADDR: 0 --- 0XFFFF;NUM: 0010-----0040 (NUM为要读取数据的字数) ADDR=Parameter Numbe r×10-1 正确时变频器返回数据格式: ADDRESS 03 BYTECOUNT DATA1 DATA 2 DATA 3 DATAN CRC 注: BYTECOUNT:读取的字节数 错误时变频器返回数据格式: ADDRESS 0X83 Errornum CRC 如:要读变频器参数303的设定值 应发送数据:01 03 0B D5 00 02 95 BC (16进制) Parameter 303(3029)=0BD5HEX 变频器返回数据:“:”01 03 04 00 00 EA 60 B5 7B 返回的数据位为“00 00 EA 60”(16进制)转换为10进制数为60000, 表示303设置值为60.000 ※当参数值为双字时,NUM的值必须等于2。否则无法读取或读取错误。 05 写单个线圈状态 上位机发送数据格式: ADDRESS 05ADDRH ADDRL DATAH DA TAL CRC 注:ADDR: 0 ---- 0XFFFF(ADDR=线圈地址-1);DATA=0000HEX(OFF) OR FF00(ON) HEX 正确时变频器返回数据格式: ADDRESS 05 DATAH DATAL BYTECOUNT CRC 错误时变频器返回数据格式: ADDRESS 0X85 Errornum CRC 如:要使写参数为写入RAM和EEPROM 应发送数据:01 05 00 40 FF 00 CRC(16进制) 变频器返回数据:01 05 FF 00 00 01 CRC(16进制) 发送数据:0040hex(线圈地址65) 06 写单个保持寄存器值(只能写参数值为单个字的参数) 上位机发送数据格式: ADDRESS 06 ADDRH ADDRL DA TAH DATAL CRC 注:ADDR: ADDR=Parameter Numbe r×10-1 正确时变频器返回数据格式: ADDRESS 06 ADDRH ADDRL DA TAH DA TAL CRC 错误时变频器返回数据: ADDRESS 0X86 Errornum CRC 如:要对变频器参数101写入1 应发送数据:01 06 00 03 F1 00 01 19 BD(16进制) 变频器返回数据:01 06 03 F1 00 01 19 BD(16进制) PARAMETER 101(1009)=03F1 HEX

菱f系列plc编程口通信协议

三菱FX系列 PLC 编程口通信协议总览 三菱PLC-FX2N 三菱FX系列PLC编程口通信协议总览 该协议实际上适用于PLC编程端口以及 FX-232AW 模块的通信。 通讯格式: 命令命令码目标设备 DEVICE READ CMD "0" X,Y,M,S,T,C,D DEVICE WRITE CMD "1" X,Y,M,S,T,C,D FORCE ON CMD " 7" X,Y,M,S,T,C FORCE OFF CMD "8" X,Y,M,S,T,C 传输格式: RS232C 波特率: 9600bps 奇偶: even 校验: 累加方式(和校验) 字符: ASCII 16进制代码: ENQ 05H 请求 ACK 06H PLC正确响应 NAK 15H PLC错误响应 STX 02H 报文开始 ETX 03H 报文结束 帧格式: STX CMD DATA ...... DATA ETX SUM(upper) SUM(lower) 例子: STX ,CMD ,ADDRESS, BYTES, ETX, SUM 02H, 30H, 31H,30H,46H,36H, 30H,34H, 03H, 37H,34H

SUM=CMD+......+ETX; 30h+31h+30h+46h+36h+30h+34h+03h=74h; 累加和超过两位取低两位 1、DEVICE READ(读出软设备状态值) 计算机向PLC发送: 始命令首地址位数终和校验 STX CMD GROUP ADDRESS BYTES ETX SUM 例子:从D123开始读取4个字节数据 02h 30h 31h,30h,46h,36h 30h,34h 03h 37h,34h 地址算法:address=address*2+1000h 再转换成ASCII 31h,30h,46h,36h PLC返回 STX 1ST DATA 2ND DATA ..... LAST DATA ETX SUM 注:最多可以读取64个字节的数据 例子:从指定的存储器单元读到3584这个数据 02h 33h 35h 38h 34h 03h 44h,36h 2、DEVICE WRITE(向PLC软设备写入值) 始命令首地址位数数据终和校验 STX CMD GROUP ADDRESS BYTES 1ST DATA 2ND DATA ...... LAST DATA ETX SUM 例子:向D123开始的两个存储器中写入1234,ABCD 02h 31h 31h,30h,46h,36h 30h,34h 33h,34h,31h,32h,43h,44h,41h,42h 03h 34h,39h PLC返回 ACK (06H) 接受正确 NAK (15H) 接受错误 3、位设备强制置位/复位 FORCE ON置位 始命令地址终和校验 STX CMD ADDRESS ETX SUM 02h 37h address 03h sum FORCE OFF复位 始命令地址终和校验

ftp和http通讯协议

ftp和http协议 HTTP是Hyper Text Transfer Protocol,超文本传输协议; FTP是File Transfer Protocol,文件传输协议; 简单说HTTP是面向网页的,而FTP是面向文件的。 FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。 FTP协议 FTP基于C/S模式而设计的。在进行FTP操作的时候,即需要客户端应用程序,也需要服务器端程序。我们一般先在自己的计算机中执行FTP客户端应用程序,在远程服务器中执行FTP服务器应用程序,这样,就可以通过FTP客户应用程序和FTP进行连接。连接成功后,可以进行各种操作。在FTP中,客户机只提出请求各接收服务,服务器只接收请求和执行服务。 在利用FTP进行文件传输之前,用户必须先连入INTERNET网中,在用户自己的计算机上启动FTP用户应用程序,并且利用FTP应用程序和远程服务器建立连接,激活远程服务器上的FTP服务器程序。准备就绪后,用户首先向FTP服务器提出文件传输申请,FTP服务器找到用户所申请的文件后,利用TCP/IP将文件的副本传送到用户的计算机上,用户的FTP程序再将接收到的文件写入自己的硬盘。文件传输完后,用户计算机与服务器计算机的连接自动断开。 与其他的C/S模式不同的是,FTP协议的客户机与服务器之间需要建立双重连接:一个是控制连接,另一个是数据连接。这样,在建立连接时就需要占用两个通信信道。 HTTP超文本传输协议,HTTP是用来在WWW上交换文件(文本,图形,声音,动画等)的规则集。相对于TCP/IP协议族(它是网上交换信息的基础),HTTP是应用协议。 ftp的协议和http协议的主要区别在于ftp是需要用户名和密码才能访问(匿名登陆除外),这样做的目的在于有的文件只供特殊人访问,而http协议是任何人都可以访问的。ftp在浏览器的地址栏中的格式是: ftp://用户名:密码@网站地址/文件目录/ 如果直接输入ftp.网站地址则会弹出一个登陆界面,需要输入用户名和密码,这种方式通常称为webftp,从字面上理解很容易明白,看起来是浏览器访问,实际上打开的是以文件夹的形式的存放目录。 目前常用ftp软件cuteftp,flashftp等来访问,方便管理 HTTP协议是什么 我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。

通信协议与编程

MODBUS通讯协议及编程 ModBus通讯协议分为RTU协议和ASCII协议,我公司的多种仪表都采用ModBus RTU 通讯协议,如:YD2000智能电力监测仪、巡检表、数显表、光柱数显表等。下面就ModBus RTU协议简要介绍如下: 一、通讯协议 (一)、通讯传送方式: 通讯传送分为独立的信息头,和发送的编码数据。以下的通讯传送方式定义也与MODBUS RTU通讯规约相兼容: 初始结构= ≥4字节的时间 地址码= 1 字节 功能码= 1 字节 数据区= N 字节 错误校检= 16位CRC码 结束结构= ≥4字节的时间 地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。 功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。 数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。 CRC码:二字节的错误检测码。

(二)、通讯规约: 当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。 1.信息帧结构 地址码:地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。 功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及操作 数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。 错误校验码:主机或从机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其它一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或从机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。 注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。 2.错误校验 冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的 CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。

Socket和HTTP网络通信

Socket和HTTP网络通信 在Android的网络通讯中,通常会使用Socket进行设备间数的数据通讯,使用Http来 对网络数据进行请求。 1、Socket(套接字) 不管是有过Java开发经验还是.NET开发经验的同学都应该对Socket有或多或少的了解,常见的TCP或者UDP协议其实都是基于Socket来实现的。 Socket是用于描述网络上的一个设备中的一个进程或者应用程序的,Socket由 IP地址和端口号两部分组成。IP地址用来定位设备,端口号用来定位应用程序或者进程,比如我们常见的运行在80端口上的HTTP协议。Socket的常见格式为: 192.168.1.1:1234。 那么应用程序是如何通过Socket来与网络中的其他设备进行通讯的呢?通常情况下,Socket通信有两部分,一部分为监听的Server端,一部分为主动请求连接的 Client端。Server端会一直监听Socket中的端口直到有请求为止,当Client端对该端 口进行连接请求时,Server端就给予应答并返回一个Socket对象,以后在Server端 与Client端的数据交换就可以使用这个Socket来进行操作了。 2、Android中使用Socket进行数据交换 ?ServerSocket 建立服务端(Server)时,需要使用ServerSocket对象,这个对象会自动对其构造函数中传入的端口号进行监听,并在收到连接请求后,使用ServerSocket.accept()方 法返回一个连接的的Socket对象。这个方法并不需要我们像在.NET中那样使用Start方法,它会自动进行监听的。 ?Socket 不管建立客户端(Client)还是在进行其他数据交换方面的操作时,都需要使用Socket类。Socket类在进行初始化时需要出入Server 端的IP地址和端口号,并返回 连接到Server端的一个Socket对象,如果是连接失败,那么将返回异常。同ServerSocket,也是自动进行连接请求的。 通过上面两个步骤后,Server端和Client端就可以连接起来了,但是仅仅连接起来 是没有任何作用的,数据交换才是我们的目的,这时候就需要用到IO流中的OutputStream类和InputStream类。 ?OutputStream——可写流 当应用程序需要对流进行数据写操作时,可以使用Socket.getOutputStream()方 法返回的数据流进行操作。 ?InputStream——可读流

RS232通讯协议要点

RS232通讯协议基本结构 波特率9600 bit/s,8bit,1位停止,无校验位 格式 0EBH,地址,命令,长度(n),数据1,---数据n,冗余 说明: 0EBH为帧起始位 长度小于输出端口数 冗余=地址+命令+长度+数1+---+数n 如果冗余=0EBH,为防止与帧起始位相同,则发送反码,即冗余=14H 当接收正确时, 1)在命令1,2,5,6时,回送0EBH,地址,命令,01H,0FAH,冗余,并执行命令。 2)在命令3,4,7时,回送相应信息。 当接收不正确时, 1)地址正确,冗余不正确,回送0EBH,地址,命令,01H,0F5H,冗余。2)地址不正确,不回送任何信息。 串口通讯—通信协议 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、 传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于 ISO'S OSI七层参考模型中的数据链路层。 目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字 符和面向比特以及面向字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。 一、物理接口标准 1.串行通信接口的基本任务 (1)实现数据格式化:因为来自CPU的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务。在异步通信方式下,接口自动生成起止式的帧数据格式。在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。 (2)进行串-并转换:串行传送,数据是一位一位串行传送的,而计算机处 理数据是并行数据。所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。因此串并转换是串行接口电路的重要任务。

几种通信协议

RS-232-C RS-232-C是OSI基本参考模型物理层部分的规格,它决定了连接器形状等物理特性、以0和1表示的电气特性及表示信号意义的逻辑特性。 RS-232-C是EIA发表的,是RS-232-B的修改版。本来是为连接模拟通信线路中的调制解调器等DCE及电传打印机等DTE拉接口而标准化的。现在很多个人计算机也用RS-232-C作为输入输出接口,用RS-232-C作为接口的个人计算机也很普及。 RS-232-C的如下特点:采用直通方式,双向通信,基本频带,电流环方式,串行传输方式,DCE-DTE间使用的信号形态,交接方式,全双工通信。RS-232-C在ITU建议的V.24和V.28规定的25引脚连接器在功能上具有互换性。 RS-232-C所使用的连接器为25引脚插入式连接器,一般称为25引脚D-SUB。DTE端的电缆顶端接公插头,DCE端接母插座。 RS-232-C所用电缆的形状并不固定,但大多使用带屏蔽的24芯电缆。电缆的最大长度为15m。使用RS-232-C在200K位/秒以下的任何速率都能进行数据传输。 RS-449 RS-449是1977年由EIA发表的标准,它规定了DTE和DCE之间的机械特性和电气特性。RS-449是想取代RS-232-C而开发的标准,但是几乎所有的数据通信设备厂家仍然采用原来的标准,所以RS-232-C仍然是最受欢迎的接口而被广泛采用。 RS-449的连接器使用ISO规格的37引脚及9引脚的连接器,2次通道(返回字通道)电路以外的所有相互连接的电路都使用37引脚的连接器,而2次通道电路则采用9引脚连接器。 RS-449的电特性,对平衡电路来说由RS-422-A规定,大体与V.11具有相同规格,而RS-423-A大体与V.10具有相同规格。

VB编写的Modbus RTU协议通讯源程序

modbus rtu协议可以算是一种事实上的工业标准协议,为许多仪表、PLC等所支持。以前有几个用户问如何使用VB编程来与我们的KND-K3系列PLC通讯,于是整了一个demo 程序。这次把这个demo共享,希望能给大家一点帮助。 1)模块文件:modCRC,其中包含了CRC校验的函数。 'data 待校验的数组名称 'no 数组中元素个数 'btLoCRC 算出的CRC高字节 'btHiCRC 算出的CRC低字节 Public Function CalCRC16Fast(data() As Byte, no As Integer, btLoCRC As Byte, btHiCR C As Byte) As String Dim CL As Byte, CH As Byte '多项式码&HA001 Dim SaveHi As Byte, SaveLo As Byte Dim i As Integer Dim Flag As Integer btHiCRC = &HFF btLoCRC = &HFF CL = &H1 CH = &HA0 For i = 0 To (no - 1) btHiCRC = btHiCRC Xor data(i) '每一个数据与CRC寄存器进行异或 For Flag = 0 To 7 SaveHi = btLoCRC SaveLo = btHiCRC btLoCRC = btLoCRC \ 2 '高位右移一位 btHiCRC = btHiCRC \ 2 '低位右移一位 If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1 btHiCRC = btHiCRC Or &H80 '则低位字节右移后前面补1 End If '否则自动补0 If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或 btLoCRC = btLoCRC Xor CH btHiCRC = btHiCRC Xor CL End If

常用几种通讯协议

常用几种通讯协议 Modbus Modbus技术已成为一种工业标准。它是由Modicon公司制定并开发的。其通讯主要采用RS232,RS485等其他通讯媒介。它为用户提供了一种开放、灵活和标准的通讯技术,降低了开发和维护成本。 Modbus通讯协议由主设备先建立消息格式,格式包括设备地址、功能代码、数据地址和出错校验。从设备必需用Modbus协议建立答复消息,其格式包含确认的功能代码,返回数据和出错校验。如果接收到的数据出错,或者从设备不能执行所要求的命令,从设备将返回出错信息。 Modbus通讯协议拥有自己的消息结构。不管采用何种网络进行通讯,该消息结构均可以被系统采用和识别。利用此通信协议,既可以询问网络上的其他设备,也能答复其他设备的询问,又可以检测并报告出错信息。 在Modbus网络上通讯期间,通讯协议能识别出设备地址,消息,命令,以及包含在消息中的数据和其他信息,如果协议要求从设备予以答复,那么从设备将组建一个消息,并利用Modbus发送出去。 BACnet BACnet是楼宇自动控制系统的数据通讯协议,它由一系列与软件及硬件相关的通讯协议组成,规定了计算机控制器之间所有对话方式。协议包括:(1)所选通讯介质使用的电子信号特性,如何识别计算机网址,判断计算机何时使用网络及如何使用。(2)误码检验,数据压缩和编码以及各计算机专门的信息格式。显然,由于有多种方法可以解决上述问题,但两种不同的通讯模式选择同一种协议的可能性极少,因此,就需要一种标准。即由ISO(国际标准化协会〉于80年代着手解决,制定了《开放式系统互联(OSI〉基本参考模式(Open System Interconnection/Basic Reference Model简称OSI/RM)IS0- 7498》。 OSI/RM是ISO/OSI标准中最重要的一个,它为其它0SI标准的相容性提供了共同的参考,为研究、设计、实现和改造信息处理系统提供了功能上和概念上的框架。它是一个具有总体性的指导性标准,也是理解其它0SI标准的基础和前提。 0SI/RM按分层原则分为七层,即物理层、数据链路层、网络层、运输层、会话层、表示层、应用层。 BACnet既然是一种开放性的计算机网络,就必须参考OSIAM。但BACnet没有从网络的最低层重新定义自己的层次,而是选用已成熟的局域网技术,简化0SI/RM,形成包容许多局 域网的简单而实用的四级体系结构。 四级结构包括物理层、数据链路层、网络层和应用层。

基于TCP协议的简单即时通信软件的设计与实现

基于TCP协议的网络通信系统的设计与实现 摘要:网络通信,由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。使用这个统一的接口,可以编写一个可移植的TCP/IP通信程序。使信息能够在INTERNET上可靠的传输。 本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。客户端采用P2P方式实现消息传递,并能实现文件的传输。本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。 关键词:即时通信;文件传输;套接字;TCP协议 Abstract :Instant messages have several advantages such as real-time, cross-platform, cheap and efficient. To design a Multi-user IM (instant message) architecture is very i mportant in both theory and realism. Instant message based on TCP/IP protocol that is realized by socket interface. Almost all UNIX operation systems and Microsoft's win dows operation systems provide support of socket in the kernel. Using the uniform int erface, we can develop a portable program of TCP/IP, which help us transfer informati on in Internet safely and credibly. The system uses the client/server(C/S) mode. The server takes the responsibility of th e login message of client, the saving of friend message and Message heartbeat. The tra nsmission of the basic messages of the customer end will be designed on P2P architec ture. This thesis explains how the client and server communicate via serializing XML message. Key words: Instant Message; File Transfer; Socket; TCP protocol

Linux下http协议GET通讯的C语言实现

Linux下http协议GET通讯的C语言实现 from https://www.doczj.com/doc/bc10594786.html,/uid-21768364-id-187570.html201 1.03 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <errno.h> #include <unistd.h> #include <netinet/in.h> #include <limits.h>

#include <netdb.h> #include <arpa/inet.h> #include <ctype.h>int main(int argc, char *argv[]) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; char host_addr[256]; char host_file[1024];

char local_file[256]; FILE * fp; char request[1024]; int send, totalsend; int i; char * pt;if(argc!=2) { fprintf(stderr,"Usage:%s web-address\a\n",argv[0]); exit(1); } portnumber=80;

相关主题
相关文档 最新文档