网络聊天室——掌赢在线笔试

2017猿辅导校招笔试题复盘:在线教育技术人才筛选的底层逻辑 算法与数据结构是技术面试的基石,而系统设计能力则反映了工程师对真实业务场景的理解深度。在校招笔试中,题目往往通过业务包装考察候选人的问题拆解与工程落地能力。以在线教育为例,直播课高并发、课件同步、智能推荐等场景,要求开发者不仅掌握基础算法,还需具备架构选型、缓存策略、异常处理等实践素养。从2017年猿辅导的笔试题切入,可以看到教育科技公司如何通过选择题、编程题与设计题,分层筛选具备业务敏感度和工程思维的人才。这类考察逻辑对准备技术校招的同学具有参考价值,也揭示了行业技术栈从基础算法向分布式、大数据等方向演进 阅读详情

    最近做了掌赢信息科技(上海)有限公司的一个在线笔试题,服务端机试题目——网络聊天室,比较开放,给24个小时进行答题,虽然就一个题目,但是对于我来说,量还是挺大的,对方解释主要是看笔试者的代码风格习惯。花了点时间完成了基本的要求,现将题目记录如下。


题目

服务端机试题目(Java/C/C++/Go) 

1. 实现一个简单的网络聊天室服务端,功能要求如下:

    1) 实现服务端(命令行即可,不需要图像UI,使用TCP);

    2) 客户端通过telnet连接至服务端;

    3) 使用NIO模式;

    4) 超时处理:用户超过60S无输入,自动断开连接;

    5) 客户端初次连接时服务端返回提示信息,提示用户输入用户昵称;用户输入昵称后,按回车键发送至服务器,如果此昵称已经有其他人用,提示重新输入;如果昵称唯一,则登录;

    6) 客户端登录后,输入任何abcd等普通字符,按回车键发送至服务器;当客户端输入‘/quit’并回车时('/'表示此输入是命令),断开连接;

    7) 服务器接收客户登录,保证客户昵称唯一即可;用户登录后发送已经设置好的欢迎信息和在线人数给客户端;

    8) 服务器收到已登录用户的输入内容,然后在内容前面加上发送方的昵称和分号,转发至其他所有登录客户端,不回发给发送此内容的客户端;

    9) 有客户端上线或者下线时,发送通知到所有在线用户,通知内容为“xx已上线”,“xx已下线”;

    10) 考虑服务端如果需要支持10万以上级别客户端登录的情况;

    11) 各种数据不需要存磁盘;

    12) 请看完下一题再开始写代码;

2. 在上一题的基础上,实现自动查询机器人服务,功能要求如下:

    1) 实现天气查询服务,客户端输入:"/天气 北京",服务端调用接口获取北京天气信息返回给客户端;第一个词为查询词('/'表示此输入是命令),后一个为查询关键词,查询类的输入内容,不用发给其他用户;

    2) 程序结构需要设计灵活,将来增加查询股票、火车票、飞机票等功能;比如查询火车票的查询格式为:"/火车票 北京 上海",即可查询北京到上海的火车票情况;

    3) 需要有缓存机制,比如城市天气信息,相同城市缓存2小时,减少对接口的调用次数;

    4) 如果需要实现查询功能的动态增减,给出解决办法说明,不需要写出代码;

3. 给出文档说明,要求如下:

    1) 程序设计的思路;


    2) 系统还有哪些改进点;


    3) 如果系统支撑的用户数量扩大100 倍,如何处理;

    注意:此机试答案需提交代码(上传压缩包)和文档



程序实现


1. 几点说明

按照上面的要求,基本完成,由于时间有限,也是因为自己不熟,有几条没能实现:
1)客户端是自己同样利用TCP编写的,没有按照要求用telnet连接至客户端;因为不是很熟,尝试过有些小问题,时间紧迫,所以选择放弃。
2)没有使用NIO模式,这个模式在JAVA中有封装好的包可以使用,也是因为不熟,没时间折腾,所以选择放弃。
3)程序里没有考虑10万以上级别客户端高并发登陆的情况,请高手指教!
4)如果系统支撑的用户数量扩大100倍,如何处理?请高手可以指教一二!

2. 服务器与客户端设计


    Windows 7   32位
    采用的是winsock2
    时间关系,没有画图,抱歉!
