客户端断开服务端就会产生异常并断开

WIN10上开发一个服务端程序,它能监听来自多个客户端的请求并连接,其中客户端会往服务端传送文件,使用SOCKET tcp协议。现在是每次客户端发送完文件后,服务端也能正常接收完文件,但接收完后就会产生异常退出。是开的线程来运行接收函数,现在要怎样定位问题呢?exe直接退出要应该怎么抓取log呢? 接收部分代码如下:
DWORD CClient::RecvDataThread(void* pParam)
{
CClient pClient = (CClient)pParam; //pointer to client
int reVal; //return value
char temp[MAX_NUM_BUF]; //temp value

WriteToLog("RecvDataThread");
cout <<"RecvDataThread"<<endl;

while(pClient->m_bConning)              //connection status
{   
//  if(!pClient->m_bSendConnectionSuccess)
//  {
//      break;
//  }
    cout <<"pClient->m_bConning"<<endl;
    memset(temp, 0, MAX_NUM_BUF);
    reVal = recv(pClient->m_socket, temp, MAX_NUM_BUF, 0);  //receive data

    //handle error return values
    if (SOCKET_ERROR == reVal)
    {
        int nErrCode = WSAGetLastError();

        if ( WSAEWOULDBLOCK == nErrCode )   //receive data buffer is invalid
        {
            continue;                       //continue loop
        }else if (WSAENETDOWN == nErrCode ||//client close connection
                 WSAETIMEDOUT == nErrCode ||
                WSAECONNRESET == nErrCode )
        {
            break;                          //thread exit
        }
    }

    //client close the connection
    if ( reVal == 0)
    {
        break;
    }

    //receive data
    if (reVal > 0)
    {
        cout <<"reVal > 0"<<endl;
        EnterCriticalSection(&pClient->m_cs);
        char *pClientIP = inet_ntoa(pClient->m_addr.sin_addr);
        u_short  clientPort = ntohs(pClient->m_addr.sin_port);
    //  cout<<"IP: "<<pClientIP<<"\tPort: "<<clientPort<<":"<<temp<<endl;      //output and show data
        WriteToLog(temp);
        char file_name[MAX_NUM_BUF];
        char *pfile = temp; // indicate path
        memset(file_name, 0, MAX_NUM_BUF);
        strncpy_s(file_name, "F:\\receive\\", strlen("F:\\receive\\"));
        int file_len = strlen(temp), i = 0, tem = 0;

        for (i = 0; i < file_len; i++)
        {
            if (strncmp(pfile + file_len - 1 -i, "\\", 1))  //if equal, return 0; else, return Positive
            {
                tem++;
                continue; //not equal
            }
            else // if equal, strcat path after \\  to file_name, it's exact length of path after 
                {
                    strncat_s(file_name, pfile + file_len - i, i);
                    break;
                }
        }

        if (tem == file_len)
        {
            strncat_s(file_name, temp, strlen(temp) > 1024 ? 1024 : strlen(temp));
        }

        FILE *fp;
        fopen_s(&fp, file_name, "wb");
        int len = send(pClient->m_socket, "Ready to send", strlen("Ready to send") + 1, 0);
        memset(sendMsgLogA, 0, 1024);
        sprintf_s(sendMsgLogA, "%s%d", "send size: ", len );
        WriteToLog(sendMsgLogA);

        char datalength[20];
        long int length = 0;
        int lenRecv = recv(pClient->m_socket, datalength, 21, 0);  //send file size from Client
        length = atol(datalength);

        memset(sendMsgLogA, 0, 1024);
        sprintf_s(sendMsgLogA, "%s%ld%s%ld", "file size: ", length, " recv size:", lenRecv);
        WriteToLog(sendMsgLogA);                //ready to send

        double cent = 0.0;
        char receiveBuf[SIZE];
        long int x = 0;
        while (1)
        {           
            cout <<"while (1)"<<endl;
            x = x + SIZE;  //SIZE scope is from -128 to 127
            if (x < length) // ZJX
            {
                cent = (double)x*100.0 / (double)length;
                memset(sendMsgLogA, 0, 1024);
                sprintf_s(sendMsgLogA, "%s%4.2f", "have received: ", cent);
                WriteToLog(sendMsgLogA);                //ready to send
                recv(pClient->m_socket, receiveBuf, SIZE + 1, 0);      //recv SIZE files
                fwrite(receiveBuf, 1, SIZE, fp);             //write SIZE files into receiveBuf, and continue to loop
            }
            else  //excute the function directory while files is smaller, and loop exit
            {
                recv(pClient->m_socket, receiveBuf, length + SIZE - x + 1, 0);
                fwrite(receiveBuf, 1, length + SIZE - x, fp);
                fclose(fp);                     
                WriteToLog("file received done");
                break;
            }

        }
    }
    WriteToLog("out of reVal>0");

    LeaveCriticalSection(&pClient->m_cs);
    WriteToLog("out of LeaveCriticalSection");
    memset(temp, 0, MAX_NUM_BUF);   //clean up temp variables
}

WriteToLog("out of pClient->m_bConning");
pClient->m_bConning = FALSE;            //disconnect with client
return 0;                               //thread exit

}


