目录

  • 前言
    • 研究背景及意义
    • 研究内容及方法
    • 研究要求与目标
  • 相关知识点
    • HTTP协议
    • TCP协议
    • UDP协议
    • Socket编程技术
  • 需求分析
    • Socket编程
    • Swing包
    • 多线程的应用
  • 功能设计
  • 功能测试
  • 总结

前言

研究背景及意义

基于Socket的网络编程技术在人们不断的研究和探索下,日益的完善与成熟,已被广泛的应用在通信、医疗等各个领域,比如市面上比较普遍的QQ、微信等以内部网络为中心的资源共享系统,都应用到了套接字网络编程技术。
在现在的网络应用中,通信双方最常见的交互模式便是Client/ Server模式,它通常采用监听/连接的方式实现,服务器端应用程序在一个端口监听对服务的请求,即服务进程一直处于休眠状态,直到有一个客户对这个服务提出了连接请求,此时服务线程被“唤醒”并为客户。
目前,大多数远程进程间通信代码是用Socket 编写的,实际应用中用Socket 传输信息并不是独立的,它在多线程的处理环境中应用更为广。
Socket(套接字)起初来源于UNIX,是加利福尼亚大学Berkeley分校开发的UNIX操作系统下的网络通信接口。当TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了-一种新型的IO操作,UNIX用户进程与网络协议的交互作用比用户进程与传统的IO设备相互作用复杂得多,因此引入了套接字作为通信端口,随着UNIX操作系统的广泛使用,Socket 亦当之无愧的成为了最流行的网络通信程序接口之一。

研究内容及方法

研究内容:实现一个基于 HTTP 协议的客户端和服务器端,客户端能通过网络 访问服务器端,获取信息(静态网页)。
研究方法:调研 HTTP 协议、TCP 协议、UDP 协议及 socket 编程相关知识; 根据课程设计要求,选择合适的操作系统、开发环境及测试环境。

研究要求与目标

1、必需有界面窗口,客户端可以实现网址的录入,协议的选择 (TCP 或 UDP),返回信息的显示。服务器端要有服务器的开始和 停止按钮,有处理 HTTP 请求时相关信息的显示。
2、用 socket 编程实现;课程设计报告要求:包含需求分析,功 能设计,功能测试,总结等,另外还应给出小组每个人的分工。

通过此程序的设计实现,加深对课程内容的理解,提高综合 运用所学知识的能力,锻炼合作能力和动手能力,是计算机网络课程的补充和提高。

相关知识点

HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

1、 HTTP协议工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
(1)客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。

(2)发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

(3)服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

(4)释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

(5)客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

2、HTTP协议特点
(1)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

(2)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

(3)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

(4)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

(5)支持B/S及C/S模式。
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息。

3、 HTTP协议消息格式
(1)请求消息Request
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

(2)响应消息Response
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。


(3)状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

(4)HTTP请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

TCP协议

TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。

1、TCP协议功能
TCP协议的主要功能是完成对数据报的确认、流量控制和网络拥塞;自动检测数据报,并提供错误重发的功能;将多条路径传送的数据报按照原来的顺序进行排列,并对重复数据进行择取;控制超时重发,自动调整超时值;提供自动恢复丢失数据的功能。

2、TCP协议特点
(1)面向连接的传输
(2)端到端的通信
(3)高可靠性,确保传输数据的正确性,不出现丢失或乱序
(4)全双工方式传输
(5)采用字节流方式,即以字节为单位传输字节序列
(6)紧急数据传送功能

