用socket 实现Modbus TCP/IP 通讯

如题,C++编程:用socket TCP/IP 更改端口号 为502 可以实现Modbus TCP/IP 通讯吗?
1、我现在服务器端是用socket TCP/IP 创建的,客户端用的是Modsim32的从设备仿真工具。
2、基本配置
物理链路上是通的;
我要实现服务器端到客户端数据的收发,服务器端 的端口号是502;
系统是win7 32 Pro 中文版,编译环境是VC++6.0;
3、测试结果,服务器创建失败;
4、问题,我这样做有问题么

1个回答

u011595652
不落男 我现在明白点了,那个模拟的客户端的接收端口是502,所以我用socket 写一个客户端的程序,主动连接那个模拟客户端应该就可以。具体的情况还得测试完再说。谢谢啦
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
modbus tcp/ip java开发

modbus 怎么用Tcp/Ip的方式通信设备, 设备根本没有IP和端口呢,怎么建立连接, 请大神指教

C#如何使用Socket自定义TCP/IP报文收发数据?

小弟刚刚工作,第一个项目用到了Socket,但客户给的文档我没懂,文档截图如下: ![图片说明](https://img-ask.csdn.net/upload/201412/30/1419940954_756814.png) ![图片说明](https://img-ask.csdn.net/upload/201412/30/1419941214_311476.jpg) ![图片说明](https://img-ask.csdn.net/upload/201412/30/1419941224_810183.png) 请问报文结构应该怎样设计?应该自定义结构体再通过Marshal对象转换成byte[]发送吗?那么用户名和密码的数据结构应该怎样设计呢?CRC16要怎样生成呢?

TCP/IP网络通信,自己写的client向modbus slave发送一串数据,modbus slave无法接收

问题如题。先说我的目的:我想让我的client发送{0,0,0,0,0,6,1,6,0,0,0,1}这样一串数据,对应的modbus slave会将第0位置1. 现在不止modbus salve没有动作,communication也抓不到任何信息。 如下贴上client的代码。 使用的是本机的IP地址,port口6530. ``` #include <iostream> #include <fstream> #include <winsock2.h> #include <stdio.h> #include <windows.h> using namespace std; void main() { int socket_return; int socket_length = sizeof(SOCKADDR); char my_recvbuf[200]; char my_sendbuf[12]={0,0,0,0,0,6,1,6,0,0,0,1}; //创建套接字库 WORD my_version_word; WSADATA my_wsaData; my_version_word = MAKEWORD(2,2); socket_return = WSAStartup(my_version_word,&my_wsaData); if (socket_return != 0) { return;//成功返回值为0 } if (LOBYTE(my_wsaData.wVersion) != 2 || HIBYTE(my_wsaData.wVersion) != 2) { WSACleanup(); return; } //创建套接字 SOCKET my_socket = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN my_socket_address; my_socket_address.sin_addr.S_un.S_addr = inet_addr("172.16.66.68"); my_socket_address.sin_family = AF_INET; my_socket_address.sin_port = htons(6530); //绑定套接字 bind(my_socket,(SOCKADDR*)&my_socket_address,socket_length); //connect if (connect(my_socket,(SOCKADDR*)&my_socket_address,socket_length) == 0) cout<<"connect the server correct!"<<endl; else cout<<"connect the server failed!"<<endl; while (1) { Sleep(1000); send(my_socket,(const char*)(char*)my_sendbuf,12,0); cout<<"the message has sent correctly!"<<endl; /*recv(my_socket,my_recvbuf,sizeof(my_recvbuf)+1,0); cout<<my_recvbuf<<endl;*/ //excetely successed } } ``` 我使用别的网络收听工具时,是可以接收到我这段信息的。 贴图如下: ![图片说明](https://img-ask.csdn.net/upload/201908/01/1564650277_511146.png) 为什么modbus slave收不到这段数据呢? 我怀疑是不是我发送的是char数组,数制不符合modbus的要求? 小弟愚钝,目前还是趟水过河的阶段,请各位大神不吝赐教。万分感谢。 ////////////////////////////////////////////////////////////////// 标记一哈,我好像发现了一点问题。 我使用的另一个网口调试助手是network_debug_tool. 我之前发送的12个元素的数组,要么是用的char,要么用的是UINT8,这些都是1bite的,按理说网口的速率应该是12bps,但是network可以接收这些数据,我看了一下server的RXspeed,是24bps。 我是用network模拟client,发送同样的一组数据给modbus slave,发现TXspeed也是24bps。这样的一组数据发给modbus slave,对方就可以响应。 我考虑把我的那一组数组改成UINT16,看看modbus slave是否会响应。 /////////////////////////////////////////////////////////////////// 改成UINT16,UINT32,统统都是24bps,感觉和数制的关系不大。改为uint16,network模拟的server接收到这样一串数据,“0,0,0,0,0,0,0,0,0,0,6,0”,而我发送的数据是“0,0,0,0,0,6,1,6,0,0,0,0,1”,应该是我默认发送的元素是12个?,所以把我发送的uint16的数字全拆开发送了?这样看来也不能说和数值关系不大。但是肯定不能用bps那个数来判断了。可惜我找不到监听工具,不知道我到底发出去的信息是什么样的。

C# 用modbus tcp协议,怎么做一个上未将与多个下位机通讯

C# 用modbus tcp协议,怎么做一个上未将与多个下位机通讯,是要建立局域网吗,要怎么建立,连接?求大虾帮帮忙! C#上位机的。。

Qt多线程TCP编程会挂掉

先贴上代码 ``` void FortuneWriteThread::run() { QTcpSocket tcpSocket; if (!tcpSocket.setSocketDescriptor(socketDescriptor)) { LogManagerInst << LogManager::LogDegreeType_Error << "Socket " << QString::number(socketDescriptor) << " : " << tcpSocket.errorString(); emit error(tcpSocket.error()); return; } tcpSocket.moveToThread(this); while( !m_quit && tcpSocket.state() == QAbstractSocket::ConnectedState ) { m_mutex.lock(); if(m_replyList.count() == 0) m_replyEmptyCond.wait(&m_mutex); m_mutex.unlock(); // QByteArray head; // QByteArray block; // data to write while(m_replyList.count()) { QByteArray block = m_replyList.takeFirst(); if(block.length() && (block.length() <= 9999)) { QByteArray head = "0000"; head.append(QString::number(block.length())); head = head.right(4); block.prepend(head); tcpSocket.write(block); tcpSocket.flush(); } } } } ``` **挂掉点1**、当我把注释掉的 // QByteArray head; // QByteArray block; 放开后,而把下面的head,block申明去掉后,会在 block = m_replyList.takeFirst(); 这里挂掉,debug出的结果是block不可访问 **挂掉点2** 程序有时候会在tcpSocket.write(block);挂掉,debug不出挂掉的原因 我在if(block.length() && (block.length() <= 9999))下面的大括号里加上lock还是会挂。

请问按TCP协议,用soket发送这样的数据,应该按照什么格式?

![图片说明](https://img-ask.csdn.net/upload/201606/15/1465960698_103502.jpg) 如图所示,每行数据都是一个控制电文。比如我想打开设备3,就发送图中所示的 01 05 00 02 FF 00 2D FA,这些都是十六进制数,用scoket发送。这个设备用的是虚拟串口,服务器端是硬件解包,我是做上位机(客户端)的。 以打开设备3为例,我尝试了发送 BYTE buff[]={0x01,0x05,0x00,0x02,0xFF,0x00,0x2D,0xFA}; send(sClient,(LPCSTR)buff,8,0) 但是设备3没有打开,我用一个叫net tools的小工具作为服务器端测试,显示没有接受到任何数据,但是我觉得这样是符合send函数的使用方法的啊,怎么会没反应的。。。 我又尝试了发送 char buff[]="01 05 00 02 FF 00 2D FA ",设备3还是没有打开,用net tools接收数据,显示接收到01 05 00 02 FF 00 2D FA. 我不明白的地方是,send 函数到底应该怎么发送十六进制的字符串呢?我觉得我第二次尝试的办法发送的不是十六进制数啊,它应该会根据ascii码解释为其他形式的十六进制数吧。ps:这个设备还有其他形式的电文 如wx2010+0x0A这样的形式,都是按 它们的ASCII码解的。 我是新手,刚接触这些,我用C++编写代码,但是我对string类了解不是很深刻,请问是应该用string类型发送吗?希望有高手可以帮我解答一下,最好可以给我推荐一些相关的书籍或者资料,非常感谢!!如果能有个例子的话,就更好了。

tcp大文件传输,全部write成功,read接收到部分后阻塞

tcp大文件传输,全部write成功,read接收到部分后阻塞。 小文件传输没问题。 ``` //传输数据结构体 typedef struct ResponeBody{ int packindex;//4 byte char type;//2 byte char status;//2 byte int datalen;//4 byte int datatotal;//4 byte char s_arg[24];//24 byte char data[SIZE_DATA]; }ResponeBody; ``` ``` //发送数据 while((num = read(fd, resp.data, SIZE_DATA)) > 0) { resp.type = getData; resp.status = 1; resp.datalen = num; res = my_write(socket, &resp, SIZE_RESP); if(res < 0){ return -1; } memset(&resp, 0, SIZE_RESP); } close(fd); ``` ``` //读取数据 int ret = -1; while(1){ num = read(socket, &resp, SIZE_RESP); if(num <= 0 || len_recv >= datatotal){ printf("get success\n"); ret = 0; break; } if(0 == resp.status || resp.type != getData){ ret = -1; break; } write(fd, resp.data, resp.datalen); len_recv += num-SIZE_INFO; printf("get ----[%2.2f%%]----\n", len_recv/(double)datatotal * 100); memset(&resp, 0, SIZE_RESP); } ```

远程主机强迫关闭了一个现有的连接,求助~

问题是发生在我的客户端和服务器端之间进行Modbus TCP通讯的时候。代码如下: ``` internal class ModbusTcpIpWrapper : ModbusWrapper, IDisposable { public static ModbusTcpIpWrapper Instance = new ModbusTcpIpWrapper(); private ModbusSocketWrapper socketWrapper = new ModbusSocketWrapper(); public bool Connected = false; #region modbus tcp连接 public override void Connect(string ip) { if (!Connected) { this.socketWrapper.Logger = Logger; this.socketWrapper.Connect(ip); this.Connected = true; } } #endregion #region 读取Modbus寄存器数据 public override byte[] Receive(string ip, byte functionCode, UInt16 startAddress, short registerNum, int bufferSize) { Connect(ip); List<byte> sendData = new List<byte>(255); //申请一个255个字节空间的List //发送Modbus请求ADU编码 sendData.AddRange(ModbusValueHelper.Instance.GetBytes(this.NextDataIndex())); //事务ID标识 sendData.AddRange(new Byte[] { 0, 0 }); //Protocal Identifier(协议标识),Modbus中此值为0 sendData.AddRange(ModbusValueHelper.Instance.GetBytes((short)6)); //后续的Byte数量(针对读请求,后续为6个byte) sendData.Add((byte)0); //Unit Identifier(单元标识符):用于系统间的路由 sendData.Add((byte)functionCode); //读取寄存器中的值 sendData.AddRange(ModbusValueHelper.Instance.GetBytes((Int16)startAddress)); //起始地址 sendData.AddRange(ModbusValueHelper.Instance.GetBytes((short)registerNum)); //需要读取寄存器的数量 this.socketWrapper.Write(sendData.ToArray()); //发送读请求 //防止连续读写引起前台的UI线程堵塞 Application.DoEvents(); //读取Response Header:完后会返回8个byte的Response Header byte[] receiveData = socketWrapper.Read(bufferSize, ip); //缓冲区中的数量不超过256byte,一次读256byte,防止残余数据影响下次读取 short identifier = (short)((((short)receiveData[0]) << 8) + receiveData[1]); //读取返回数据:根据Response Header,读取后续的数据 if (identifier != CurrentDataIndex) //请求的数据标识与返回的标识不一致,则丢掉数据包 { return new Byte[0]; } byte length = receiveData[8]; //最后一个字节,记录寄存器中数据的Byte数 byte[] result = new byte[length]; Array.Copy(receiveData, 9, result, 0, length); //从指定的索引源开始,复制receiveData中的一系列数据到result中(从指定目标的索引开始) return result; } #endregion ``` ``` internal class ModbusSocketWrapper : IDisposable { private static int Port = Int32.Parse(ConfigurationManager.AppSettings["Port"]); //数据传输的端口号Port,Modbus TCP规定为502 private static int Timeout = Int32.Parse(ConfigurationManager.AppSettings["SocketTimeout"]); //设置数据发送超时时间 public IModbusLog Logger { get; set; } public Socket Socket = null; #region 建立Socket连接 /// <summary> /// 创建一个基于TCP上的Socket /// 实现Socket端口复用 /// 将服务器主机的IP地址与端口号组合 /// 建立与远程主机的连接 /// </summary> public void Connect(string ip) { this.Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); this.Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, Timeout); IPEndPoint ipConnect = new IPEndPoint(IPAddress.Parse(ip), Port); this.Socket.Connect(ipConnect); } #endregion #region 读取数据 public byte[] Read(int length, string ipGet) { byte[] data = new byte[length]; //while (true) //{ try { Socket.Receive(data); Log("Receive:", data); return data; } catch (Exception ex) { string ep = ex.ToString(); Socket.Close(); Connect(ipGet); //MessageBox.Show(ep); return null; } //} } #endregion #region 写入数据 public void Write(byte[] data) { try { Log("Send:", data); Socket.Send(data); } catch (Exception ex) { string ep = ex.ToString(); //MessageBox.Show(ep); } } #endregion #region 记录数据 public void Log(string type, byte[] data) { if (Logger != null) { //创建一个新的可变字符字符串对象 StringBuilder logText = new StringBuilder(type); //将数据中的每一个byte量 foreach (byte item in data) { //将括号内的item转化成字符串表示形式添加到当前对象表示的字符串结尾处 logText.Append(item.ToString() + ""); } Logger.Write(logText.ToString()); } } #endregion #region IDisponsable 成员 public void Dispose() { if (Socket != null) { Socket.Close(); } } #endregion } ``` 当我运行时,就会出现下面的问题 ![图片说明](https://img-ask.csdn.net/upload/201604/20/1461119020_829290.png) ![图片说明](https://img-ask.csdn.net/upload/201604/20/1461119030_311075.png) 我将我发送的请求和Modbuspull这个工具发送的请求进行了对比,是一样的,但是我的请求会被拒绝,而Modbuspull这个工具发送的请求能正常收到请求后服务器返回的数据,请问这个原因是什么?

java对接modbus报错timeout

本人在网上找了很多类似的例子,但是发送都报错。求问哪位大神遇到过这样的问题,或有更好的例子。跪求啊 **使用的包** ``` <dependency> <groupId>com.infiniteautomation</groupId> <artifactId>modbus4j</artifactId> <version>3.0.3</version> </dependency> ``` **代码** ``` package com.shop.utils.modbus; import com.serotonin.modbus4j.ModbusFactory; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.exception.ModbusInitException; import com.serotonin.modbus4j.exception.ModbusTransportException; import com.serotonin.modbus4j.ip.IpParameters; import com.serotonin.modbus4j.msg.*; import com.serotonin.modbus4j.sero.util.queue.ByteQueue; public class ReadAWriteUtils { /** * 批量写数据到保持寄存器 * @param ip 从站IP * @param port modbus端口 * @param slaveId 从站ID * @param start 起始地址偏移量 * @param values 待写数据 */ public static void modbusWTCP(String ip, int port, int slaveId, int start, short[] values) { ModbusFactory modbusFactory = new ModbusFactory(); // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502 IpParameters params = new IpParameters(); params.setHost(ip); // 设置端口,默认502 if (502 != port) { params.setPort(port); } ModbusMaster tcpMaster = null; // 参数1:IP和端口信息 参数2:保持连接激活 tcpMaster = modbusFactory.createTcpMaster(params, true); try { tcpMaster.init(); System.out.println("=======初始化成功========"); } catch (ModbusInitException e) { System.out.println("初始化异常"); } try { WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values); WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request); if (response.isException()){ System.out.println("Exception response: message=" + response.getExceptionMessage()); }else{ System.out.println("Success"); } } catch (ModbusTransportException e) { e.printStackTrace(); } } /** * 读保持寄存器上的内容 * @param ip 从站IP * @param port modbus端口 * @param start 起始地址偏移量 * @param readLenth 待读寄存器个数 * @return */ public static ByteQueue modbusTCP(String ip, int port, int start,int readLenth) { ModbusFactory modbusFactory = new ModbusFactory(); // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502 IpParameters params = new IpParameters(); params.setHost(ip); //设置端口,默认502 if(502!=port){ params.setPort(port); } ModbusMaster tcpMaster = null; tcpMaster = modbusFactory.createTcpMaster(params, true); try { tcpMaster.init(); System.out.println("========初始化成功======="); } catch (ModbusInitException e) { e.printStackTrace(); return null; } ModbusRequest modbusRequest=null; try { //功能码03 读取保持寄存器的值 modbusRequest = new ReadInputRegistersRequest(1, start, readLenth); } catch (ModbusTransportException e) { e.printStackTrace(); } ModbusResponse modbusResponse=null; try { modbusResponse = tcpMaster.send(modbusRequest); } catch (ModbusTransportException e) { e.printStackTrace(); } ByteQueue byteQueue= new ByteQueue(1024); modbusResponse.write(byteQueue); System.out.println("功能码:"+modbusRequest.getFunctionCode()); System.out.println("从站地址:"+modbusRequest.getSlaveId()); System.out.println("收到的响应信息大小:"+byteQueue.size()); System.out.println("收到的响应信息值:"+byteQueue); return byteQueue; } public static void main(String[] args){ modbusTCP("192.168.11.51",502,0x00,2); } } ``` **报错信息:** ``` ========初始化成功======= 17:58:06.566 [main] DEBUG com.serotonin.modbus4j.ip.tcp.TcpMaster - Encap Request: 00 00 00 00 00 06 01 04 00 00 00 02 17:58:06.571 [main] DEBUG com.serotonin.modbus4j.ip.tcp.TcpMaster - Sending on port: 502 17:58:08.097 [main] DEBUG com.serotonin.modbus4j.ip.tcp.TcpMaster - Exception: request=XaMessage [transactionId=0, message=ReadInputRegistersRequest [slaveId=1, getFunctionCode()=4, toString()=ReadNumericRequest [startOffset=0, numberOfRegisters=2]]] request=XaMessage [transactionId=0, message=ReadInputRegistersRequest [slaveId=1, getFunctionCode()=4, toString()=ReadNumericRequest [startOffset=0, numberOfRegisters=2]]] 17:58:08.097 [main] DEBUG com.serotonin.modbus4j.ip.tcp.TcpMaster - KeepAlive - reconnect! 17:58:08.097 [main] DEBUG com.serotonin.modbus4j.ip.tcp.TcpMaster - Modbus4J: Keep-alive connection may have been reset. Attempting to re-open. com.serotonin.modbus4j.exception.ModbusTransportException: com.serotonin.modbus4j.sero.messaging.TimeoutException: request=XaMessage [transactionId=0, message=ReadInputRegistersRequest [slaveId=1, getFunctionCode()=4, toString()=ReadNumericRequest [startOffset=0, numberOfRegisters=2]]] at com.serotonin.modbus4j.ip.tcp.TcpMaster.sendImpl(TcpMaster.java:168) at com.serotonin.modbus4j.ModbusMaster.send(ModbusMaster.java:105) at com.shop.utils.modbus.ReadAWriteUtils.modbusTCP(ReadAWriteUtils.java:88) at com.shop.utils.modbus.ReadAWriteUtils.main(ReadAWriteUtils.java:103) Caused by: com.serotonin.modbus4j.sero.messaging.TimeoutException: request=XaMessage [transactionId=0, message=ReadInputRegistersRequest [slaveId=1, getFunctionCode()=4, toString()=ReadNumericRequest [startOffset=0, numberOfRegisters=2]]] at com.serotonin.modbus4j.sero.messaging.MessageControl.send(MessageControl.java:140) at com.serotonin.modbus4j.sero.messaging.MessageControl.send(MessageControl.java:105) at com.serotonin.modbus4j.ip.tcp.TcpMaster.sendImpl(TcpMaster.java:154) ... 3 more Exception in thread "main" java.lang.NullPointerException 17:58:09.600 [main] DEBUG com.serotonin.modbus4j.ip.tcp.TcpMaster - Exception: request=XaMessage [transactionId=0, message=ReadInputRegistersRequest [slaveId=1, getFunctionCode()=4, toString()=ReadNumericRequest [startOffset=0, numberOfRegisters=2]]] request=XaMessage [transactionId=0, message=ReadInputRegistersRequest [slaveId=1, getFunctionCode()=4, toString()=ReadNumericRequest [startOffset=0, numberOfRegisters=2]]] at com.shop.utils.modbus.ReadAWriteUtils.modbusTCP(ReadAWriteUtils.java:93) at com.shop.utils.modbus.ReadAWriteUtils.main(ReadAWriteUtils.java:103) Disconnected from the target VM, address: '127.0.0.1:49432', transport: 'socket' Process finished with exit code 1 ```

socket连接运行一段时间后无法正常通信.

小弟目前在负责一个socket相关的小项目,具体流程很简单,服务端向客户端发送数据,客户端接收到数据后进入睡眠,然后由第三方工具唤醒客户端,唤醒后服务端继续想客户端发送数据,客户端继续进入睡眠,如此一直循环. 目前小弟碰到的问题是:当循环运行到一定圈数后(有时几百圈,有时一千多圈),服务端send()方法运行过后,客户端却接收不到数据,一直阻塞在receive()方法这. 此时我用netstat -nao查看tcp连接,状态是established 还有就是服务端代码是有python写的,客户端代码是c#,我在客户端设置了socket.ReceiveTimeout(120000),当receive两分钟未收到数据,就会报异常,在catch语句里面关闭连接并重新连接;方法如下 ``` socket.shutdown(SocketShutdown.Both); socket.close(); socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint endPoint = new IPEndPoint(ip,8002); socket.Connect(endPoint); ``` 但是重新连接后依然无法接收数据,只能一直等待两分钟报错后重连,然后继续报错.但是如果我在运行正常的情况下断开WiFi然后重连,程序是可以继续运行的.. 这个问题已经困扰小弟一两个月了,希望有大佬能够帮小弟分析一下原因,万分感谢!!! 宁外,今天小弟发现服务端python代码在创建socket的时候用的是 ``` s = socket.socket() ``` 而不是 ``` s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 即未指定ipv4协议和流,不知道是不是因为这个的原因(还未验证)

用电信3g网络时tcp服务器端可以接收客户端数据,客户端却接收不到服务器端数据..?

用电信3g网络时tcp服务器端可以接收客户端数据,客户端却接收不到服务器端数据,但是局域网内可以正常双向通信,为什么?服务端用的有线公网IP,客户端用的电信cdma2000制式的3G网络,求大神解答,谢谢啦

Vs C#以一种访问权限不允许的方式做了一个访问套接字的尝试

![图片说明](https://img-ask.csdn.net/upload/201703/10/1489129995_758074.png) 在进行实例化Socket时出现以一种访问权限不允许的方式做了一个访问套接字的尝试,请问这个问题要怎么结果,求大神。。。使用的VS版本是2015

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪

CopyOnWriteArrayList.java和ArrayList.java,这2个类的构造函数,注释中有一句话 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public ArrayList(Collection&lt;? ...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

记录下入职中软一个月(外包华为)

我在年前从上一家公司离职,没想到过年期间疫情爆发,我也被困在家里,在家呆着的日子让人很焦躁,于是我疯狂的投简历,看面试题,希望可以进大公司去看看。 我也有幸面试了我觉得还挺大的公司的(虽然不是bat之类的大厂,但是作为一名二本计算机专业刚毕业的大学生bat那些大厂我连投简历的勇气都没有),最后选择了中软,我知道这是一家外包公司,待遇各方面甚至不如我的上一家公司,但是对我而言这可是外包华为,能...

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

培训班出来的人后来都怎么样了?(二)

接着上回说,培训班学习生涯结束了。后面每天就是无休止的背面试题,不是没有头脑的背,培训公司还是有方法的,现在回想当时背的面试题好像都用上了,也被问到了。回头找找面试题,当时都是打印下来天天看,天天背。 不理解呢也要背,面试造飞机,上班拧螺丝。班里的同学开始四处投简历面试了,很快就有面试成功的,刚开始一个,然后越来越多。不知道是什么原因,尝到胜利果实的童鞋,不满足于自己通过的公司,嫌薪水要少了,选择...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

6年开发经验女程序员,面试京东Java岗要求薪资28K

写在开头: 上周面试了一位女程序员,上午10::30来我们部门面试,2B哥接待了她.来看看她的简历: 个人简历 个人技能: ● 熟悉spring mvc 、spring、mybatis 等框架 ● 熟悉 redis 、rocketmq、dubbo、zookeeper、netty 、nginx、tomcat、mysql。 ● 阅读过juc 中的线程池、锁的源...

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

SpringBoot系列之Redis缓存使用详细教程

Spring的缓存抽象 Spring从3.1开始定义了一系列抽象接口来统一不同的缓存技术;并支持使用Java Caching(JSR-107)注解简化我们进行缓存开发。Spring Cache 只负责维护抽象层,具体的实现由你的技术选型来决定。将缓存处理和缓存技术解除耦合。 JSR107 Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider, Cach...

推荐9个能让你看一天的网站

分享的这9个保证另你意外的网站,每个都非常实用!非常干货!毫不客气的说,这些网站最少值10万块钱。 利用好这些网站,会让你各方面的技能都得到成长,不说让你走上人生巅峰,但对比现在的你,在眼界、学识、技能方面都有质的飞跃。 一、AIRPANO 传送门:https://www.airpano.com/360photo_list.php 这是一个可以躺在家里,就能环游世界的神奇网站。 世界那么大,绝大多...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

月薪22K程序员,打卡迟到10次,收到工资短信一脸懵逼

每家公司为了保证公司员工每天的工作时间,一般都会采用上下班打卡的工作制度,这其实是一个很常见的是,本身也没有什么问题的。正所谓无规矩不成方圆,公司肯定是有公司的规矩,虽然每个员工都很不喜欢这些规矩来束缚我们,但是公司也只是为了能更好的管理员工。但是一家公司如果一成不变的使用打卡制度,而不会去变通管理,也真不一定是好事。 打卡制度特别对于销售部门来说,不但会让公司发展不起来,还很容易丢失员工。但如...

97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作

这是世界编程大赛第一名作品(97年Mekka ’97 4K Intro比赛)汇编语言所写。 整个文件只有4095个字节, 大小仅仅为16KB! 不仅实现了3D动画的效果!还有一段震撼人心的背景音乐!!! 内容无法以言语形容,实在太强大! 下面是代码,具体操作看最后! @echo off more +1 %~s0|debug e100 33 f6 bf 0 20 b5 10 f3 a5...

程序员是做全栈工程师好?还是专注一个领域好?

昨天,有位大一的同学私信我,说他要做全栈工程师。 我一听,这不害了孩子么,必须制止啊。 谁知,讲到最后,更确定了他做全栈程序员的梦想。 但凡做全栈工程师的,要么很惨,要么很牛! 但凡很牛的,绝不是一开始就是做全栈的! 全栈工程师听起来好听,但绝没有你想象的那么简单。 今天听我来给你唠,记得帮我点赞哦。 一、全栈工程师的职责 如果你学习编程的目的只是玩玩,那随意,想怎么学怎么学。...

不要再到处使用 === 了

我们知道现在的开发人员都使用 === 来代替 ==,为什么呢?我在网上看到的大多数教程都认为,要预测 JavaScript 强制转换是如何工作这太复杂了,因此建议总是使用===。这些都...

什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站?00后的世界我不懂!

A站 AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站。A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量互动弹幕,是中国弹幕文化的发源地;拥有大量超粘性的用户群体,产生输出了金坷垃、鬼畜全明星、我的滑板鞋、小苹果等大量网络流行文化,也是中国二次元文化的发源地。 B站 全称“哔哩哔哩(bilibili...

十个摸鱼,哦,不对,是炫酷(可以玩一整天)的网站!!!

文章目录前言正文**1、Kaspersky Cyberthreat real-time map****2、Finding Home****3、Silk – Interactive Generative Art****4、Liquid Particles 3D****5、WINDOWS93****6、Staggering Beauty****7、Ostagram图片生成器网址****8、全历史网址*...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

​能让德国人放弃现金支付​,也没谁了

在新冠疫情中,德国人越来越多地选择在超市,加油站或其他商店付款时使用非接触式付款方式。德国信贷协会Deutschen Kreditwirtschaft (DK) 的一位发言人告诉德国新...

大厂的 404 页面都长啥样?最后一个笑了...

每天浏览各大网站,难免会碰到404页面啊。你注意过404页面么?猿妹搜罗来了下面这些知名网站的404页面,以供大家欣赏,看看哪个网站更有创意: 正在上传…重新上传取消 腾讯 正在上传…重新上传取消 网易 淘宝 百度 新浪微博 正在上传…重新上传取消 新浪 京东 优酷 腾讯视频 搜...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

原来实现钉钉自动签到如此简单,每天准时上下班不是梦

本文主要介绍了如何利用现成软件快速实现钉钉自动签到功能,核心思路非常简单,甚至无任何编程基础的小白也能轻松实现定时自动打卡功能.

前端还能这么玩?(女朋友生日,用前端写了一个好玩的送给了她,高兴坏了)

前端还能这么玩?(女朋友生日,用前端写了一个好玩的送给了她,高兴坏了)

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

讲真,这两款idea插件,能治愈你英语不好的病

时不时就有小伙伴问我,“二哥,能推荐一款 IDE 吗?”你看这话问的,现在搞 Java 的不都在用 Intellij IDEA 吗,还用得着推荐(我已经和 Eclipse 分手了)。然后小伙伴又说,“二哥,IDEA 支持中文吗?我英语不太好。”你看这话问的,搞编程的,英语不好是硬伤啊! 不过,随着 IDEA 最新版(版本号是 2020.1)的发布,英语不好的病可以彻底治愈了。为什么这么说呢?因为 ...

面试官给我挖坑:a[i][j] 和 a[j][i] 有什么区别?

点击上方“朱小厮的博客”,选择“设为星标”后台回复&#34;1024&#34;领取公众号专属资料本文以一个简单的程序开头——数组赋值:int LEN = 10000; int[][] ...

在拼多多上班,是一种什么样的体验?我心态崩了呀!

之前有很多读者咨询我:武哥,在拼多多上班是一种什么样的体验?由于一直很忙,没抽出时间来和大家分享。上周末特地花点时间来写了一篇文章,跟大家分享一下拼多多的日常。 1. 倒时差的作息 可能很多小伙伴都听说了,拼多多加班很严重。这怎么说呢?作息上确实和其他公司有点区别,大家知道 996,那么自然也就能理解拼多多的“11 11 6”了。 所以当很多小伙伴早上出门时,他们是这样的: 我们是这样的: 当...

又一起程序员被抓事件

就在昨天互联网又发生一起让人心酸的程序员犯罪事件,著名的百度不限速下载软件 Pandownload PC 版作者被警方抓获。案件大致是这样的:软件的作者不仅非法盗取用户数据,还在QQ群进...

被阿里舍弃,2020年了,还有人在迷恋Oracle数据库?

数据库领域,有曾经被誉为地球最强的——Oracle数据库。 注意,这里说的是Oracle数据库,并非Oracle公司。在Oracle数据库最为顶峰的时候,世界500强、互联网公司、业界的DBA码农们,都将Oracle数据库其视为圣神不可侵犯的领袖。毫不夸张的说,那时的Oracle数据库,天上天下,唯我独尊。 那时虽然有IBM DB2、Microsoft SQL Server、Syba...

14个提高代码质量的好问题

阅读本文大概需要 2.6 分钟。并不是代码写的越多,代码的质量就越高。思考才是。解决一个问题,打开电脑就手撕代码,最终的结果往往是各种代码问题,经过一系列迭代后,代码积重难返,最终的结果...

Mysql性能优化:为什么count(*)这么慢?

导读在开发中一定会用到统计一张表的行数,比如一个交易系统,老板会让你每天生成一个报表,这些统计信息少不了sql中的count函数。但是随着记录越来越多,查询的速度会越来越慢,为什么会这样...

应聘3万的职位,有必要这么刁难我么。。。沙雕。。。

又一次被面试官带到坑里面了。面试官:springmvc用过么?我:用过啊,经常用呢面试官:springmvc中为什么需要用父子容器?我:嗯。。。没听明白你说的什么。面试官:就是contr...

太狠了,疫情期间面试,一个问题砍了我5000!

疫情期间找工作确实有点难度,想拿到满意的薪资,确实要点实力啊!面试官:Spring中的@Value用过么,介绍一下我:@Value可以标注在字段上面,可以将外部配置文件中的数据,比如可以...

相关热词 c# 按行txt c#怎么扫条形码 c#打包html c# 实现刷新数据 c# 两个自定义控件重叠 c#浮点类型计算 c#.net 中文乱码 c# 时间排序 c# 必备书籍 c#异步网络通信
立即提问