网络基础知识
什么是telnet,它有什么用?
要测试服务器上是否存在某个端口:telnet,连接对方的端口,如果能连接上,证明端口是打开的
我们首先Ping www.taobao.com,查看这个域名的IP地址,再使用telnet命令来测试
什么是TCP/IP框架?
Internet 协议(IP)是 Internet 的地址系统,具有将数据包从源设备传递到目标设备的核心功能。IP 是建立网络连接的主要方式,。IP 不负责数据包排序或错误检查。这样的功能需要另一种协议,通常是 TCP。
TCP/IP 关系类似于通过邮件向某人发送写在拼图上的消息。消息写好后,拼图分解成碎片。接着,各个碎片可能经过不同的邮递路线传送,其中一些花费的时间要久一些。当拼图碎片经过不同的路径到达时,它们的顺序可能会被打乱。IP确保碎片到达其目的地地址。TCP 协议可比作位于另一端的拼图组装者,它将碎片按正确的顺序摆放在一起,要求重新发送缺失的碎片,并且让发送者知道拼图已被接收。从第一个拼图碎片发送之前到最后一个发送之后,TCP 一直保持与发送者的连接。
IP 是无连接协议,这意味着每个数据单元都会单独寻址并从源设备路由到目标设备,而且目标不会将确认信息发回给来源。这是传输控制协议(TCP)等协议的用武之地。TCP 与 IP 相结合,在发送者和目标之间保持连接,并确保数据顺序。
我们怎么完成通信?
在我们的通信项目里,我们使用 Client–server model (如图所示)
客户端-服务器模型是一种分布式应用程序结构,用于在“服务器”和“客户端”之间划分任务或工作负载。通常,客户端和服务器通过不同硬件上的计算机网络进行通信,但是客户端和服务器都可以驻留在同一系统中。服务器主机 运行一个或多个服务器程序,这些程序与客户端共享资源。客户端通常不共享任何资源,但是会向服务器请求内容或服务。因此,客户端启动与服务器的通信会话,以等待传入的请求。使用客户端-服务器模型的计算机应用程序示例包括电子邮件,QQ等。客户端和服务器以请求-响应-消息传递模式交换消息。客户端发送请求,服务器返回响应消息的这种交换是进程间通信的一个示例。为了进行通信,计算机必须具有通用语言,并且它们必须遵循规则,以便客户端和服务器都知道期望的内容。
顺便提一下:
在建立1960年代和1970年代的客户端-服务器模型时,构建ARPANET的计算机科学家(位于斯坦福研究所)使用了服务器-主机(或服务主机)和用户-主机(或使用主机)这两个术语,它们出现在早期文档
Dustdar, S.; Schreiner, W. (2005). “A survey on web services composition” (PDF). International Journal of Web and Grid Services. 1: 1. CiteSeerX 10.1.1.139.4827. doi:10.1504/IJWGS.2005.007545.
Rulifson, Jeff (June 1969). DEL. IETF. doi:10.17487/RFC0005. RFC 5. Retrieved 30 November 2013.
有兴趣的小伙伴可以去查阅下文献。
今天我我们要做什么?
今天我们就写一个简单的 服务机 和 用户机,并且使得他们能够进行通信(消息互通)。
服务器
第一步:首先创立一个java.net.ServerSocket (服务器对象)并绑定一个端口用于客户端定位
ServerSocket server = newverSoceket(8989); System.out.println("服务器创建成功,等待客户连接");
第二步:当服务器创建成功之后,要让服务器进入等待的状态,等待客户端来连接他
java.net.Socket client = server.accept(); System.out.println("已经连接上一个客户");
(在这里我们要注意,当我们调用server.accept的时候,程序会卡在这里,直到有客户机连接上来,这个方法才会返回,返回一个Socket类对象,就是这里的client,client的出现就代表着服务器和客户端保持通信状态。)
第三步:从Socket连接对象上调用方法得到输入输出流
java.io.IntputStream ins = client.getIntputStream; java.io.OntputStream out = client.getOutputStream;
第四部:读写数据
String outMsg = "我爱你我的宝贝#"; byte[] data = outMsg.getBytes();//得到字节数组 //用输出流写出 ous.write(data); System.out.println("发送了消息给客户机"); //读客户端:阻塞!读取一个字节 int b= ins.read(); while(true) { System.out.print("读到一个字节"+b); b = ins.read(); }
接下来我们完成下 客户端
哈哈 由于本人偷懒,我使用 cmd localhost 8989 进行通信测试结果如下:服务器成功发送了消息“我爱你我的宝”给客户端,客户单输入1111,服务器也成功读取到数据。
至此,一个简单的通信模型就搭建好了,另外上面我们收到的是字节,如果想读出服务器发送的字符,我们可以从输入流对象中读取字节,拼成字符串返回,如下。
private String readString(InputStream ins) throws Exception{ //创建一个字符串缓冲区 StringBuffer stb=new StringBuffer(); char c =0; while(c!=13){ //遇到一个换行,就是一句话 int i= ins.read();//读取客户机发来的一个字节 c=(char)i;//将输入的字节转换为一个Char stb.append(c); } //将读到的字节组转为字符串,并调用trim去掉尾部的空格 String inputS=stb.toString().trim(); return inputS; }
结果:
这样,一个简单的通信模型就初步完成了,目前一个服务器只能和一个客户端进行通信,后续将应用多线程服务器,使得服务器能同时和多台客户端进行通信(未完待续)