3、TCP协议的数据报
以太网数据报(packet)的大小是固定的,最初是1518字节,后来增加到1522字节。其中, 1500 字节是负载(payload),22字节是头信息(head)。
IP 数据报在以太网数据包的负载里面,它也有自己的头信息,最少需要20字节,所以 IP 数据包的负载最多为1480字节。
TCP 数据报在 IP 数据包的负载里面。它的头信息最少也需要20字节,因此 TCP 数据包的最大负载是 1480 - 20 = 1460 字节。由于 IP 和 TCP 协议往往有额外的头信息,所以 TCP 负载实际为1400字节左右。
因此,一条1500字节的信息需要两个 TCP 数据包。HTTP/2 协议的一大改进, 就是压缩 HTTP 协议的头信息,使得一个 HTTP 请求可以放在一个 TCP 数据包里面,而不是分成多个,这样就提高了速度。
一个包1400字节,那么一次性发送大量数据,就必须分成多个包。比如,一个 10MB 的文件,需要发送7100多个包。
发送的时候,TCP 协议为每个包编号(sequence number,简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包,也可以知道丢失的是哪一个包。
第一个包的编号是一个随机数。为了便于理解,这里就把它称为1号包。假定这个包的负载长度是100字节,那么可以推算出下一个包的编号应该是101。这就是说,每个数据包都可以得到两个编号:自身的编号,以及下一个包的编号。接收方由此知道,应该按照什么顺序将它们还原成原始文件。

4、TCP 协议连接的建立及断开

TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake)。建立好连接后,开始传输数据。
TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等。
TCP的断开通过四个报文段完成,这个过程称为四次握手。

(1)三次握手建立连接
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

(2)传输数据过程
①超时重传:超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ACK进行确认,表示某一seq 号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ACK回复,就会认为报文丢失,会重传这个数据包。

②快速重传:接受数据一方发现有数据包丢掉了。就会发送 ACK报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ACK包,则会触发客户端的快速重 传。比较超时重传和快速重传,可以发现超时重传是发送端在傻等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。

③流量控制:这里主要指TCP滑动窗流量控制。TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。 滑动窗可以是提高TCP传输效率的一种机制。

④拥塞控制:拥塞控制是基于整个网络来考虑的。若某一时刻网络上的延时突然增加,那么TCP对这个事做出的应对只有重传数据,但重传会导致网络的负担更重,从而导致更大的延迟以及更多的丢包,于是,这个情况就会进入恶性循环被不断地放大。如果一个网络内有成千上万的TCP连接都这么行事,那么马上就会形成“网络风暴”,TCP这个协议就会拖垮整个网络。为此,TCP引入了拥塞控制策略。拥塞策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。

(3)四次握手断开连接
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当 然,在fin包之前发送出去的数据,如果没有收到对应的ACK确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。

第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。

第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

UDP协议

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

1、UDP协议特点
(1)UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当UDP它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

(2)由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

(3)UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

(4)吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。

(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

2、 UDP协议的报文格式
UDP协议分为首部字段和数据字段,其中首部字段只占用8个字节,分别是个占用两个字节的源端口、目的端口、长度和检验和。
长度:UDP报文的整个大小,最小为8个字节(仅为首部)。
检验和:在进行检验和计算时,会添加一个伪首部一起进行运算。伪首部(占用12个字节)为:4个字节的源IP地址、4个字节的目的IP地址、1个字节的0、一个字节的数字17、以及占用2个字节UDP长度。这个伪首部不是报文的真正首部,只是引入为了计算校验和。相对于IP协议的只计算首部,UDP检验和会把首部和数据一起进行校验。接收端进行的校验和与UDP报文中的校验和相与,如果无差错应该全为1。如果有误,则将报文丢弃或者发给应用层、并附上差错警告。

3、 UDP协议的封装操作
(1)分层封装
在TCP/IP协议层次模型中,UDP位于IP层之上。应用程序访问UDP层然后使用IP层传送数据报。IP层的报头指明了源主机和目的主机地址,而UDP层的报头指明了主机上的源端口和目的端口。

(2)分解操作
UDP的复用、分解与端口。
UDP软件应用程序之间的复用与分解都要通过端口机制来实现。每个应用程序在发送数据报之前必须与操作系统协商以获得协议端口和相应的端口号。
UDP分解操作:从IP层接收了数据报之后,根据UDP的目的端口号进行分解操作。
UDP端口号指定有两种方式:由管理机构指定端口和动态绑定的方式。

Socket编程技术

1、Socket基本概念
socket的英文原义是“孔”或“插座”。作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。(其实就是两个程序通信用的)socket非常类似于电话的插座。以一个电话网为例。电话的通话双方相当于相互通信的2个程序,电话号码可以当作是IP地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码(IP地址),相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接,通信完成。
以上通信是以两个人通话做为事例来在概的说明了下通信,但是现在假如通信中的一个人是外国人,一个人是中国人,他们俩相互通信的话,都不能听明白对方说的是什么,那么他们的沟通就不能够完成。但是如果我们给一个规定,给通话双方,只能讲普通话,那么双方沟通就没有障碍了。这就引出来了通信协议。

2、Socket特点
(1)优点:
① 传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)
②传输数据时间短,性能高
③适合于客户端和服务器端之间信息实时交互
④可以加密,数据安全性强