【服务器】首先,用到的是阻塞的send和recv。按照常规设计,监听套接字启动以后,客户端连接上之后,立马为客户端建立一个线程,在线程中对用户名进行验证,保证其唯一性,若输入名重复,则一直阻塞于待登陆状态,若用户强关客户端,则线程结束。登陆成功后,给客户端发送提示信息,同时给其它用户发送该用户上线提示,之后进入聊天模式,每当接收到用户发来的信息,会群发给其他用户,当用户输入‘/quit’时或者强关时,同时,若超时60s无输入,会关闭线程,并发送此用户下线消息给所有用户(包括自己)。
#include "stdafx.h"
#include "User.h"
#include <iostream>
#include <winsock2.h>
#include <vector>
#include <regex>
#include "Message.h"
#include "Query.h"
#include "Weather.h"


using namespace std;
#pragma comment(lib, "ws2_32.lib")

#define MAXSIZE 2048
#define PORT  6001  // 服务器端口号
#define TIMELIMIT (2*60*60*1000)  // 天气查询缓存时间设定


SOCKET  ServerSocket, CientSocket;  // 套接字
sockaddr_in servAddr;  // 服务器网际网套接字地址结构
sockaddr_in cliAddr;  // 客户端网际网套接字地址结构
MsgInfo recvMsgInfo;  // 接收到的客户端用户数据信息
vector<CUser> onlineUsers;  // 在线用户数据集
int addrLen;  // 地址长度
vector<sWeather> vecWeather;  // 存放天气数据缓冲数据

CQuery *query;
CWeather *weatherQuery;

