“步入”通信以及遇到的那些小问题

这两天步入java通信的学习。

首先来说一下服务器。服务器严格的讲是管理资源并为用户提供服务的计算机。通俗一点讲就是等待用户连接
并对用户发过来的信息进行处理。而客户机是连接服务器并访问服务器资料的计算机。

因此,一个简单服务器的构建步骤为:1、创建服务器对象 2、等待客户机的连入 3、一旦有客户机连入后获取
客户机的输入输出流 4、对客户机发来的数据进行处理
而一个简单的客户机的构建步骤就更为简单了:1、创建客户机对象,并连接服务器 2、用输入输出流发送数据或获取
服务器发来的数据

但是在服务器与客户机之间收发消息必须有网络协议:
1、客户机与服务器都必须了解对方发来的数据是什么样的协议并且预先知道所要处理的所有步骤
2、客户机与服务器都必须遵守协议
3、协议必须明确并无歧义

先演示一下简单的服务器(协议为以回车为结束符号的字节)

public class ServeThread extends Thread {
	private java.net.Socket client;
	private java.io.OutputStream out;

	public ServeThread(Socket client) {
		this.client = client;
	}

	public void run() {
		dealChat(client);
	}

	/**
	 * 处理客户机发来的消息
	 * 
	 * @param client
	 */
	private void dealChat(Socket client) {
		try {
			// 数据的读入和输出
			out = client.getOutputStream();
			java.io.InputStream ins = client.getInputStream();
			DataInputStream dis = new DataInputStream(ins);

			// 输入
			String s = "欢迎来到游戏世界\r\n";
			sendMsg(s);

                                                 String input = readString(ins);// 读入字符串 
			 while (!input.equals("bye")) {   
                                                 System.out.println("客户机说" + input);
			 // 将客户机发送来的内容发回客户机 
			 s = "服务器收到" + input + "\r\n"; sendMsg(s);
			 input = readString(ins);// 读入字符串 
			 }
			  // 客户机断开与服务器的连接 
			 s = "欢迎下次再来";
			 sendMsg(s);
			 client.close();
                                } catch (IOException e) {
			e.printStackTrace();
	                }
	}

	/**
	 * 从输入流中读取的字节形成一句话返回
	 * 
	 * @param ins
	 *            输入流
	 * @return 字符串
	 * @throws IOException
	 */
	private String readString(InputStream ins) throws IOException {

		StringBuffer sb = new StringBuffer();// 字符缓冲区
		char c = 0;
		while (c != 13) {// 当未换行时
			int i = ins.read();// 读取客户机发来的一个字节
			c = (char) i;// 将字节转换成一个char
			sb.append(c);// 将这个字符加入到字符缓冲区中
		}
		String inputs = sb.toString().trim();// 将字符缓冲区中的字符连成字符串
		return inputs;
	}

	/**
	 * 封装发送方法
	 * 
	 * @param s
	 *            要发送的字符串
	 */
	private void sendMsg(String s) {
		try {
			byte[] date = s.getBytes();
			out.write(date);
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

而深入一点的是各种不同数据(如文件,消息等等)的传输,这个的话就要设计协议了,

例如

4 byte(类型)4 byte(整数)a byte  
1(表示消息)消息长度 a消息内容  

2(表示文件)

文件名长度 a文件长度 b文件名文件数据
4 byte(类型)4 byte(整数)4 byte(整数)a byteb byte

 

在数据的传送接收过程中,大概来说总是会遇到这些小问题:

1、如客户机输出的消息长度为a,但是输出的消息内容却并没有达到长度a,这个就必须在客户机输出之前要进行验证,否则传送过去的数据会出错

2、服务器接收到的数据要从字节数组转换成字符串,String s=data.tostring();这样写是错误的,会直接把data数组的地址转成string,而应该改写成String s = new String(data);

3、用什么方法输出的,就必须用什么方法接收

如 用OutputStream 输出,服务器就必须用InputStream读入;用DataOutputStream输出,就要用DataInputStream读入

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值