(2)缺点:
① 需对传输的数据进行解析,转化成应用级的数据
② 对开发人员的开发水平要求高
③相对于Http协议传输,增加了开发量

目前,常用的Socket类型有两种,流式Socket( SOCK_ STREAM)和数据报式Socket(SOCK DGRAM)。流式是-种面向连接的Socket,针对于面向连接的TCP服务应用,实现了无差错无重复的顺序数据传输,无长度限制;数据报式Socket 是一种无连接的Socket,对应于无连接的UDP服务应用,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠。在现在的网络应用中,通信双方最常见的交互模式便是Client/ Server模式。客户/服务器模式通常采用监听/连接的方式实现,服务器端应用程序在一个端口监听对服务的请求。也就是说,服务进程一直处于休眠状态,直到有一个客户对这个服务提出了连接请求,此时服务线程被“唤醒”并为客户。
流式套接字(SOCK_ STREAM) :该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。而且发送的数据是按顺序接收的。所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。这对数据的稳定性、正确性和
发送/接收顺序要求严格的应用十分适用,TCP协议使用该类接口。但其对线路的占用率相对提高。流式套接字的实现屡见不鲜,如远程登录(TELNET)、文件传输协议(FTP)等均使用了流式套接字。
数据报式套接字(SOCK_ DGRAM):数据报式套接字提供了面向无连接的服务,它独立的数据包形式发送数据(数据包长度不能大于32KB),不提供正确性检查,也不保证各数据包的发送顺序,因此,可能出现数据的重发、丢失等现象,并且接收顺序由具体路由决定。然而,数据报的实现对网络线路占用率较低。NFS ( 网络文件系统)即是采用此类套接字、在TCP/IP协议族中,UDP使用该类接口。
原始套接字(SOCK_ RAW) :该套接字一般不会出现在高级网络接口的实现中,因为它是直接针对协议的较低层(如IP、 TCP、UDP等)直接访问的。常用于检验新的协议实现或访问现有服务中配置的新设备,如前所述,-般不提倡他的直接应用。

3、 Socket工作原理

TCP客户端、服务端连接建立通信过程


先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

套接字的工作流程:socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概如下图。

服务器程序将一个套接字绑定到一个特定的端口(一个应用),并通过此套接字等待和监听客户的连接请求。客户程序根据服务器程序所在的主机名和端口号发出连接请求。

如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。(不可能有两个程序同时占用一个端口)。客户和服务器通过读写套接字进行通讯。

过程总结:使用ServerSocket和Socket实现服务器端和客户端的Socket通信;
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开;
客户端创建socket;
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket;
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端连接请求;
客户端连接成功,向服务器发送连接状态信息;
服务器accept方法返回,连接成功 (连接建立好后,服务器端和客户端的输入流和输出流就互为彼此,即一端的输出流是另一端的输入流);
客户端向socket写入信息;
服务器读取信息;
客户端关闭;
服务器端关闭。

需求分析

Socket编程

客户/服务器通信的实现需要我们了解一个概念性词汇socket。目前,大多数远程进程间通信代码是用Socket 编写的。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是运输层供给应用层的编程接口。运输层则在网络层的基础上提供进程到进程的逻辑通信,而应用层的进程则利用运输层向另一台主机的某一进程通信。Socket就是应用层与运输层之间的桥梁。

TCP/IP四层协议

服务器端:最少有两个socket,一个是服务端负责监听客户端发来连接请求,但不负责与请求的客户端通信,另一个是每当服务器端成功接收到客户端时,但在服务器端创建一个用与请求的客户端进行通信的socket。