// 服务器创建的聊天线程
DWORD WINAPI ClientThread(LPVOID lpParameter)
{
	SOCKET CientSocket = (SOCKET)lpParameter;
	int ret = 0;
	char RecvBuffer[MAXSIZE];

	// 先验证用户名
	string name;
	send(CientSocket, "请输入用户名:", 100, 0);
	while (true)
	{
		memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
		ret = recv(CientSocket, RecvBuffer, MAXSIZE, 0);

		name = RecvBuffer;
		if ("" == name)  // 当用户没输入账号直接关闭客户端时,name就会为空,算是一个异常(后面再考虑统一写一个异常处理类,方便扩展程序)
		{
			return 0;
		}
		else
		{
			if (CUser::findUser(name, onlineUsers) != NULL)
			{
				CMessage::sendMessage("login", "此用户名已存在,请输入用户名:", CientSocket);
				continue;
			}
			else
			{
				break;
			}
		}
	}

	// 登陆成功发送欢迎内容和在线人数
	char c[10];
	_itoa_s(onlineUsers.size() + 1, c, 10);  // int转char[]
	string sn(c); // char转string
	string wellcom = "==================欢迎【" + name + "】成功加入聊天==================\n目前在线人数:" + sn + "\0";
	CMessage::sendMessage("wellcom", wellcom, CientSocket);  // 发送欢迎信息和在线人数

	// 将新登录的用户加入到在线用户集 
	CUser::addUserToOnline(name, cliAddr.sin_addr, cliAddr.sin_port, CientSocket, onlineUsers);

	// 接收用户聊天信息
	static bool isFirst = true;
	while (true)
	{
		if (isFirst)
		{
			string str = "用户【" + name + "】已上线!";
			CMessage::sendGroupMessage("userOnline", str, name, onlineUsers);  // 向其他用户群发此用户下线提示消息
			isFirst = false;
			cout << str << endl;
		}
		// 此条存在于服务器的聊天线程对用户发来的信息进行接收
		memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
		ret = recv(CientSocket, RecvBuffer, MAXSIZE, 0);  // 此时接收的的不是结构体数据,是字符串类型
		string tmp(RecvBuffer);
		// 判断是否是查询命令
		vector<string> vec;
		string space = " ";
		query->split(tmp,space,&vec);
		// 向其他用户群发聊天内容 或者向用户发送查询信息
		if (ret == 0 || ret == SOCKET_ERROR  || "/quit" == tmp)
		{
			CUser::deleteUser(CientSocket, onlineUsers);  // 从在线用户中删除下线用户
			string str = "用户【" + name + "】已下线!";
			CMessage::sendGroupMessage("userOffline", str, name, onlineUsers);  // 向其他用户群发此用户下线提示消息
			cout << str << endl;
			break;
		}
		else if ("/天气" == vec[0] && vec.size() > 1)  // 可以不用判断vec是否为空,不存在这种情况
		{
			sWeather* cw = weatherQuery->findCityWeather(vec[1], vecWeather, TIMELIMIT);
			if (NULL != cw)
			{
				CMessage::sendMessage("weather", cw->weatherInfo, CientSocket);  // 发送查询的天气信息
			}
			else{
				CMessage::sendMessage("weather", "【提示】:未能查询到天气信息!\n可能出现的情况:1)查询命令出错(如城市不存在等) 2)天气查询服务器不稳定没有返回值\n请重新输入查询命令!", CientSocket);
			}
		}
		else{
			CMessage::sendGroupMessage(name, tmp, name, onlineUsers);
		}

		cout << name << ":" << RecvBuffer << endl;
	}

	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	weatherQuery = new CWeather();
	query = weatherQuery;

	// 服务器启动时,清空在线用户数据
	onlineUsers.clear();

	WSADATA  Ws;  // Windows Sockets初始化信息
	int ret = 0;  // 绑定、监听操作等返回值
	HANDLE hThread = NULL;  // 聊天线程
	char RecvBuffer[MAXSIZE];  // 接收客户端的数据
	char SendBuffer[MAXSIZE];  // 发送给客户端的数据

	// 1. 启动winsock操作
	if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0)
	{
		cout << "Windows Sockets初始化失败!" << GetLastError() << endl;
		return -1;
	}

	// 2. 创建TCP套接字socket
	ServerSocket = socket(AF_INET, SOCK_STREAM, 0);
	if (ServerSocket == INVALID_SOCKET)
	{
		cout << "套接字创建失败!" << GetLastError() << endl;
		return -1;
	}

	// 3. 参数绑定 
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);  // 设置通配地址:此宏表示本地的任意IP地址(可能有多个网卡),即在所有的IP地址上监听
	servAddr.sin_family = AF_INET;  // 设置地址类型为AF_INET
	servAddr.sin_port = htons(PORT);  // 设置服务器端口
	memset(servAddr.sin_zero, 0x00, 8);  // 将整个结构体清零

	// 4. 将TCP套接字与地址绑定
	addrLen = sizeof(servAddr);
	ret = bind(ServerSocket, (sockaddr*)&servAddr, addrLen);
	if (ret != 0)
	{
		cout << "套接字与地址绑定失败!" << GetLastError() << endl;
		return -1;
	}

	// 5. 开始侦听:把套接字转换为一个监听套接字,即声明listenfd处于监听状态
	ret = listen(ServerSocket, 5);  // 等待队列最大成员数5
	if (ret != 0)
	{
		cout << "监听套接字启动失败!" << GetLastError() << endl;
		return -1;
	}
	cout << "服务端已经启动" << endl;

	// 6. 接收客户端发来的连接请求
	while (true)
	{

		addrLen = sizeof(cliAddr);	
		// 握手成功后,服务器调用accept接收连接,若还无客户端连接,则阻塞直到有客户连接,返回时传回客户端的地址和端口号
		CientSocket = accept(ServerSocket, (sockaddr*)&cliAddr, &addrLen);  
		if (CientSocket == INVALID_SOCKET)
		{
			cout << "无效套接字!" << GetLastError() << endl;
			break;
		}
		cout << "客户端连接信息:" << inet_ntoa(cliAddr.sin_addr) << ":" << cliAddr.sin_port  << endl;

		// 创建聊天线程
		hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);
		if (hThread == NULL)
		{
			cout << "聊天线程创建失败!" << endl;
			break;
		}
		CloseHandle(hThread);
	}

	closesocket(ServerSocket);  // 关闭套接字
	closesocket(CientSocket);  // 关闭套接字
	WSACleanup();  // 关闭加载的套接字库
	return 0;

}

