Java教程

java网络通信(聊天室)(一)0531

本文主要是介绍java网络通信(聊天室)(一)0531,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

网络基础知识

什么是telnet,它有什么用?

要测试服务器上是否存在某个端口:telnet,连接对方的端口,如果能连接上,证明端口是打开的

我们首先Ping www.taobao.com,查看这个域名的IP地址,再使用telnet命令来测试
在这里插入图片描述
回车后看到全黑的命令窗口,如上:

当我们在命令窗口输入任意字符,结果如上所示,连接丢失。因为服务器上的web服务与客户端通信使用的事http协议,我们发的字符服务器无法理解,然后返回错误断开与客户端的连接
什么是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;
}

结果:
在这里插入图片描述
在这里插入图片描述

这样,一个简单的通信模型就初步完成了,目前一个服务器只能和一个客户端进行通信,后续将应用多线程服务器,使得服务器能同时和多台客户端进行通信(未完待续)

这篇关于java网络通信(聊天室)(一)0531的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!