7个回答

那你打断点看是哪里运行出错了?肯定有地方异常了

大概流程是:客户端一连接上服务端,服务端就发送“Connect To Server Successfully”,之后客户端会给服务端发送要发送文件的地址和文件名,服务端在接收到地址和文件名后,会解析,解析完后只得到文件名,并在F:/receive目录下生成该文件名,文件名生成完后就发送"Ready to send"到客户端,客户端接收到该字符串后,就开始发送文件,服务端就也同时开始接收该文件,接收文件大小不同就按代码中条件分别处理。这些流程下来,一切都正常,能在F:/receive下得到客户端传过来的文件,但文件传输完成后,服务端程序也会马上弹出异常退出。最后的log中打印WriteToLog("out of pClient->m_bConning"); 也能在log文件中看到,说明这里不是导致服务exe退出的原因。像这样的问题要怎么分析呢?百度说的太杂了。有没有专业人士给个方向。多谢!!!

服务端EXE异常退出时

打印的log文件 等待大神降临指导!

看看是不是传输文件大小的问题

客户端手动断开前,手动关闭网络,如果是异常断开,连接通道断开,肯定是会报出异常的,你把这个异常捕获到再进行处理就可以了。

liuyunpeng07
liuyunpeng07 回复caoco: 可以
大约 2 年之前 回复