【客户端】启动后,与服务器建立连接,用户登录成功后,则创建一个服务器群发消息的接收线程,对服务器传来的消息进行接收,然后主线程接着进入一个循环函数,进行消息的发送操作。
【天气查询】在服务器与客户端处于天阶段,客户端发送“/天气 武汉”字符串到服务器,服务器利用《中央气象台的API》进行天气信息的获取,之后用JsonCPP对获得的json数据进行解析,把需要的内容发送给客户端。中间有详细的异常控制和出错提示,如命令错误、天气查询服务器不稳定问题等。
#include "stdafx.h"
#include <iostream>
#include <winsock2.h>
#include "Message.h"

using namespace std;

#pragma comment(lib, "ws2_32.lib")

#define MAXSIZE 2048
#define  PORT 6001
#define  IP "127.0.0.1"

SOCKET CientSocket;
sockaddr_in servAddr;

DWORD WINAPI thread(LPVOID lpParameter)
{

	SOCKET CientSocket = (SOCKET)lpParameter;
	int ret = 0;
	char RecvBuffer[MAXSIZE];

	while (true)
	{
		memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
		ret = recv(CientSocket, RecvBuffer, MAXSIZE, 0);
		MsgInfo msg;
		memset(&msg, 0, sizeof(MsgInfo));  // 清空结构体
		memcpy(&msg, RecvBuffer, sizeof(RecvBuffer));  // 以这种方式将字符串转换成结构体数据
		string name,data;
		name = msg.flag;
		data = msg.info;
		if ("userOffline" == name || "userOnline" == name)
		{  // 用户下线提示
			cout << data.c_str() << endl;

		}
		else if ("weather" == name)  // 如果是查询的天气信息
		{
			cout << data.c_str() << endl;
		}
		else{  // 其他用户聊天内容
			cout << name.c_str() << ":" << data.c_str() << endl;
		}
	}
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA  ws;
	int ret = 0;
	HANDLE hThread = NULL;
	char SendBuffer[MAXSIZE];
	char RecvBuffer[MAXSIZE];

	// 1. 启动winsock操作
	if (WSAStartup(MAKEWORD(2, 2), &ws) != 0)
	{
		cout << "Windows Sockets初始化失败!" << GetLastError() << endl;
		return -1;
	}

	// 2. 创建TCP套接字socket
	CientSocket = socket(AF_INET, SOCK_STREAM, 0);
	if (CientSocket == INVALID_SOCKET)
	{
		cout << "套接字创建失败!" << GetLastError() << endl;
		return -1;
	}

	// 3. 参数绑定 
	servAddr.sin_addr.s_addr = inet_addr(IP);  // 设置通配地址:此宏表示本地的任意IP地址(可能有多个网卡),即在所有的IP地址上监听
	servAddr.sin_family = AF_INET;  // 设置地址类型为AF_INET
	servAddr.sin_port = htons(PORT);  // 设置服务器端口
	memset(servAddr.sin_zero, 0x00, sizeof(servAddr.sin_zero));  // 将整个结构体清零
	
	// 4. 开始连接
	ret = connect(CientSocket, (sockaddr*)&servAddr, sizeof(servAddr));
	if (ret == SOCKET_ERROR)
	{
		cout << "Connect连接出错!" << GetLastError() << endl;
	}

	// 5. 与服务器沟通-->创建用户
	ret = recv(CientSocket, RecvBuffer, MAXSIZE, 0);  // 接收数据“请输入用户名:”
	cout << RecvBuffer << endl;
	cin.getline(SendBuffer, sizeof(SendBuffer));  // 输入用户名
	ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
	memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
	ret = recv(CientSocket, RecvBuffer, (int)sizeof(RecvBuffer), 0);  // 接收信息
	MsgInfo msg;
	memset(&msg, 0, sizeof(MsgInfo));  // 清空结构体
	memcpy(&msg, RecvBuffer, sizeof(RecvBuffer));  // 以这种方式将字符串转换成结构体数据
	string sflag;
	sflag = msg.flag;
	bool isCout = false; 
	while (msg.flag == "login"){  // 返回的标记flag="login",表示账号已存在,需要重新输入,知道正确的账号为止
		if (!isCout)  
			cout << msg.info << endl;
		cin.getline(SendBuffer, sizeof(SendBuffer));
		ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
		memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
		ret = recv(CientSocket, RecvBuffer, MAXSIZE, 0);
		MsgInfo msg;
		memcpy(&msg, RecvBuffer, sizeof(RecvBuffer));
		sflag = msg.flag;
		cout << msg.info << endl;
		isCout = true;   
	}
	if (!isCout)
		cout << msg.info << endl;


	// 创建服务器群发消息接收线程
	hThread = CreateThread(NULL, 0, thread, (LPVOID)CientSocket, 0, NULL);
	if (hThread == NULL)
	{
		cout << "聊天线程创建失败!" << endl;
		return -1;
	}
	CloseHandle(hThread);

	// 正式开始聊天
	while (true)
	{

		// 输入聊天内容,并向服务器发送
		cin.getline(SendBuffer, sizeof(SendBuffer));
		ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);  // 此时发送的不是结构体数据,是字符串类型
		if (ret == SOCKET_ERROR)
		{
			cout << "信息发送出错!" << GetLastError() << endl;
			break;
		}
		// 当客户端输入“/quit”,表示断开连接,结束聊天
		string tmp(SendBuffer);
		if ("/quit" == tmp)
		{
			return -1;
		}
	}

	closesocket(CientSocket);  // 关闭套接字
	WSACleanup();  // 关闭加载的套接字库

	return 0;
}

