怎么通过保存好的socket向客户端发消息

服务器是多线程的,假设有三个客户端连接过来,我已经用map保存了ip为键,socket为值,客户端是不断开socket连接的,现在我要向其中一个客户端主动发消息,我怎么凭借这个socket找到与客户端的连接并发送消息过去

1个回答

根据你存放的ip找到map中的socket,然后用这个socket进行写入就可以了。

w172087242
little_how 回复晚灯下的烟火: 我正在写一个关于socket连接管理的博客,就因为你的问题,稍候你可以看看
3 年多之前 回复
liuyuan19931217
晚灯下的烟火 回复little_how: Socket socket = listUtil.map.get(0); OutputStream outputStream = socket.getOutputStream(); byte[] bytes = new byte[1024]; bytes[0] = 55; bytes[1] = 11; bytes[2] = 22; outputStream.write(bytes);
3 年多之前 回复
liuyuan19931217
晚灯下的烟火 好的,我试试。先给你采纳
3 年多之前 回复
w172087242
little_how 用找到的socket进行output,就代表消息发送去客户端,现在长连接模式很多,消息响应快。 如果有帮助,希望结帖
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# 的服务器向之前登陆的时候保存的客户端Socket发送数据的时候报错了
报错:The operation is not allowed on non-connected sockets. 问题是这样的,制作添加好友模块时,遇到了一个问题,就是在登录的时候,服务端会通过ID绑定那个Socket: ``` //目前在线的客户端字典,与ID绑定 Dictionary<int, Socket> DicOnlineClients; ``` 绑定: ``` //向目前在线的客户端列表添加这个客户端 DicOnlineClients.Add(playerID, packet._peer); ``` 然后发送好友请求的时候会通过这个ID发到与这个ID绑定的Socket上,前提是这个客户端没有离线 ``` //获取此ID的Socket Socket socket; if (DicOnlineClients.TryGetValue(FriendID,out socket)) { _server.Send(SendStream, socket); } ``` 但是问题出在,在Send的时候,报错了 The operation is not allowed on non-connected sockets. 可是我客户端的socket明明是在线的啊 请大神帮忙解答下。或者有没有其他的方法,用于向指定的客户端发送数据的,我这里用的是通过玩家ID辨识
C#服务端请求客户端数据
我想在客户端安装一个服务后,能够向客户端请求数据,返回数据给服务器,这样用什么协议要好,socket行吗?服务端怎么发起这个请求,麻烦各位大神帮帮忙? 我不清楚的地方,如果用socket,保存客户端连接后,我要请求客户端数据,只能是客户端请求服务端,而我换成服务端请求客户端好像只能是客户端请求后服务端回复。 如果是UDP的话好定义请求和回复问题吗?
socket简易群聊 服务器端的编写
怎么让服务器端 ,在有一个客户端上显示发送socket 服务器端建立一个静态变量保存socket 然后遍历socket集合输出数据
c++,socket编程实现简易聊天系统,客户端一直连不上服务端,connect返回错误10014
客户端 ``` //建立线程 DWORD WINAPI ConnectThreadFunc(LPVOID pParam) { //初始化 WSAData wsData; if (!AfxSocketInit(&wsData)) { AfxMessageBox(_T("Socket 库初始化出错!")); return false; } CMFCApplication1View *pChatClient = (CMFCApplication1View*)pParam; ASSERT(pChatClient != NULL); //新建一个socket pChatClient->ConnectSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET==pChatClient->ConnectSock ) { AfxMessageBox(_T("创建socket失败!")); return FALSE; } AfxMessageBox(_T("成功创建socket")); //获取端口 CString ServeIp; pChatClient->GetDlgItemText(IDC_SERVEID_INPUT, ServeIp); //取服务端的IP地址 int SPort = pChatClient->GetDlgItemInt(IDC_SERVEPORT_INPUT); //获取端口 if (SPort <= 0 || SPort > 65535) { AfxMessageBox(_T("请输入合法的端口:1-65535")); goto _End; } AfxMessageBox(_T("端口合法")); //将IP转换 char AddrIp[16] = { 0 }; //窄字节 USES_CONVERSION; strcpy_s(AddrIp, 16, T2A(ServeIp)); // T2A:宏,进行字符串的转换 //将服务器的信息放入通用套接字中 sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(SPort); server.sin_addr.s_addr = inet_addr("192.168.73.1"); //客户端连接服务端 //将server传给connect if ( SOCKET_ERROR == connect(pChatClient->ConnectSock, (struct sockaddr*)&server, sizeof(struct sockaddrr*)) ) { /* char ErrorInfo[256] = { 0 }; //创建数组存储错误信息 sprintf_s(ErrorInfo, "Creat Faile : %d", GetLastError()); //把错误信息写入数组 AfxMessageBox((CString)ErrorInfo); */ AfxMessageBox(_T("连接失败!")); goto _End; } pChatClient->MsgShow(_T("服务器连接成功!")); while (TRUE) { if (SOCKERT_Select(pChatClient->ConnectSock,100,TRUE)) { char szBuf[MAX_BUF_SIZE] = { '0' }; //缓冲区 int iRet = recv(pChatClient->ConnectSock, szBuf, MAX_BUF_SIZE, 0); //recv()用来接收远程主机通过套接字sockfd发送来的数据, //并把这些数据保存到数组buf中 if (iRet > 0) { pChatClient->MsgShow((CString)szBuf); } else { pChatClient->MsgShow(_T("连接异常,请重新连接!")); break; } } Sleep(100); } _End: closesocket(pChatClient->ConnectSock); return TRUE; } ``` 服务端 ``` SOCKET ComSock; //用于发送消息 //查看客户端是否发来消息,并快速返回 BOOL SOCKERT_Select(SOCKET Socket, int TimeOut, BOOL bRead) { fd_set fdset; //通知执行了select()的进程哪一socket或文件发生了可读或可写事件 //long类型的数组,每一个数组元素都能与一打开的文件句柄建立联系 timeval tv; //判断是否超时,用于select()函数 FD_ZERO(&fdset); //清空集合中所有的元素 FD_SET(Socket, &fdset); //设置hSocket,使集合包含hSocket,即建立联系 TimeOut = TimeOut > 1000 ? 1000 : TimeOut; tv.tv_sec = 0; //秒数 tv.tv_usec = TimeOut; //微秒数 int iRet = 0; if (bRead) { //select()测试指定的fd可读?可写?有异常条件待处理? //即对socket操作 iRet = select(0, &fdset, NULL, NULL, &tv); } //读 else { iRet = select(0, NULL, &fdset, NULL, &tv); } //写 if (iRet <= 0) { //返回错误时 return FALSE; } else if (FD_ISSET(Socket, &fdset)) {//返回处于就绪状态并且已经包含在fd_set结构中的描述字总数 return TRUE; } return FALSE; //返回零时(超时返回零) } //通过线程来开启服务器,因为accept是阻塞的 //线程函数 DWORD WINAPI LisenThreadFunc(LPVOID pParam) { //LPVOID :32位的无类型的指针,在使用的时候再强制转换成需要的类型 CMFCApplication1View *pChatClient = (CMFCApplication1View*)pParam; //强制转换 ASSERT(pChatClient != NULL); //保证指针不为空 //断言函数,表达式为假则退出程序,为真继续执行 //用socket函数创建一个socket,用于监听 //成功则返回一个socket pChatClient->ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (pChatClient->ListenSock == INVALID_SOCKET) { AfxMessageBox(_T("创建socket失败!")); return 0; } //绑定,将 ListenSock 绑定在本地的一个ip和端口上 //1、动态获取用户输入的端口 int Port = pChatClient->GetDlgItemInt(IDC_LISTENPORT_INPUT); if (Port <= 0 || Port > 65535) { AfxMessageBox(_T("请输入合适的端口:1-65535")); goto _End; } //2、建立通用套接字 sockaddr_in service; //一种通用的套接字地址。用来建立所需信息,最后使用类型转换 //一般用于bind、connect、recvfrom、sendto等函数的参数 service.sin_family = AF_INET; //协议族 service.sin_addr.s_addr = inet_addr("127.0.0.1"); //获取本机所有可能得到的ip地址 service.sin_port = htons(Port); //传递端口 //htons:将主机字节顺序转换为网络字节顺序 //3、利用bind进行绑定 if (bind(pChatClient->ListenSock, (sockaddr*)&service, sizeof(sockaddr_in)) == SOCKET_ERROR) { AfxMessageBox(_T("绑定失败!")); goto _End; } AfxMessageBox(_T("绑定成功!")); //监听 if (listen(pChatClient->ListenSock, 4) == SOCKET_ERROR) { AfxMessageBox(_T("监听失败!")); goto _End; } //服务器已搭建完毕,开始进行消息监测 while (TRUE) { if (SOCKERT_Select(pChatClient->ListenSock, 1000, TRUE)) {//若有消息 sockaddr_in ClientSocket; int len = sizeof(sockaddr_in); //返回客户端(即对方)的IP地址和端口 SOCKET ComSock = accept(pChatClient->ListenSock, (struct sockaddr*)&ClientSocket, &len); if (ComSock == INVALID_SOCKET) { //若没有收到信息 continue; } //当要进行信息交互时,再建一个新线程来进行信息交互 // CMFCApplication1View *ClientCopy; HANDLE iTtem; iTtem = CreateThread(NULL, 0, ClientThreadProc, pChatClient, CREATE_SUSPENDED, NULL); pChatClient->comThread = iTtem; ResumeThread(iTtem); //恢复线程的执行 } Sleep(100); } _End: closesocket(pChatClient->ListenSock); //强制关闭socket return TRUE; } ``` 由于最近刚学socket,实在不知道怎么改了,请各位大神帮我康康,谢谢大家!(呜呜呜我是新手么的c币)
socket和多线程的混合使用
怎么写一个利用多线程和socket实现客户端连续向服务端上传多张图片啊并且保存?
一个悲催的菜鸟,关于安卓socket传输手机蓝牙地址的问题。。。
最近做一个项目,是关于用安卓编程获取手机的蓝牙地址,并且把获取的蓝牙地址通过socket传输到服务器端,真的很急,希望大神能够帮忙解决,一个悲催的工科妹子在此谢过了。。。 client: package Socketprocess; import java.net.*; import java.io.*; public class Client{ public void getadd() { } public static void main(String[] args) throws Exception{ Socket s = new Socket("10.129.165.146",8899); DataOutputStream dos = new DataOutputStream(s.getOutputStream()); //获取Socket对象的输出流,并且在外边包一层DataOutputStream管道,方便输出数据 Thread.sleep((int)(Math.random()*3000)); //让客户端不定时向服务器发送消息 dos.writeUTF("客户端"); //DataOutputStream对象的writeUTF()方法可以输出数据,并且支持中文 dos.flush(); //确保所有数据都已经输出 dos.close(); //关闭输出流 s.close(); //关闭Socket连接 } } clientachieve: package Socketprocess; import java.io.DataInputStream; import java.net.Socket; public class Clientacheive implements Runnable{ int clientIndex = 0; //保存客户端id Socket s = null; //保存客户端Socket对象 Clientacheive(int i,Socket s){ clientIndex = i; this.s = s; } public void run(){ //打印出客户端数据 try{ DataInputStream dis = new DataInputStream(s.getInputStream()); System.out.println("第" + clientIndex + "个客户端发出消息:" + dis.readUTF()); dis.close(); s.close(); } catch(Exception e) {} } } server: package Socketprocess; import java.net.*; //import java.io.*; public class TCPServer{ public static void main(String[] args) throws Exception{ ServerSocket ss = new ServerSocket(9988); //创建一个Socket服务器,监听5566端口 int i=0; //利用死循环不停的监听端口 while(true){ Socket s = ss.accept();//利用Socket服务器的accept()方法获取客户端Socket对象。 i++; System.out.println("第" + i +"个客户端成功连接!"); Clientacheive c = new Clientacheive(i,s); //创建客户端处理线程对象 Thread t =new Thread(c); //创建客户端处理线程 t.start(); //启动线程 } } } client部分是打算放到安卓手机上运行的。。。如果能够有解答,真心感激不尽了!
JAVA的Socket为什么会自动关闭。跪了,求解
问题描述: 这里有一个服务器和一个带图形界面客户端。当的用户账号密码正确时,客户端会向服务器提出连接请求,也就是new Sicket(..., ...); 可是为什么客户端这个Socket会在成功连接7秒左右自动关闭。 我判断客户端的Socket已经关闭的原因有两个。 1.客户端的socket不停调用s.sendUrgentData方法,但在运行7秒左右时会抛出异常。 2 服务器一直在等待客户端的消息,但是在运行7秒左右服务器却抛出connection reset异常,在抛异常之前客户端可以正常发送数据,异常之后不能再发送了,在百度上知道这是因为发送方(也就是客户端)的socket已经关闭,而接收方还在等待接受而抛出的异常。 相关代码: // 客户端代码 public class LoginFrame extends JFrame { private Socket s ; if (log()) { // log是连接数据库的函数,会返回boolean表示用户名密码对不对 s = Client.requst(nameTF.getText()); // 为s赋值,将返回的Socket保存在s中, 类的静态方法requst } else { System.out.println("登陆失败"); } } // 主函数 public static void main(String[] args) throws InterruptedException { LoginFrame f = new LoginFrame(); Thread.sleep(2000);// 为了给输入用户名和密码时间 while (true) { try { f.s.sendUrgentData(0xFF); System.out.println("发送成功"); } catch (IOException e) { System.out.println("因发送心跳包出现异常" + e.getMessage()); break } } } // 客户端的连接请求代码 public class Client { public static Socket requst(String name) { Socket s = null; try { // 发出连接请求 s = new Socket("127.0.0.1", 8888); PrintWriter writer = new PrintWriter(s.getOutputStream()); // 告诉服务器是谁刚刚连接 writer.write(name + "\n"); writer.flush(); } catch (UnknownHostException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } return s; } 相关截图 客户端异常 ![图片说明](https://img-ask.csdn.net/upload/201906/16/1560659211_996428.jpg) 服务器异常(提问时,异常变成这个,但之前都是Connection reset) ![图片说明](https://img-ask.csdn.net/upload/201906/16/1560659224_174504.jpg) 请各位朋友帮忙了。 这次是JAVA课程设计,但老师并没有讲Socket,Socket的一些细节我也不清楚。所以拜托了帮我找找Bug。 ---------------------------------------------------------------------- 各位我实在是充不起C币。 要是问题解决了, 你支付宝二维码或者微信发过来, 我给你6块行不行。 拜托了,帮帮我吧。
Socket的输入输出问题
MyServer.java ``` import java.util.List; import java.util.Collections; import java.util.ArrayList; import java.net.ServerSocket; import java.net.Socket; import java.io.IOException; public class MyServer{ //定义保存所有Socket的ArrayList,并将其包装为线程安全的 public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<>()); public static void main(String[] args) throws IOException{ ServerSocket ss = new ServerSocket(30000); while(true){ //此行代码会阻塞,将一直等待别人的连接 Socket s = ss.accept(); socketList.add(s); //每当客户端连接后启动一个ServerThread线程为该客户端服务 new Thread(new ServerThread(s)).start(); } } } ``` ServerThread ``` import java.net.Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; //负责处理每个线程通信的线程类 public class ServerThread implements Runnable{ //定义当前线程所处理的Socket Socket s = null; //该线程所处理的Socket对应的输入流 BufferedReader br = null; public ServerThread(Socket s) throws IOException{ this.s = s; //初始化该Socket对应的输入流 br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run(){ try{ String content = null; //采用循环不断地从Socket中读取客户端发过来的数据 while((content = readFromClient()) != null){ //遍历socketList中的每个Socket //将读到的内容向每个Socket发送一次 for(Socket s : MyServer.socketList){ PrintStream ps = new PrintStream(s.getOutputStream()); System.out.println(content); ps.println(content); } } }catch (IOException e){ e.printStackTrace(); } } //定义读取客户端数据的方法 private String readFromClient(){ try{ Thread.sleep(10000); return br.readLine(); } //如果捕获到异常,则表明该Socket对应的客户端已经关闭 catch(Exception e){ //删除该Socket MyServer.socketList.remove(s); } return null; } } ``` MyClient ``` import java.net.Socket; import java.io.PrintStream; import java.io.BufferedReader; import java.io.InputStreamReader; public class MyClient{ public static void main(String[] args) throws Exception{ Socket s = new Socket("127.0.0.1", 30000); //客户端启动ClientThread线程不断地读取来自服务器的数据 new Thread(new ClientThread(s)).start(); //获取该Socket对应的输出流 PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; //不断地读取键盘输入 BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); while((line = br.readLine()) != null){ //将用户的键盘输入内容写入Socket对应的输出流 ps.println(line); } } } ``` ClientThread ``` import java.net.Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ClientThread implements Runnable{ //该线程负责处理的Socket private Socket s; //该线程所处理的Socket对应的输入流 BufferedReader br = null; public ClientThread(Socket s) throws IOException{ this.s = s; br = new BufferedReader( new InputStreamReader(s.getInputStream())); } public void run(){ try{ String content = null; //不断地读取Socket输入流中的内容,并将这些内容打印输出 while((content = br.readLine()) != null){ System.out.println(content); } }catch (Exception e){ e.printStackTrace(); } } } ``` 照着书敲得,实现一个命令行聊天。 问题是:MyClient中控制台输入阻塞,当我输入数据时,ServerThread可以通过Socket的输入流获取数据,而ClientThread中的Socket的输入流不能(这里的输入流是为了获取ServerThread中输出数据的时候才用上)。
C++ TCP CAsyncSocket一服务端对应多客户端的问题
CNetTcpLsn是CAsyncSocket的一个派生类,服务端接收客户端连接,同时要把数据发给连接的客户端,客户的socket保存在m\_ClientSockList里,当发送函数里调用Num = pSock->Send(\_buf,nLen,0) 失败时,想立即把客户端的socket Close并删掉,但是一close就会崩溃,原因是close内部的KillSocket里断言失败,如何才能实现Send失败时,立马释放代表客户端的socket void CNetTcpLsn::OnAccept(int nErrorCode) { if (nErrorCode == 0) { CNetAcpSock* pSock = new CNetAcpSock(m_pBase) ; if (Accept(*pSock)) { pSock->AsyncSelect(FD_READ|FD_CONNECT|FD_CLOSE|FD_OOB) ; pSock->m_bConnect = TRUE; m_ClientSockList.push_back(pSock); m_bConnect = TRUE ; //连接标志 SOCKADDR clientAddr; int iLength = sizeof(sockaddr); if(pSock->GetPeerName((struct sockaddr * )&clientAddr, &iLength)) { sockaddr_in * pSin = (sockaddr_in *)&clientAddr; m_pBase->m_ConAddr.Format("%s:%d",inet_ntoa(pSin->sin_addr),ntohs(pSin->sin_port)); }else m_pBase->m_ConAddr = "0.0.0.0:0"; } else { delete pSock ; pSock = NULL ; } } CAsyncSocket::OnAccept(nErrorCode); } ``` ``` //发送函数 int CNetTcpLsn::_Send(char *_buf, int nLen) { int Num = 0 ; vector<CNetAcpSock*>::iterator iter; for (iter=m_ClientSockList.begin();iter!=m_ClientSockList.end();++iter) { CNetAcpSock* pSock = (CNetAcpSock*) *iter; if (pSock) { Num = pSock->Send(_buf,nLen,0) ; if (Num == SOCKET_ERROR) { int ret = GetLastError() ; if( ret != 10035) { if (pSock->m_bConnect) { pSock->m_bConnect = FALSE ;//连接中断 } } } else { if (!m_bConnect) { pSock->m_bConnect = TRUE; } } } } return Num ; } ``` ``` void PASCAL CAsyncSocket::KillSocket(SOCKET hSocket, CAsyncSocket* pSocket) { // assert会失败CAsyncSocket::LookupHandle(hSocket, FALSE)返回是NULL ASSERT(CAsyncSocket::LookupHandle(hSocket, FALSE) != NULL); _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState; CAsyncSocket::DetachHandle(hSocket, FALSE); if (pState->m_hSocketWindow != NULL) { ::PostMessage(pState->m_hSocketWindow, WM_SOCKET_DEAD, (WPARAM)hSocket, 0L); CAsyncSocket::AttachHandle(hSocket, pSocket, TRUE); } } ```
大师帮忙实现客户端的一对一会话,谢了。
import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.LineDelimiter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** *服务端 */ public class MinaServer { protected static Logger logger = LoggerFactory.getLogger(MinaServer.class); static int PORT=7082; static IoAcceptor acceptor=null; public static void main(String[] args){ try{ acceptor=new NioSocketAcceptor(); //设置编码过滤器 acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter( new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); //设置缓冲区的大小 acceptor.getSessionConfig().setReadBufferSize(1024); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 90); acceptor.setHandler(new Myhandler()); acceptor.bind(new InetSocketAddress(PORT)); logger.info("服务端启动成功... 端口号为:" + PORT); }catch(Exception e){ logger.error("服务端启动异常....", e); e.printStackTrace(); } } } import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** *服务端处理器: * */ public class Myhandler extends IoHandlerAdapter{ protected static Logger logger = LoggerFactory.getLogger(Myhandler.class); // 发送消息异常时触发 @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { logger.error("服务端发送消息异常"+cause); } // 接收到消息时触发 @Override public void messageReceived(IoSession session, Object message) throws Exception { //获取客户端发过来的key String key = message.toString(); logger.info("message :"+message.toString()); String carPark_id = key.substring(key.indexOf("=") + 1); logger.info("carPark_id :"+carPark_id); //保存客户端的会话session SessionMap sessionMap = SessionMap.newInstance(); sessionMap.addSession(carPark_id, session); sessionMap.getSession(key); // String msg=(String) message; // logger.info("服务端接收到数据"+msg); // if("exit".equals(msg)){ // session.close(true); // } // Date date=new Date(); // SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); // session.write(sdf.format(date)); // //拿到所有的客户端Session // Collection<IoSession> sessions = session.getService().getManagedSessions().values(); // for (IoSession sess : sessions) { // sess.write("所有客户端收到消息"); // } } // 发送消息成功后触发 @Override public void messageSent(IoSession session, Object message) throws Exception { logger.info("服务端发送信息成功!"); } // 会话关闭时触发 @Override public void sessionClosed(IoSession session) throws Exception { logger.debug("客户端与服务端断开连接!"); } // 创建会话时触发 @Override public void sessionCreated(IoSession session) throws Exception { logger.info("sessionCreated"); } // 会话空闲时触发 // 当连接空闲时被触发。使用IoSessionConfig中的setIdleTime(IdleStatus status, int // idleTime)方法可以设置session的空闲时间。如果该Session的空闲时间超过设置的值,该方法被触发,可以通过session.getIdleCount(status)来获取sessionIdle被触发的次数。 @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { logger.info("服务端进入空闲状态..."); } // 打开会话时触发 // 会话创建之后--》会话打开 @Override public void sessionOpened(IoSession session) throws Exception { logger.info("服务端与客户端已连接sessionOpened"); } } import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.LineDelimiter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; /** * 客户端 */ public class MinaClient { private static String host="127.0.0.1"; private static int port=7082; public static void main(String[] args) { // TODO Auto-generated method stub IoSession session=null; // 创建一个非阻塞的客户端程序 IoConnector connector=new NioSocketConnector(); // 设置链接超时时间 connector.setConnectTimeoutMillis(3000*10); //设置过滤器 connector.getFilterChain().addLast("coderc", new ProtocolCodecFilter( new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()))); connector.setHandler(new MyClientHandler()); //连接到服务端 ConnectFuture future=connector.connect(new InetSocketAddress(host,port)); future.awaitUninterruptibly(); //等待我们的连接 session=future.getSession(); session.write("你好!服务大哥"); session.getCloseFuture().awaitUninterruptibly(); //等待关闭链接 connector.dispose(); } } import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MyClientHandler extends IoHandlerAdapter { protected static Logger logger = LoggerFactory.getLogger(MyClientHandler.class); // 发送消息异常时触发 @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { logger.debug("客户端发送消息异常exceptionCaught"); } // 接收到消息时触发 @Override public void messageReceived(IoSession session, Object message) throws Exception { // String msg=(String) message; // logger.info("客户端收到数据:"+msg); logger.info("-----服务端返回的json数据----"); String s = message.toString(); logger.info("客户端收到消息: :" + s); logger.info("消息长度为:" + s.length()); } @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { // TODO 自动生成的方法存根 logger.info("-客户端与服务端连接[空闲] - " + status.toString()); if(session != null){ session.close(true); } } } import java.util.HashMap; import java.util.Map; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @Description: 单例工具类,保存所有mina客户端连接 * @author whl * @date 2014-9-29 上午10:09:15 * */ public class SessionMap { private final static Logger LOGGER=LoggerFactory.getLogger(SessionMap.class); private static SessionMap sessionMap = null; private Map<String, IoSession>map = new HashMap<String, IoSession>(); //构造私有化 单例 private SessionMap(){} /** * @Description: 获取唯一实例 * @author whl * @date 2014-9-29 下午1:29:33 */ public static SessionMap newInstance(){ LOGGER.debug("SessionMap单例获取---"); if(sessionMap == null){ sessionMap = new SessionMap(); } return sessionMap; } /** * @Description: 保存session会话 * @author whl * @date 2014-9-29 下午1:31:05 */ public void addSession(String key, IoSession session){ LOGGER.debug("保存会话到SessionMap单例---key=" + key); this.map.put(key, session); } /** * @Description: 根据key查找缓存的session * @author whl * @date 2014-9-29 下午1:31:55 */ public IoSession getSession(String key){ LOGGER.debug("获取会话从SessionMap单例---key=" + key); return this.map.get(key); } /** * @Description: 发送消息到客户端 * @author whl * @date 2014-9-29 下午1:57:51 */ public void sendMessage(String[] keys, Object message){ for(String key : keys){ IoSession session = getSession(key); LOGGER.debug("反向发送消息到客户端Session---key=" + key + "----------消息=" + message); if(session == null){ return; } session.write(message); } } }
求大神UDP服务端高并发设计架构,在线等
服务端只开了一个固定端口(业务规定),网上查了下,说可以保存客户端IP跟端口,服务端建新的SOCKET,跟新端口跟客户端处理后续数据,写了个简单程序,但是当同时刻连上来的客户端超过200个,就出现丢包情况: 1. 一个线程接收固定端口的数据,把数据分组 2. 把分组数据分配的SOCKET,端口,通知客户端 3. 多线程跟客户端处理数据
Java如何保存GIF动态图片??
更正一下之前问过的问题,因为后来发现跟socket没关系。 各位大神,到底如何才能保存gif动态图片?网上找了很久都没找到解决方案,难不成程序猿萌都没有遇到这个困扰? 需求很简单: 1) 加载一张动态图片到JLabel (此处没问题,可以正常显示动态图片) 2)按保存按钮后把动态图片保存到本地。 +++++++++++++++++++++++++++++++++++++++++++++++++ 我是Java初学者,基于socket做了一个聊天工具,但是在传送GIF格式图片时候遇到问题。 从服务器端发回的图片是静止不动的。 我的做法是把客户端的图片转成byte[],再发送到服务器端,然后再转发回客户端。 求高手!!!
VC socket编程,数据接收问题
用VC socket编程时,用recv函数接收字符串数据,只能接收到前4个字符,多于4个字符的都是“烫”字乱码。这是什么问题?怎么解决? char cs[100]; case FD_READ: { CString num=""; //定义字符串,用于保存待显示字符 ::recv(s1,cs,strlen(cs),0); //接收来自客户端的字符串数据 GetDlgItem(IDC_TEXT)->GetWindowText(num); //获取消息显示框中原有的字符 num+="\r\n"; //添加换行符 num+=(LPTSTR)::inet_ntoa(add1.sin_addr); //将客户端IP换成字符串 num+=":\r\n"; //添加换行符 num+=(LPTSTR)cs; //将接收到的字符串添加到显示字符串 num+=":\r\n"; //添加换行符 GetDlgItem(IDC_TEXT)->SetWindowText(num); //将字符串显示到消息显示框 }
Java Socket发送方与接收方得到的数据不一致
[做电子白板时,服务器端收到的消息和客户端发送的消息不同。 Server类为服务器,运行时首先打开Server。Server中有ClientThread线 程组,其中的每个元素用来保存和每个客户通信的线程。LoginFrame为登录界面,点击登录后,选择教师登录,登录成功后,再继续登录学生端。教师和学生均为客户端,教师端上画的点先传给服务器,再由服务器利用线程组ClientThread传给学生。问题是:教师端发送点的消息后,服务器端的教师对应的ClientThread中接收到的消息和发送的不一致。 服务器端: ![图片说明]([图片]https://img-ask.csdn.net/upload/201805/26/1527306969_312293.jpg) 教师端:![图片说明]([图片]https://img-ask.csdn.net/upload/201805/26/1527306975_843596.jpg) ]源代码,下载积分比较少的那一个([图片]https://download.csdn.net/my "")
限定使用Socket通信,内存4G去传输10G的文本。并且读取过程需要换行,应该如何实现?
题目描述: 限定使用socket通信来完成。需要实现的功能是:客户端读取10G的文本 文件以"换行啦啦啦"作为换行符、将文件中的内容、按行发送给服务端。服务端接收数据后、将文本文件保存在服务端所在电脑的磁盘上。合理使用线程!!
socket被动异常检测问题
tcp通信有如下情形:server启动线程事件循环,client连接成功后,关闭server事件循环,client主动关闭连接。此时,client已经断开连接,但server因为事件循环停掉的原因,其与client的socket状态并未得到更新、状态一切正常。请问该怎么处理? 也就是说,客户端都不在了,但服务端还保存了一个到客户端的连接,且该连接状态还是正常的,按理这不应该啊! 最常见的现象就是,频繁插拔网线,就有可能产生这种客户端都掉线了,而服务端却检测不到的情形。 目前尝试过的方法有两个: 1、setSocketOption(QAbstractSocket::KeepAliveOption,1);实际使用后,没有效果。 2、waitForReadyRead;由源码可以得到仅此可以触发socket的disconnted信号,但调用后对readyRead又有影响,所以无法解决检测异常的问题。 至于心跳机制,需要由自己定义的协议才可以实现,在别人已有的基础上,是无法实现的。
java socket 无故当机
这是一个socket长连接的程序,代码如下。我是在windows命令窗口运行socket服务器的。如果有机器设备通过我规定好的代码请求服务器,我就给设备建立长连接进行通讯。然后如果有另外的客户端通过规定好的代码请求,我就发送指令给指定设备,然后设备返回信息,再返回给客户端,这种是短连接。但是很奇怪的就是,总有应该是网络的爬虫请求我的程序,总收到一些乱七八糟的字符串,但是因为这些字符串和我规定的不一样,所以是拦截在外面的,建立不了长连接。最麻烦的来了,当程序运行久了以后或者一定时间,我客户端请求服务器短连接就超时了,服务器命令窗口没显示信息,但是如果我ctrl+c结束一下,请求的字符串又能打印出来了了,好像整个程序挂起来没反应,以至于程序很不稳定,设备用久了总是要重启服务器程序才能恢复。新手socket,不知道是否有精通的大神,能解答一下。会不会是接收数据那段出现了问题呢,代码如下: class SocketThread implements Runnable { private Socket socket; public SocketThread(Socket socket) { this.socket = socket; } public void run() { InputStreamReader isr = null; BufferedReader br = null; OutputStreamWriter osr = null; BufferedWriter bw = null; try { isr = new InputStreamReader(socket.getInputStream()); br = new BufferedReader(isr); osr = new OutputStreamWriter(socket.getOutputStream()); bw = new BufferedWriter(osr); char[] chars = new char[1024]; int len; String resultMsg = ""; while((len = br.read(chars)) != -1){ if (1024 == len) { resultMsg += chars; } else { for (int i = 0; i < len; i++) { resultMsg += chars[i]; } resultMsg = resultMsg.trim(); System.out.println("data:"+resultMsg); /** * 新设备连接 */ if(resultMsg.indexOf("LSKJ:")!=-1){ // 下面这个方法是保存socket到map中 ConnectNew(resultMsg, socket, bw); } /** * 发送代码 */ if(resultMsg.indexOf("<CODE>")!=-1){ // 普通客户端连接 int tradeCode = Integer.parseInt(SocketUtil.getXMLData(resultMsg, "CODE")); switch (tradeCode) { case 100:// 100代码:往设备电路板发送指令 String command = SocketUtil.getXMLData(resultMsg, "COMMAND"); String deviceIp = SocketUtil.getXMLData(resultMsg, "IP");// IP地址 int devicePort = Integer.parseInt(SocketUtil.getXMLData(resultMsg, "PORT")); // 端口 Socket sourceSocket = socketMap.get(devicePort); clientMap.put(socket.getPort(), socket); Writer targetWriter = new OutputStreamWriter(sourceSocket.getOutputStream()); targetWriter.write(command+":LSYD:"+socket.getPort()); targetWriter.flush(); break; case 101:// 101代码:查询socket的数据 StringBuffer returnMsg = new StringBuffer(); if(!socketMap.isEmpty()){ for (Socket socket:socketMap.values()) { returnMsg.append(socket.getInetAddress().getHostAddress()).append(":").append(socket.getPort()); returnMsg.append("\n"); } }else{ returnMsg.append(" socketMap is null"); } bw.write(returnMsg.toString()); bw.flush(); break; default: break; } } /** * 响应代码 */ if(resultMsg.indexOf("LSYD:")!=-1){ /** * 返回例子: * OUDC1_??:LSYD:10001 OFF */ String[] msg = resultMsg.split(":"); if(msg.length>=2){ String returnCommand = resultMsg.split(":")[2]; if(returnCommand.length()>=4){ // 取出返回端口号 returnCommand = returnCommand.substring(0, 5); String regEx="[^0-9]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(returnCommand); // 端口号 int clientPort = Integer.parseInt(m.replaceAll("").trim()); //System.out.println("端口号是:"+clientPort); // 返回结果 String result = resultMsg.substring(resultMsg.lastIndexOf(" ")+1,resultMsg.length()); //取出socket返回 Socket clientSocket = clientMap.get(clientPort); if(clientSocket!=null){ Writer targetWriter = new OutputStreamWriter(clientSocket.getOutputStream()); targetWriter.write(result); targetWriter.flush(); clientMap.remove(clientPort); } } } } } resultMsg =""; } } catch (IOException e) { e.printStackTrace(); } finally { } } } 代码解释一下,当有LSKJ:00001请求的话,服务器就建立长连接,同时保存了IP和端口了,然后如果有<CODE>100</CODE><COMMAND>OUDC1_??</COMMAND><IP>192.168.1.222</IP><PORT>55775</PORT>这种信息请求的话,我就知道是要发送给指定的设备,然后等待设备返回指令OUDC1_ON=030:LSYD:54498:OK,我就知道要返回给54498端口的客户端短连接数据了。
关于android怎么一对一聊天
客户端怎么给指定的客户端发送消息,我现在是只要客户端发动的消息,连接的所有客户端都可以收到,换一种问法,也就是怎么给指定的Socket发送消息(怎么给Socket进行唯一的标识) 我的android代码就不写了,就是普通的发送消息和接收消息 下面是我服务端代码 public class SocketListener extends Thread { Socket s; // 该线程所处理的Socket所对应的输入流 BufferedReader br = null; // 定义保存所有Socket的ArrayList public static ArrayList<Socket> socketList = new ArrayList<Socket>(); public static ArrayList<String> useridList=new ArrayList<String>(); @Override public void run() { System.out.print("Socket线程启动成功"); try{ ServerSocket ss = new ServerSocket(30000); while(true) { // 此行代码会阻塞,将一直等待别人的连接 s = ss.accept(); socketList.add(s); // 每当客户端连接后启动一条ServerThread线程为该客户端服务 new Thread(new ServerThread(s)).start(); } }catch (IOException e) { System.out.println("客户端连接出错"); } } // 定义读取客户端数据的方法 private String readFromClient() { try { return br.readLine(); } // 如果捕捉到异常,表明该Socket对应的客户端已经关闭 catch (IOException e) { e.printStackTrace(); // 删除该Socket。 SocketListener.socketList.remove(s); // ① } return null; } } package socket; import java.io.*; import java.net.*; import java.util.*; // 负责处理每个线程通信的线程类 public class ServerThread implements Runnable { // 定义当前线程所处理的Socket Socket s = null; // 该线程所处理的Socket所对应的输入流 BufferedReader br = null; public ServerThread(Socket s) throws IOException { this.s = s; // 初始化该Socket对应的输入流 br = new BufferedReader(new InputStreamReader( s.getInputStream() , "utf-8")); // ② } public void run() { try { String content = null; // 采用循环不断从Socket中读取客户端发送过来的数据 while ((content = readFromClient()) != null) { System.out.println(s.getInetAddress()+":"+content); int begin = content.indexOf("<"); int end = content.indexOf(">"); if (begin > -1 && end > -1) { String name = content.substring(begin, end + 1); System.out.println("将要发送给:"+name); String message=content.substring(end+1); // 遍历socketList中的每个Socket,将读到的内容向每个Socket发送一次 for (Iterator<Socket> it = SocketListener.socketList.iterator(); it.hasNext(); ) { Socket s = it.next(); try{ OutputStream os = s.getOutputStream(); os.write((message + "\n").getBytes("utf-8")); } catch(SocketException e) { System.out.print("转发出错"); e.printStackTrace(); // 删除该Socket。 it.remove(); System.out.println(SocketListener.socketList); } } } } } catch (IOException e) { e.printStackTrace(); } } // 定义读取客户端数据的方法 private String readFromClient() { try { return br.readLine(); } // 如果捕捉到异常,表明该Socket对应的客户端已经关闭 catch (IOException e) { e.printStackTrace(); // 删除该Socket。 SocketListener.socketList.remove(s); // ① } return null; } }
客户端和单台服务器多个程序建立多个连接如何保存并关联到一个用户?
学了一段时间tcp通信,用C#做了简单的聊天,一直用dictionary存储的连接类(包含存储userid,socket等信息),userid为key 多个程序提供不同的服务,后续更新:全部放Redis了
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 另外推荐一篇原创:终极推荐!可能是最适合你的Java学习路线 方法 网站 书籍推荐! Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
神经⽹络可以计算任何函数的可视化证明
《Neural Networks and Deep Learning》读书笔记第四篇本章其实和前面章节的关联性不大,所以大可将本章作为小短文来阅读,当然基本的深度学习基础还是要有的。主要介绍了神经⽹络拥有的⼀种普遍性,比如说不管目标函数是怎样的,神经网络总是能够对任何可能的输入,其值(或者说近似值)是网络的输出,哪怕是多输入和多输出也是如此,我们大可直接得出一个结论:不论我们想要计算什么样的函数,...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
活到老,学到老,程序员也该如此
全文共2763字,预计学习时长8分钟 图片来源:Pixabay 此前,“网传阿里巴巴要求尽快实现P8全员35周岁以内”的消息闹得沸沸扬扬。虽然很快被阿里辟谣,但苍蝇不叮无缝的蛋,无蜜不招彩蝶蜂。消息从何而来?真相究竟怎样?我们无从而知。我们只知道一个事实:不知从何时开始,程序猿也被划在了“吃青春饭”行业之列。 饱受“996ICU”摧残后,好不容易“头秃了变强了”,即将步入为“高...
Vue快速实现通用表单验证
本文开篇第一句话,想引用鲁迅先生《祝福》里的一句话,那便是:“我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单”。这句话要从哪里说起呢?大概要从最近半个月的“全栈工程师”说起。项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载。博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
关于裁员几点看法及建议
最近网易裁员事件引起广泛关注,昨天网易针对此事,也发了声明,到底谁对谁错,孰是孰非?我们作为吃瓜观众实在是知之甚少,所以不敢妄下定论。身处软件开发这个行业,近一两年来,对...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问