真正去理解Socket通讯方式,手卡与基站连接方式到底是怎么样的?

在2018/10/25-2018/11/08项目试运行期间,存在着某种奇怪的现象,现象描述如下:

 工人下井时候,基站总是漏了个别人的信号;

工人下班出井口的时候,大约7个人中总有一两个人的手卡信号,基站是收不到信号的;

注意:只有一个手卡的信号超过10分钟没有收到而且最后的位置是在井口位置消失的,才能把这个人从大屏幕上消失;

这个现象导致的结果是:

这个人明明已经下班了,但是由于井口基站收不到信息,最后接受信号的基站并非是井口的基站,不满足在大屏幕上消除的条件,这个人的名字会一直显示在大屏幕上;

当一个人的名字一天都显示在大屏幕上的时候,人们会认为这个人在井下是出现了矿难或者是危险的事情,这是不好的征兆。人们会下去救援;如果这个人没事的话,大屏幕上一直显示,会造成虚报报警;

造成如上情况的原因究竟是什么?

猜想1、是工人路过基站信号覆盖的区域的时候由于走的太快了,再加上是一群人一起上下班,基站来不及读取所有人的信号?

猜想2、这些个别人的手卡有问题?

猜想3、手卡每隔10s发送一次数据到基站,如果6个手卡,基站接受的数据至少1分钟,一个成年人的速度,走出信号覆盖的区域只需要40s就可以了;

猜想4、由于信号覆盖的区域有强弱之分如同磁场一样,在信号强的时候,接受速度很快,在弱的情况下,只有几个人可以连接上基站发送信号,工人下班及时在基站信号范围好的情况到信号不好的情况?

猜想5、还是程序存在的问题?因为之前18秒可以接受20个手卡信息,现在怎么9个人的信号都接受不了?是程序哪里出了问题么?

上述猜想暴露的问题主要是:

与基站连接时间太短有关、信号强弱分布不均匀、手卡本身连接基站方式有关、程序有问题;

以下是我的实验过程:

基站与手卡怎么建立连接、发送数据如下:

 

项目试运行过程中,总会出现,耗时20s、15s、8s、甚至超过1min的现象

如上的条件是:

19个基站,开启多线程,总共4个人;按理说同一个手卡发送数据是10s一次,多线程的开启是互不影响的,怎么会出现一个手卡都是间隔20s或者几分钟都没有数据发送的情况?

不知道是什么阻挡了通讯的信号接收??

多线程虽然同时运行,但也争夺先后,所以是不是谁先就先执行谁的任务,也存在排队,虽然是互不干扰的?

 

 

 试运行的代码与如上测试的代码是一样的

之前测试,只是看全部接受手卡信号需要多长时间,但是从来没有把程序运行3-5分钟,来看看结果是不是跟预想的一样,

试运行期间的代码:

//这个读取数据,如果输入流里没有数据,就重新建立连接
	public static void Port(ServerSocket server){
		Socket socket1 = null;
		Date dd=new Date();
		SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String ss=sim.format(dd);
		System.out.println("连接之前:"+ss);
		try {
			socket1 = server.accept();
			System.out.println("连接之后:"+ss);//延迟1秒执行 目的是为了使一次读取输入流里面的数据更多一点
			Thread.sleep(2000);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
		try {
			while(true){
				InputStream in=socket1.getInputStream();
				byte[] buf = new byte[1024];
				int len = -1;
				len = in.read(buf);
				if(len>7){			
					ThreadReaders.read(buf,len);
				}else{
					Port(server);	
				}
					
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

这个是修改过后的代码:

2018-11-9再次修改博客,这个代码不正确,运行以后,虽然接受速度很快,而且没有大于2秒的间隔,但是都是同样的编号,这个博客的结论的科学性有待后期考证.......

//这个读取数据,如果输入流里没有数据,就重新建立连接
	public static void Port(ServerSocket server){
		Socket socket1 = null;
		Date dd=new Date();
		SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String ss=sim.format(dd);
		System.out.println("连接之前:"+ss);
		try {
			socket1 = server.accept();
			System.out.println("连接之后:"+ss);
			//延迟1秒执行 目的是为了使一次读取输入流里面的数据更多一点
				Thread.sleep(2000);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
						try {
			
				InputStream in=socket1.getInputStream();
				byte[] buf = new byte[1024];
				int len = -1;
				len = in.read(buf);
				while(len>7){		
//2018-11-9修改博客 这个程序不对,len>7是恒成立的,因为一开始只有接受数据 len就一定大于7,而且一直成立,只能获取一个编号的值	
					ThreadReader.read(buf,len);
				}
					Port(server);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
}

当把这两个程序在同一个条件下面试运行同样的时间以后,结果如下:

 

 2018-11-9 再次修改这个博客,当项目试运行一天以后,发现一个致命的缺陷,就是这张表,仔细发现全是一个number=0256的,这个修改过的程序是错误的;因此这个结论是有待考证的。

 

 

 

 

 

 

 

 以上实验报告证明:

试运行期间出现的问题与信号强弱、与手卡、与时间长短、与连接方式都无关,是程序出了问题;

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/83856928