3. 程序设计类

【服务器】
    1)CMessage: 通信过程中的信息类,主要封装了用于socket通信的结构体和一些方法
    2)CUser:用户信息类,用户保存用户信息
    3)CQuery:查询功能基类;对于可能要添加的查询功能的一些基本抽象,便于扩展功能
    4)CWeather:查询天气情况的类,派生于CQuery,主要封装了天气查询的一些属性和方法
【客户端】
    CMessage:
通信过程中的信息类,主要封装了用于socket通信的结构体

4. 针对查询功能

        程序实现了对天气的查询,为了方便扩展,我写了一个基类,利用继承多态的形式来方便扩展,当需要添加一个新的查询功能时,只需要继承CQuery类,后面着重实现查询派生类即可,对其他模块修改的少。当然也可以利用模板类或者模板函数来实现多态。

内容还是比较多的,由于时间关系,这里说得相当简单,具体请看下源码,有注释说明。


源码程序

                      exe:http://download.youkuaiyun.com/detail/ningsoft/8759733

                      源码:







深信服C/C++校招C卷笔试核心考点与手写代码避坑指南 C/C++是一门贴近系统底层的开发语言,指针、内存布局与数据结构基础直接决定软件质量。深刻理解数组与指针的区别、结构体对齐原理,才能在字符处理与文件读写场景中避免潜在风险。例如,字符串逆序和冒泡排序这类基础算法,不仅考察编码习惯,更能体现边界意识与空间复杂度优化能力。此外,系统临时文件的生成机制也与此紧密相关——合理的文件读写与资源清理策略是保障磁盘可用性的重要工程实践。在网络安全、云计算等领域,C/C++的底层能力尤为关键。针对深信服校招笔试,C卷重点聚焦C/C++基本功、内存管理与手写代码能力,系统梳理 阅读详情

相关推荐

巨人网络2024校招游戏社交系统架构师编程挑战

第一部分:引言与概述 第1章:巨人网络2024校招背景与重要性 1.1 巨人网络2024校招总体情况介绍 巨人网络作为中国领先的互动娱乐软件企业,一直致力于推动游戏行业的发展与变革。为了吸引优秀人才,巨人网

AI天才研究院 1149

计算机网络课设题目java_Java课程设计(2020版)

参考资料更多参考资料请查看QQ群文件中的课程设计目录。一. 题目选择说明课程设计的题目有两大类:1. 传统题目Java课程设计任务书里面的题目。详见:Java课程设计参考资料Java的一些小任务,可将里面的任务改造成课程设计。2. 综合性题目(有一定挑战性、有趣、实用)2.1题目特点:无固定题目要求可根据自己的想法自己出题,出提前最好和老师交流,以确定题目是否可行。完成周期长、难度大、综合性强较难...

weixin_33093323的博客 1177

基于C# Socket的Windows桌面聊天室完整工程:服务端监听+多客户端实时通信