客户端:指定要连接的服务器端地址和端口,通过创建一个socket对象来初始化一个到服务器端的TCP连接。

socket通信流程

服务器端:
第一步:创建一个用于监听连接的Socket对象;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对象;
第三步:用socket对象的Bind()方法绑定EndPoint;
第四步:用socket对象的Listen()方法开始监听;
第五步:接收到客户端的连接,用socket对象的Accept()方法创建一个新的用于和客户端进行通信的socket对象;
第六步:通信结束后一定记得关闭socket;

客户端:
第一步:建立一个Socket对象;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对象;
第三步:用socket对象的Connect()方法以上面建立的EndPoint对象做为参数,向服务器发出连接请求;
第四步:如果连接成功,就用socket对象的Send()方法向服务器发送信息;
第五步:用socket对象的Receive()方法接受服务器发来的信息 ;
第六步:通信结束后一定关闭socket;

Swing包

本次实验的实现还需要建立图形化见面,因此我们利用JAVA中的swing包建立图形化界面。
Swing是一个用于开发Java应用程序用户界面的开发工具包。以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。 工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event。
步骤:
第一步:导入swing包
第二步:选择界面风格
第三步:设置顶层容器
第四步:设置按钮和标签
第五步:将组件放到容器上
第六步:为组件增加边框
第七步:处理事件
第八步:辅助技术支持

多线程的应用

进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。
所有的操作都发生在线程体中,在Java中线程体是从Thread类继承的run()方法,或实现Runnable接口的类中的run()方法。当线程产生并初始化后,实时系统调用它的run()方法。run()方法内的代码实现所产生线程的行为,它是线程的主要部分。

线程状态图

上图表示了线程在它的生命周期内的任何时刻所能处的状态以及引起状态改变的方法。
1、新线程态(New Thread)
产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是一个空线程对象,它还没有分配到系统资源。因此只能启动或终止它。任何其他操作都会引发异常。例如,一个线程调用了new方法之后,并在调用start方法之前的处于新线程状态,可以调用start和stop方法。

2、可运行态(Runnable)
start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的run()方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总是一直占用处理机。特别是对于只有一个处理机的PC而言,任何时刻只能有一个处于可运行态的线程占用处理 机。Java通过调度来实现多线程对处理机的共享。注意,如果线程处于Runnable状态,它也有可能不在运行,这是因为还有优先级和调度问题。

3、阻塞/非运行态(Not Runnable):
当以下事件发生时,线程进入非运行态。
(1)suspend()方法被调用
(2)sleep()方法被调用
(3)线程使用wait()来等待条件变量
(4)线程处于I/O请求的等待

4、死亡态(Dead)
当run()方法返回,或别的线程调用stop()方法,线程进入死亡态。通常Applet使用它的stop()方法来终止它产生的所有线程。

由于服务器程序监听socket请求的方法是一个while循环一直扫描这个端口,因此若果只有一个主线程,程序就会一直卡在这个循环里,没办法执行结束按钮点击时应该触发的函数,所以,在这里我们应用了多线程。即让这个while循环单独在一个线程里执行,当点击按钮结束时,将while(flag)中的flag改为false,从而实现该功能。

功能设计

(1)客户端:
申请一个socket
连接服务器(指明IP地址和端口号)

(2)服务器端:
申请一个socket用来监听的
绑定到一个IP地址和一个端口上
开启侦听,等待接授客户端的连接
当有连接时创建一个用于和连接进来的客户端进行通信的socket
继续监听,等侍下一个客户的连接

功能测试

测试结果(1)


测试结果(2)

总结

通过这次实验了解了HTTP协议,UDP协议,TCP协议的基本概念、特点等,了解并掌握了socket编程的实现和应用。
本次实验,利用 Socket 编程实现了基于 HTTP 协议的客户端到服务器的通信。 首先获取到用户输入的目的地址 IP,将该IP地址与程序内部使用的HTTP协议版本号、主机名、分配到的端口号,请求对象的路径等信息封装成数据流。服务器的程序先通过 绑定的套接字等待和监听客户的连接请求;客户端通过 Socket 接口建立连接发送给服务器端;服务器接受请求后建立通信;然后客户端发送打包好的数据包给服务器,服务器收到请求后便会发送相应的响应消息给客户端;当数据传输结束后便关闭 Socket接口,断开连接。