打断点跟了下,出现不同的原因,都是缓冲指针为野指针的错误。现在已经改好了,谢谢各位!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
当客户端往服务器发送数据时,为什么只有当客户端断开瞬间服务器才能收到数据。
当客户端往服务器发送数据时,为什么只有当客户端断开瞬间服务器才能收到数据。
HttpservletResponse写数据时客户端断开
我在写一程序,客户端用HTTP向服务器请求文件,服务器返回文件数据 OutputStream out = response.getOutputStream(); out.write(buf); 如果客户端断开(网卡禁用),write直接阻塞了,不抛出异常,怎么回事呀? 测试时,用java写客户端测试,网卡禁用或读的过程中关闭程序,服务器都会抛出异常,但用C++,网卡禁用了,write就阻塞了
Netty5客户端第二次连接服务端异常
用Netty5开发通信框架时出现客户端强制关闭程序,服务端捕获到客户端断开连接并关闭channel;客户端再次启动程序连接服务端会连接不上 服务端代码: ![启动服务](https://img-ask.csdn.net/upload/201607/09/1468037617_277162.png) 服务端handler: ![服务端handler:](https://img-ask.csdn.net/upload/201607/09/1468038034_658063.png) 客户端代码: ![启动客户端](https://img-ask.csdn.net/upload/201607/09/1468038203_298005.png) 客户端handler: ![客户端handler](https://img-ask.csdn.net/upload/201607/09/1468038310_93974.png) 先启动服务端,等待客户端连接 第一次启动客户端建立连接,连接建立时客户端正常调用channelActive方法发送数据,服务端正常接口数据并返回响应,客户端正常接收响应。当客户端程序执行完成,关闭程序,服务端可以捕获到客户端断开的信息: ![服务端成功捕获客户端断开](https://img-ask.csdn.net/upload/201607/09/1468038938_389467.png) 服务端捕获客户端断开后作出处理,清理channel并关闭ChannelHandlerContext并抛出异常: ![客户端断开连接后服务端抛出的异常](https://img-ask.csdn.net/upload/201607/09/1468039139_985584.png) 再次启动客户端程序连接服务端,程序依然可以进到channelActive发送消息,(channelActive触发是否可以确定已经建立了TCP连接?) ![第二次连接依然可以触发channelActive](https://img-ask.csdn.net/upload/201607/09/1468039445_679816.png) 然而虽然已经向服务端writeAndFlush,但是服务端并没有收到任何消息,客户端会抛出异常: ![客户端第二次启动抛出的异常](https://img-ask.csdn.net/upload/201607/09/1468040066_459885.png) 跟踪异常,是客户端在向chennal写数据时抛出错误! 为什么我服务端已经清理了客户端信息并关闭了通道,客户端程序第二次连接发送数据会出现异常呢? 求大神解答!
websocket 如果服务端主动断开连接客户端应该如何收到反馈
如果存在服务器主动断开与客户端连接的websocket的情况, 服务器端或者客户端应该如何写才能让客户端接收到连接被断开连接的反馈? 麻烦定时检测是否断开的这种方法就不要说了。
在无数据传输时服务器端怎样检测客户端已经断开
windows下的一个服务器程序,在数据传输过程中如果客户端断开了,send函数发送失败即可知道后端断开了,那如果没有数据传输时怎样判断?除了发探测包还有其他好的方法吗?
netty 系统空闲一段后,客户端与服务端的链接会自动断开如何处理
大伙有没有出现过这样的问题。用netty做集群服务器,包括客户端(clientBootstrap)和服务端(serverBootstrap),系统空闲3个多小时候,客户端与服务端的连接会自动断开(“远程主机强迫关闭了一个现有的连接”),系统重新后连接报异常: java.lang.IllegalArgumentException: promise already done: DefaultChannelPromise@2038329b(failure(java.util.concurrent.CancellationException) at io.netty.channel.DefaultChannelHandlerContext.validatePromise(DefaultChannelHandlerContext.java:806) at io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:477) at io.netty.channel.DefaultChannelHandlerContext.connect(DefaultChannelHandlerContext.java:467) at io.netty.channel.DefaultChannelPipeline.connect(DefaultChannelPipeline.java:847) at io.netty.channel.AbstractChannel.connect(AbstractChannel.java:199) at io.netty.bootstrap.Bootstrap$2.run(Bootstrap.java:165) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) at java.lang.Thread.run(Unknown Source) 最后: Caused by: java.net.NoRouteToHostException: No route to host: no further information at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source) at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:191) at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:279) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:461) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:378) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) 请问这个问题如何解决,我有做心跳处理,客户端每个几秒会请求服务端,这样都还会自动断开连接,好郁闷....
socket客户端如何主动断开与服务器的连接
这里是客户端 new Thread(new Runnable() { @Override public void run() { try { final Socket socket=new Socket("192.168.43.39",8080); OutputStream out=socket.getOutputStream(); PrintWriter pw=new PrintWriter(out); pw.write("123"); pw.flush(); socket.shutdownOutput(); socket.setSoTimeout(5000); InputStream inputStream=socket.getInputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); String client=null; while ((client=bufferedReader.readLine())!=null){ System.out.print("这里是客户端。服务器说:"+client); textView.setText("这里是客户端,"+client); } //关闭相关资源 inputStream.close(); bufferedReader.close(); pw.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); ``` 这是服务器端 try { ServerSocket serverSocket=new ServerSocket(8080); System.out.print("服务器已启动,正在等待客户端连接...\n"); //记录客户端的数量 int count=0; //循环监听等待客户端的连接 while (true){ //调用accept()方法监听,等待客户端的连接 socket= serverSocket.accept(); System.out.print("服务器已连接客户端!\n"); //创建一个新的线程 ServerThread serverThread=new ServerThread(socket); //开启线程 serverThread.start(); count++; System.out.print("当前客户端的数量为:"+count+"\n"); } } catch (IOException e) { e.printStackTrace(); } ```
Netty 客户端如何检测服务端断开了呢
Netty4 在客户端中如何能够知道服务端关闭了呢? 在客户端发送完消息后,同时得到了服务端的响应,Channel.isActive()返回的是false?各位有知道么?
java Socket 在客户端断开之后才可以接收到客户端发送的消息!
``` //客户端 public class Test { private static boolean is = true; public static void main(String[] args) throws IOException, InterruptedException { Socket socket = new Socket("127.0.0.1", 6677); System.out.println("链接成功"); Scanner scanner = new Scanner(System.in); while (is) { System.out.println("请输入!!!"); int n = scanner.nextInt(); switch (n) { case 1: OutputStream os = socket.getOutputStream(); os.write("hello world".getBytes()); os.flush(); // os.close(); // socket.close(); // IoUtil.IoClose(os); System.out.println("发送成功"); break; case 2: System.out.println("循环关闭"); is = false; break; default: is = false; System.out.println("输入错误---循环关闭"); break; } } } } ``` ``` //服务器端 太多了 就贴一部分 @Override public void run() { MessageThread messageThread = null; InputStream iss = null; InputStreamReader isr = null; BufferedReader br = null; while (is) { try { // 监听 Socket socket = serverSocket.accept(); System.out.println("链接成功"); iss = socket.getInputStream(); isr = new InputStreamReader(iss); br = new BufferedReader(isr); String len; StringBuffer sb = new StringBuffer(); while ((len = br.readLine()) != null) { sb.append(len); } System.out.println(sb.toString()); // iss.close(); // IoUtil.IoClose(br, isr, iss); SocketMap.put(sb.toString(), socket); /** * 开启接受消息的线程 */ messageThread = new MessageThread(socket); messageThread.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); messageThread.setFlag(false); } } ``` 大致代码就这些 问题出在 socket 可以链接成功 但是 客户端发送的消息要等 客户端断开链接之后才能接收到 或者 关闭客户端的输出流也可以! C#为客户端的时候也一样!
mina 长连接 客户端 自动断开
各位大神帮帮忙,我是写了一个mina客户端,需要从一个服务端软件处接收数据,但这个连接总是在运行50000秒,即13小时53分20秒后断开,然后再重连,重连成功继续收数,但为什么会断开呀?是在什么地方有设置吗?跪谢各位大神!
qt tcp服务端应该怎样正确关闭,我反复开关tcp的服务端,客户端连接后,会出现程序异常
服务器第一次开启(RUN)的时候,客户端端连接上来是没有问题的。然后我关闭(STOP)服务器,再开启,客户端连接上来,就会程序异常。 我在处理有新连接的信号的槽函数里(即v_SlotConnection)做了打印,当第二次开启服务器,客户端连接上会两次进入v_SlotConnection,然后就程序异常了。bug解决了,是因为我把newConnection放在开始的按钮里,放出来就没问题了,原因不明白。 ``` //开始运行tcp服务端 if((ui->buttonrun->text())=="RUN") { qDebug()<<"RUN"; //监听网卡下所有8087 if(false == tcpServer->isListening()) { tcpServer->listen(QHostAddress::Any, 8087); } //监听固定ip下 8087 // tcpServer->listen(QHostAddress(ipAddr), serverPort); ui->buttonrun->setText("STOP"); } else if((ui->buttonrun->text())=="STOP") { qDebug()<<"stop"; ui->linkNumber->display(0); ui->buttonrun->setText("RUN"); //主动和客户端端口断开 if(NULL == tcpSocket) { //清空计数 tcpServer->close(); } else { //倒着断开加入链表的ip地址 int i=clients.length()-1; qDebug()<<i<<"clients.length()"<<clients.length(); while(i>=0) { clients.at(i)->disconnectFromHost(); i--; } tcpServer->close(); } } connect(tcpServer, &QTcpServer::newConnection, this, &ServerWidget::v_SlotConnection); ```
采用tcp实现聊天服务器和客户端
采用tcp实现聊天服务器和客户端,客户端从命令行输入聊信息,服务器收到聊天信息发送给所有连接到此服务器的客户端。 要求: 此服务器端口号为:8888, 聊天信息格式为:消息头(4字节,标示后续消息体聊天信息的长度) + 消息体(聊天信息) 支持100个客户端的连接和发送接收操作。 //多线程 客户端输入exit就断开连接并退出程序 服务器要能响应客户端的主动断开请求
关于客户端(Client)向服务器端(Server)进行http请求的时候出现的问题
最近在做一个Android应用,客户端需要向服务器端(jsp后台)提交一些信息,并得到服务器的反馈,再显示到界面上。 问题就出现在服务端接受到数据,插入数据库形成订单,处理完后返回成功与否的反馈信息给客户端时候。由于客户端主动关闭网络或由于信号不好,导致网络被迫关闭。 客户端无法接受到服务器反馈,而产生超时异常(此时servlet竟然不报异常),此时反馈给Android客户端的则是此操作失败;然而后台却由于刚刚数据插入操作成功而生成订单,管理人员在查看的时候发现订单存在则默认为客户操作成功。 如何避免以上情况呢?咨询过一些人: 1、有人说拉长客户端的超时时间,以降低概率;(治标不治本) 2、有人说做验证,客户端收到反馈后,再通知服务端,那么服务端才插入数据进数据库,其实这个并没解决问题,如果客户端在接受到反馈后网络就断开了,那通知服务器这一步就达不成,导致客户端以为自己下单成功,而服务端却没生成订单。(这种反馈机制是不完善的,只是循环走钢丝而已) 3、有人说做缓存,当网络再次通畅的时候,服务器的订单才正式生成。(这就破坏了订单的及时性,万一一星期后才开网络,这就导致了订单延迟了一星期) 4、各位csdn的大大意见。 对于此类问题,小弟的个人看法是: 1、servlet此时应该报异常,但是我就是没发现有异常,应该是学艺不精,不知道怎么catch这个异常,求各位不吝赐教。 2、http的机制本身就存在这种弊端,得走别的协议才能解决以上情况。(此为猜测,没有理论依据)不过本人觉得不太可能http存在弊端,因为据了解http是有反馈机制来处理这种情况的,但是不知道为啥servlet没报错。 求各位csdn的大大帮忙啊!
linux下客户端与服务器怎么保持长连接
项目过程中建立的客户端一直把数据发送给服务器 可是过大概五分钟的时间,就会断开出现 signalipe broke pipe 的问题 while() { write (fd,buffer,bufsize); sleep(3); } 为什么呢,求高手指点
Socket通讯中,如果两个客户端同时一刻断开的话,会造成Recv返回的socketID相互覆盖。
Bug:两个客户端趋近于同一时刻关闭的情况,recv返回的是同一个socketID,应该是返回两个socketID才对 现状:启动一个服务器tcpip程序,三台客户端程序,每个20ms连接断开一次,一直循环。 tcp服务器端程序accept阻塞等待客户端连接 tcp服务器端程序recv阻塞等待客户端关闭 [201416][201604]11:44:36 ERROR: accept连接: 端口号54470连接,SOCKET号4852 [201416][201604]11:44:36 ERROR: accept连接: 端口号54726连接,SOCKET号4812 [201416][201604]11:44:36 ERROR: accept连接: 端口号54982连接,SOCKET号4868 [201416][204384]11:44:36 ERROR: recv断开: SOCKET号4852 [201416][204344]11:44:36 ERROR: recv断开: SOCKET号4812 [201416][204432]11:44:36 ERROR: recv断开: SOCKET号4868 [201416][201604]11:44:36 ERROR: accept连接: 端口号55238连接,SOCKET号4880 [201416][201604]11:44:36 ERROR: accept连接: 端口号55494连接,SOCKET号4836 [201416][201604]11:44:36 ERROR: accept连接: 端口号55750连接,SOCKET号4892 [201416][204496]11:44:36 ERROR: recv断开: SOCKET号4880 [201416][204544]11:44:36 ERROR: recv断开: SOCKET号4892 [201416][201604]11:44:36 ERROR: accept连接: 端口号56006连接,SOCKET号4900 [201416][201604]11:44:36 ERROR: accept连接: 端口号56262连接,SOCKET号4860 [201416][203984]11:44:36 ERROR: recv断开: SOCKET号4836 [201416][201604]11:44:36 ERROR: accept连接: 端口号56518连接,SOCKET号4916 [201416][204624]11:44:36 ERROR: recv断开: SOCKET号4916 [201416][204688]11:44:36 ERROR: recv断开: SOCKET号4916 [201416][201604]11:44:36 ERROR: accept连接: 端口号56774连接,SOCKET号4924 [201416][201604]11:44:36 ERROR: accept连接: 端口号57030连接,SOCKET号4884 [201416][204592]11:44:36 ERROR: recv断开: SOCKET号4860 [201416][201604]11:44:36 ERROR: accept连接: 端口号57286连接,SOCKET号4908 [201416][204648]11:44:36 ERROR: recv断开: SOCKET号4884 [201416][201604]11:44:36 ERROR: accept连接: 端口号57542连接,SOCKET号4956 [201416][204664]11:44:36 ERROR: recv断开: SOCKET号4908 [201416][204680]11:44:36 ERROR: recv断开: SOCKET号4884 [201416][201604]11:44:36 ERROR: accept连接: 端口号57798连接,SOCKET号4932 [201416][201604]11:44:36 ERROR: accept连接: 端口号58054连接,SOCKET号4964 [201416][204720]11:44:36 ERROR: recv断开: SOCKET号4956 [201416][204736]11:44:36 ERROR: recv断开: SOCKET号4932 [201416][204752]11:44:36 ERROR: recv断开: SOCKET号4964 [201416][201604]11:44:36 ERROR: accept连接: 端口号58310连接,SOCKET号4972 [201416][201604]11:44:36 ERROR: accept连接: 端口号58566连接,SOCKET号4940 [201416][201604]11:44:36 ERROR: accept连接: 端口号58822连接,SOCKET号4988 [201416][204784]11:44:36 ERROR: 现在的报错,应该和链表没有关系,因为没有用到链表,只打印了recv的值。问题出在了recv中,如果有两个客户端同一时刻断开的时候,recv返回时偶尔会出现同一个socketID.
java nio 关闭客户端 服务器端的selector.select(TimeOut)方法不阻塞
代码如下: // 反复循环,等待IO while (true) { // 等待某信道就绪(或超时) if (selector.select(TimeOut) == 0) {// 监听注册通道,当其中有注册的 IO // 操作可以进行时,该函数返回,并将对应的 // SelectionKey 加入 selected-key // set log.info("服务器独自等待."); continue; } // 取得迭代器.selectedKeys()中包含了每个准备好某一I/O操作的信道的SelectionKey // Selected-key Iterator 代表了所有通过 select() 方法监测到可以进行 IO 操作的 channel // ,这个集合可以通过 selectedKeys() 拿到 Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator(); while (keyIter.hasNext()) { SelectionKey key = keyIter.next(); try { if (key.isAcceptable()) { // 有客户端连接请求时 protocol.handleAccept(key); } if (key.isReadable()) {// 判断是否有数据发送过来 // 从客户端读取数据 protocol.handleRead(key); } if (key.isValid() && key.isWritable()) {// 判断是否有效及可以发送给客户端 // 客户端可写时 protocol.handleWrite(key); } } catch (IOException ex) { // 出现IO异常(如客户端断开连接)时移除处理过的键 log.error("IO异常(如客户端断开连接)", ex); keyIter.remove(); continue; } // 移除处理过的键 keyIter.remove(); } } 奇怪的现象是,我关闭了客户端后,这个keyIter里面一直会有一个read的key存在,按说客户端关闭了应该阻塞了,很奇怪。
socket服务器端接收不到sokit工具客户端发送来的信息
try { ServerSocket serverSocket =new ServerSocket(1086); while (true) { Socket socket = serverSocket.accept(); BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream())); String result = bufferedReader.readLine(); System.out.println("Client say : " + result); bufferedReader.close(); socket.close(); } }catch (Exception e) { System.out.println("Exception:" + e); } 这是我服务器上的代码,我下载了sokit工具,使用客户端发送信息,服务器一直都没有接收到信息,如果我把客户端断开,这时服务器就能接收到信息,希望大家能帮我
使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求
初学java,目前写了一个服务端和一个客户端。大致了解了如何socket通信是如何操作的,并且初步实现了客户端和服务端的通信。也仅仅是是接受和返回简单的字符串。部分代码如下 public void run(){ try{ serverSocket=new ServerSocket(SERVER_PORT_ONE); System.out.println("serversocket已创建"); while(true){ clientSocket=serverSocket.accept(); System.out.println("监测到了socket"); receiveThread=new SocketThread(clientSocket); //开启新线程处理请求 receiveThread.start(); } }catch(IOException e){ System.out.println(e.getMessage()); } } ``` ``` 这是socket监听的代码。当服务器监听到了socket之后,开启一个新线程去处理。 socketthread类的run()方法来接受数据 public void run(){ String Command=null; String str=null; output.println("服务器已经接受你的连接\n"); while(true){ try{ str=null; str=input.readLine(); System.out.println("监测数据如下:"+str); }catch(IOException e){ System.out.println(e.getMessage()); } Command=str.trim().toUpperCase(); if(str==null || Command.equals("QUIT")) { break; } } try{ clientSocket.close();//关闭套接字 System.out.println("clientSocket已经断开连接"); }catch(IOException e){ System.out.println(e.getMessage()); } Command=null; } ``` 在while循环里面,服务端会不断读取来自客户端的内容,然后输出来。如果读到quit,就表示断开连接,并关闭socket。 ``` 现在的问题就是, 如果我的客户端的请求十分多样,比如发送语音,视频,图片或者数据给服务器进行处理,我的服务端必须做出相应的处理,请问如何做到这点啊。 我自己想的思路是客户端发送数据前先要发送一个header标签,表示想干什么。然后读取到了之后客户端再判断,然后分给不同的函数去处理。不知道这样好不好,如下所示。 while(true){ try{ str=null; str=input.readLine(); if(str.equals("图片")){ 图片相关函数(socket ); } if(str.equals("视频")){ 视频处理相关函数(socket ); } if(str.equals("数据")){ 数据处理相关函数(socket );//如各种算法 } System.out.println("监测数据如下:"+str); }catch(IOException e){ System.out.println(e.getMessage()); } Command=str.trim().toUpperCase(); if(str==null || Command.equals("QUIT")) { break; } 不知道是否可行。 第二个问题,我的服务器要主动推送数据给客户端该如何实现,肯定不能写在这个线程里面。写在其他地方我的类和函数如何得到这个线程里的socket呢。
C# SuperSocket 客户端发送图片 服务端接收问题.
按照文档 和一些资料集成了 服务端SuperSocket 并且可以进行数据传输. 使用的默认的命令行模式 解析器都没改过 用的默认的. 客户端是androidTv. 问题是 客户端发送图片流 服务端接收不到,并且客户端连接会被强制断开. 我使用SocketTool测试发现如果发送的数据长度超过一定的长度 可能是supertSocket定义的长度就会被强制断开连接,并且收不到这个流. 另外 如果可以自定义来实现的话,这个流要怎么循环接收? 都需要自定义吗?
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
小白学 Python 爬虫(25):爬取股票信息
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
小知识:浅谈二维码的生成和识别原理
目录 前言 条形码 静态二维码 二进制生成图形码 二维码的定位 前言 不知不觉中,我们的生活到处充满了二维码。登录账户需要二维码;加好友需要二维码;共享单车需要二维码;商品包装上也有二维码;甚至连楼下卖水果的阿姨手里都拿张二维码收款。那么,有没有想过这个二维码到底是什么东西呢?那么这个二维码的图案会不会多到不小心重合了呢? 条形码 在二维码出现之前,大行其道的...
[享学Jackson] 一、初识Jackson -- 世界上最好的JSON库
Jackson是一个简单的、功能强大的、基于Java的**应用库**。它可以很方便完成**Java对象**和**json对象(xml文档or其它格式)**进行互转。Jackson社区相对比较活跃,更新速度也比较快。Jackson库有如下几大特性: - 高性能,稳定:低内存占用,对大/小JSON串,大/小对象的解析表现均很优秀 - 流行度高:是很多流行框架的默认实现 - 容易使用:提供高层次的API,极大简化了日常使用 - 无需自己手动创建映射:内置了绝大部分序列化时和Java类型的映射关系 - 干净的JSO
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
世界上最牛的网络设备,价格低廉,其貌不扬......
夜深人静,电视和电脑都已经关机休息,但是我还在默默工作,我安静地趴在你家中的某个地方,7*24小时不眠不休,任劳任怨,目的只有一个,能让你舒服地躺在床上,畅快地刷手机!没错,这就是我,...
《面试宝典》2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 1、什么是Spring MVC ?简单...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
(总结)阿里面试问了ArrayList,都问了啥?
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
2020年1月中国编程语言排行榜,python是2019增长最快编程语言
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 20713 17500 5042 46250 480 0.14% 2 typescript 18503 22500 6000 30000 1821 0.52% 3 lua 18150 17500 5250 35000 2956 0.84% 4 go 17989 16...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
立即提问