一套开箱即用的C#聊天室源码,包含独立编译的服务端(ChatServer)和客户端(ChatClient)两个VS项目,全部使用Windows Forms构建界面。服务端启动后监听固定端口,支持消息接收与广播转发;客户端可连接服务端,实现群聊和指定用户私聊功能。登录界面(Login.cs)、主聊天窗体(Form1.cs、ChatClient2.cs)、资源文件(.resx)、项目配置(.csproj/.sln)齐全,Visual Studio 2015及以上版本可直接打开编译运行。代码基于.NET Fram

view3的博客 269

网络编程基础_5.2聊天室-单聊服务器

聊天室-单聊服务器 #include <stdio.h> // 1. 包含必要的头文件和库, 必须位于 windows之前 #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") #include <windows.h> #include <ws2tcpip.h&...

weixin_30758821的博客 140

简易聊天室(带服务端,客户端,源码)

简易聊天室,新手向. 只是提供一个思路 登录注册的用户系统没写,只是一个简单的发送数据 系统结构:用户登录,用户注册,小维_加载皮肤,小维_Visita特效,刷新列表,用户_在线用户读取,小维_加载皮肤,小维_Visita特效,

采用C/S结构的聊天室系统

此系统,采用C/S模式。聊天室共分为服务器端和客户端两部分。 A、服务端程序主要负责侦听客户端发来的消息。 B、客户端需登录到服务端才可以实现正常的聊天功能。 (1)服务器端的主要功能如下:  在待定端口上进行侦听,等待客户端连接。  用户可以配置服务端的侦听端口,默认端口为8888。  向已经连接到服务端的用户发送系统消息。  统计在线人数。  当停止服务时,断开所有的用户连接。 (2)客户端的主要功能如下:  连接到已经开启的聊天服务的服务端。  用户可以配置连接后显示的用户名。  当服务端开启的话,用户可以随时登录与注销。  用户可以向所有人或者一个人发送消息。

百度前端面试题-类似slack的在线聊天室

别人国庆出去玩,我在家写代码的感觉也是很不错哒。 首先介绍一下技术架构吧! 使用了js框架:FFF,zepto,jquery,md5.min.js 前端框架:Bootstrap 后端:野狗,部分PHP github地址:https://github.com/knowThis/fex-stack.git 官网地址:http://chatroom.zhouxianbao...

ailian0591的博客 243

机器学习kaggle案例:风控评分卡模型(Give_Me_Some_Credit)

kaggle链接:https://www.kaggle.com/c/GiveMeSomeCredit ipynb文件:https://github.com/824024445/KaggleCases/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0kaggle%E6%A1%88%E4%BE%8B%EF%BC%9A%E9%A3%8E%E6%8E%A7%...

weixin_42662126的博客 1万+

深信服Go开发岗笔试复盘:网络、并发与系统编程考法拆解

Go语言凭借goroutine和高效的并发模型,成为网络与安全产品后端开发的热门选择。理解GMP调度、三色标记GC以及内存逃逸等底层原理,是应对高并发场景的基础。在工程实践中,TCP/IP协议、I/O多路复用、cgo调用、以及gin/go-zero等框架的选型,直接决定了系统的稳定性和可维护性。这些知识点不仅服务于云桌面、SD-WAN、EDR等安全产品的研发,也是深信服等企业秋招笔试的高频考点。本文结合2023年深信服Go开发岗真题,从语言基础、网络系统编程到业务场景设计,逐层拆解考法逻辑,帮助你建立完整的

weixin_34203832的博客 582

InSAR_ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场

ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场 ISCE软件做干涉只需要将数据准备好,并配置好insarApp.xml文件即可进行。 一、数据准备 1、SAR数据获取 本利中使用的数据为欧空局提供的sentinel-1A/B数据,可从阿拉斯加数据服务器上下载,具体下载方法可参考: 哨兵数据下载方法. 2、哨兵卫星轨道文件下载 哨兵数据处理除了需要SAR影像外,还需提供轨道参数文件,可从https://qc.sentinel1.eo.esa.int/aux_poeorb/下载。下载

weixin_42128764的博客 1万+

zemax混合式非序列模拟

注意不要点击左侧的非序列模式,那个时纯粹的非序列,会清除序列模式的数据。第2、4、6透镜材质为空气,是为了让光线进入到多重透镜内部。这时普通的优化方式会失败。平行光束经过多焦透镜时,会汇聚在不同焦距处。所以还需要控制能量的大小,进行优化。接下来用非序列模式设计一个多焦透镜。像面的孔径为圆形通光孔:0-1.2。透镜不同位置处有不同的聚焦位置。透镜的z轴位置相同,重合。