Socket 编程实现基于 HTTP 协议的客户和服务相关推荐

  1. python实现淘宝客服自动回复语_Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例...

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些 ...

  2. Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园

    Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园 Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpkin ...

  3. 老雷socket编程之认识常用协议

    老雷socket编程之常见网络协议 1.ip IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西, 它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求. ...

  4. socket 网络通信(基于tcp协议)以及粘包解决方案

    socket 网络通信(基于tcp协议)以及粘包解决方案 参考文章: (1)socket 网络通信(基于tcp协议)以及粘包解决方案 (2)https://www.cnblogs.com/amiee- ...

  5. 「分布式技术专题」基于Gossip协议的去中心服务

    概述 Gossip 协议可以翻译为流言协议.它是在 1987 年发表在 ACM 上的论文 <Epidemic Algorithms for Replicated Database Mainten ...

  6. java socket 通信协议_java 基于TCP协议的Socket编程和通信

    java 基于 TCP 协议的 Socket 编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户 端 (Client) 程序, 简称客户端, 而在第一次通讯中等待连接的 程序被称作服务器端 ...

  7. Sockey编程之基于 UDP 协议的 Socket 编程

    一.基于 UDP 协议的 Socket 编程 1.端口选择 已知端口:0~1023,为固定服务保留. 已注册的端口:1024~49151,供普通用户的普通用户进程或程序使用. 动态或私用端口: 491 ...

  8. HTTP 笔记与总结(5)socket 编程:使用 HTTP 协议模拟登录并发帖

    在 VeryCD 上注册两个帐号,发送和接收站内信,观察 POST 请求时发送的参数(h****2 发送给 d***2).(最好用 FireFox 的 FireBug 工具,发送站内信之前选中 &qu ...

  9. (P9)socket编程四:流协议与粘(nian)包,粘包产生的原因,粘包处理方案,readn,writen 6.回射客户/服务器

    文章目录 1.流协议与粘(nian)包 2.粘包产生的原因 4.粘包处理方案 5.readn,writen 6.回射客户/服务器 1.流协议与粘(nian)包 tcp是基于字节流的传输服务(字节流是无 ...

最新文章

  1. ruby环境sass编译中文出现Syntax error: Invalid GBK character错误解决方法
  2. 3、MySQL查看或显示数据库(SHOW DATABASES语句)
  3. 如何使 highchart图表标题文字可选择复制
  4. ALV 层级分组显示报表
  5. WebKit中的Chrome和ChromeClient
  6. 基于FPGA异构计算快速构建高性能图像处理解决方案
  7. 10天时间做出php,php 最近10天的所有日期
  8. c语言高低位拷贝_C语言中的大小端转换与高低位颠倒
  9. 视频大压缩的具体操作方法
  10. 40个script 常用代码
  11. 华为Mate X海报曝光:设计惊艳 可变形
  12. 如何巧用区块链密码学避免数据“裸奔”?
  13. 关于WPF中RichTextBox失去焦点后如何保持高亮显示所选择的内容
  14. RedisJson 横空出世,性能碾压ElasticSearch 和Mongo!
  15. 数据库接口实验--php实现--
  16. USB协议(1)USB基础知识
  17. UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x93 in position 4: illegal multibyte sequen
  18. 康奈尔rtems笔记(1)
  19. 【年终】电感两端施加正弦波电流,电感两端的电压波形是怎样的?
  20. 富文本编辑器wangEditor回显问题

热门文章

  1. 股票历史K线行情接口数据获取资源分享
  2. xwiki部署_开源Wiki应用平台---XWiki的部署
  3. 雷达图像中地物目标的极化信息
  4. 创新工厂CEO李开复:互联网的九个产品精神
  5. 系统性能监控-Windows自带性能监控器
  6. 六级高频词汇——Group07
  7. 2021年6月PMP考试内容介绍
  8. java 二叉堆_二叉堆的介绍和Java实现
  9. 仿58上市公司(PC站+手机站)网站源码
  10. 易语言之超级列表框的使用及json解析