fendoudecheng的博客 3067

webGL,websocket,nodeJS做的3D的多人在线游戏

希望路过的朋友们能够帮帮忙……     先说一下自己做的这个东西吧,我把它开源了并托管在github上,源代码地址在这里,它大概长这个样子……,最左侧是聊天系统,可以缩放到左下角,聊天系统支持广播和私聊两种方式,要先输入昵称才能进入聊天室,点击右侧昵称切换到私聊,点击右侧牛头换到广播(这奇葩的操作,我是怎么想的……)支持键盘操作,比如0-9切换枪,·键弹出系统菜单,空格跳跃,wasd行走等等,源

无咎 3484

MIPI DPHY接口(基于Xilinx FPGA实现)案例分析

在Xilinx FPGA实现MIPI DPHY接口的案例(包括CIS协议层)。截止目前为止,Xilinx仅在Ultrascale+及其以上版本的FPGA IO可直接支持MIPI 电平输入,其他的,都需要转换成LVDS来接收。

ONEFPGA的博客 5626

游戏公司校招技术岗笔试复盘:以游卡为例的备考指南

在技术岗位求职中,笔试不仅考察算法与数据结构,更检验候选人的工程实践能力和行业理解。游戏公司作为高并发、低延迟场景的典型代表,其技术岗笔试往往融合通用基础与业务特征,要求求职者既要掌握操作系统、网络、数据库等核心知识,也要理解缓存、同步机制、系统架构等实际应用。从原理出发,Redis在排行榜、会话管理中的高效应用,帧同步与状态同步对游戏体验的直接影响,以及ECS架构对工程复用的价值,都是笔试中的高频切入点。这些技术的价值贯穿于真实业务场景,例如全服排行榜设计、断线重连恢复等。本文以游卡技术岗笔试为样本,完整

weixin_34326558的博客 414

Android GWP-Asan机制详解

基本用途:GWP-ASan是一种原生内存分配器功能,在内存分配时额外记录一些信息,用于检测DOUBLE_FREE、USE_AFTER_FREE、INVALID_FREE、BUFFER_OVERFLOW、BUFFER_UNDERFLOW五种内存错误问题。

专注于系统快稳省领域 4144

在鸿蒙中使用AVPlayer完成视频的播放【坚果派】

播放的全流程包含:创建AVPlayer,设置播放资源和窗口,设置播放参数(音量/倍速/缩放模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。5.准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置缩放模式、音量等。8.退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。6.视频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。今天我们来看一下视频如何正常播放。

坚果的博客 4056

BAT实习内推笔试题复盘:数据结构、算法与工程思维全解析

在技术面试中,数据结构与算法始终是衡量候选人基础能力的关键标尺。无论是百度、阿里巴巴、腾讯等互联网巨头的校园招聘,还是日常的编程实践,掌握数组、链表、二叉树、动态规划等核心知识,都是构建技术竞争力的基石。与此同时,小写“bat”批处理脚本作为Windows环境下的自动化工具,在处理批量文件操作、系统优化等场景中同样不可或缺。本文以一份2015年BAT实习内推笔试卷为线索,系统回顾了计算机基础、编程题与开放设计题的考察逻辑,并澄清了大厂笔试与批处理脚本之间的概念差异,帮助读者在备战大厂面试时建立完整的技术认知

weixin_33892359的博客 504

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 998

直播研发岗笔试高频考点全解析:从HashMap到系统设计

高并发场景下,扎实的Java基础与网络原理是研发工程师的核心竞争力。以HashMap为例,其底层数据结构、put流程与扩容机制直接关乎系统性能;而线程池的参数配置与拒绝策略,则决定了服务在流量峰值时的稳定性。TCP连接管理中的TIME_WAIT问题,在弹幕、礼物等直播互动场景中尤为突出。理解这些基础概念的原理与权衡,能够帮助开发者应对真实业务中的高并发挑战。本文以映客2020春招研发B卷为样本,系统梳理了直播、社交、音视频类公司笔试中的客观题、编程题及系统设计题,涵盖Java集合、并发编程、网络IO、算法设

weixin_30572613的博客 376

TIA博途WINCC的触摸屏VB脚本入门指南(嵌入式)

通过编写事件处理程序,您可以响应触摸屏元素的各种事件,并实现自定义的功能。本文将为您提供TIA博途WINCC触摸屏VB脚本的入门指南,帮助您了解基本的脚本编写和嵌入式开发。假设我们有一个名为"Button1"的按钮元素,当用户点击该按钮时,触发相应的事件处理程序,并在触摸屏上显示一条消息。然后回到触摸屏界面编辑器,在按钮元素的属性窗口中找到"按下"事件,并选择刚才创建的脚本文件作为事件处理程序。现在,当用户点击按钮时,触摸屏将执行相应的事件处理程序,并显示一条消息框,内容为"按钮被点击了!

CodeSageX的博客 4418

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java面笔试总结

java面笔试总结 2011年04月10日   2010、10、12 湖南华诺集团面试题集   1、Double、Class是final类,不能被继承;Math、Thread可以被继承   2、 当前类 同一package 子孙类 其它package   Public √ √ √ √   ...

fbi320oz 274

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++实战:构建一个简易的TCP/IP聊天室(附完整源码)

本文详细介绍了如何使用C++构建一个简易的TCP/IP聊天室,涵盖服务端和客户端的核心架构、多线程模型、消息广播协议设计及异常处理等关键技术。通过完整源码示例,帮助开发者掌握网络编程基础,实现高效的多客户端通信,适用于实时聊天、远程控制等场景。

weixin_34216196的博客 190

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

欢聚时代iOS笔试题深度解析:从OC底层到并发编程全考点

在iOS开发面试中,语言基础与底层机制始终是考察的重点。Objective-C作为成熟的移动开发语言,其分类、Block、内存管理等知识点,直接关系到App的性能与稳定性。理解ARC下的内存管理规则,掌握GCD并发编程的核心原理,是规避循环引用与死锁问题的关键。从实际工程场景出发,无论是社交IM的长连接通信,还是直播场景的弱网优化,都离不开对这些基础概念的深入运用。本文将围绕一套经典iOS校招笔试题,系统梳理Objective-C运行时特性、KVC/KVO机制、并发编程及UI架构设计等高频考点,帮助开发者夯

weixin_29012677的博客 279

C语言校招笔试核心考点解析:指针、内存与工程思维

C语言作为系统级编程的基石,其核心能力集中在指针与内存管理。理解指针运算、内存分区、结构体对齐等底层原理,不仅是解决段错误、内存泄漏等线上故障的前提,也是构建高性能网络服务的基础。在音视频直播、实时通信等对延迟和稳定性要求极高的场景中,C/C++底层的精良控制直接影响数千万用户的实际体验。掌握这些核心概念,对于准备校招笔试或夯实工程基础都至关重要。本文围绕欢聚时代C卷中的典型考题,梳理从语法细节到编码习惯的进阶路径,帮助读者将“会做题”转化为“真懂C”。

weixin_33895516的博客 424

【AI大模型接入SDK】WebSocket & SSE 协议

选用SSE:业务只需要服务端向客户端推送,客户端不需要在长连接通道内回传消息,例如 AI 流式输出、监控日志、消息通知。选用WebSocket:业务需要双方频繁实时交互,例如在线对战游戏、聊天室、实时文档协同。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 4569

语音算法工程师笔试高频考点复盘:从信号处理到DNN-HMM

语音信号处理是语音识别、语音增强等智能交互技术的核心支撑,从采样定理到傅里叶变换,从音频特征到声学建模,每一环都直接影响系统效果。理解数字信号处理的基本概念,掌握MFCC特征提取的数学原理,明白HMM在时序建模中的作用,是进入语音算法领域的基础。在实际工程中,语音端点检测、噪声抑制、解码搜索等模块均需综合运用这些知识,而直播、音视频会议、智能助手等场景又对技术的实时性和鲁棒性提出更高要求。本文围绕语音算法岗位笔试中的典型题目,梳理了信号处理、特征提取、GMM-HMM与DNN-HMM演进、N-gram语言模型

weixin_34025151的博客 442
上一篇: 关于实现高并发服务端的一些想法
下一篇: 360在线笔试(部分)
-年轮-
博客等级 码龄14年 9粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值