socket双向通信,为什么服务器只能接收一次客户端发送的消息

如题,双向的socket通信,但是服务端只能接收一次客户端发送的请求消息就终止在accept状态,请问是哪里出了问题了。

客户端程序如下:

[code="java"]package com.snail.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketClient {
public static void main(String[] args) {
Socket socket = null;
PrintWriter printWriter = null;
BufferedReader bufferedReader = null;
try {

        socket = new Socket(InetAddress.getLocalHost(), 2123);

        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        printWriter = new PrintWriter(socket.getOutputStream(), true);


        int i=1;
        while (true) {
            System.out.println("input " + i);
            BufferedReader bufIn = new BufferedReader(new InputStreamReader(System.in));
            String result = bufIn.readLine();
            System.out.println("client input data " + i++ + ": " + result);
            printWriter.println(result);
            printWriter.flush();

            String serverStr = bufferedReader.readLine();
            System.out.println("Server : " + serverStr);// 在标准输出上打印从Server读入的字符串
            if (result.equals("end")) {
                bufIn.close();
                break;
            }
        }
        printWriter.close();
        bufferedReader.close();
        socket.close();

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(printWriter != null) {
            printWriter.close();
        }
        if(bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

}[/code]

服务端代码如下:

[code="java"]package com.snail.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader bufferedReader = null;
PrintWriter printWriter = null;

    try {
        serverSocket = new ServerSocket(2123);
        int i = 1;
        while (true) {

            System.out.println("accept " + i);
            socket = serverSocket.accept();
            System.out.println("begin " + i++ + ": " + "accept");
            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            printWriter = new PrintWriter(socket.getOutputStream(), true);

            // 获取从客户端读入的字符串
            String result = bufferedReader.readLine();

            System.out.println("Client say : " + result);

            if ("bye".equals(result)) {
                System.out.println("Client say : " + result);
                printWriter = new PrintWriter(socket.getOutputStream());
                printWriter.print("hello Client, I am Server! bye-bye.");
                printWriter.flush();
                break;
            }

            // 由Socket对象得到输出流,并构造PrintWriter对象

            printWriter.println("hello Client, I am Server!");
            printWriter.flush();

        }
        printWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (printWriter != null) {
            printWriter.close();
        }
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

}
[/code]

请大神指教下

3个回答

// 获取从客户端读入的字符串

String result = bufferedReader.readLine(); 这里会阻塞。
你服务器端获取Socket以后 需要另外启动一个线程去处理,你现在是单线程的服务器端设计,当然只能接收一次请求了。

服务器端接收到Socket以后应该启动一个线程

new Thread(new Runable(){
//你上面的哪些代码。
}).start();

fxhu09
fxhu09 搞笑。这个居然成了答案。
6 年多之前 回复

使用NIO吧,推荐mina或者netty

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class SocketServer {

public static void main(String[] args) {

ServerSocket serverSocket = null;

Socket socket = null;

BufferedReader bufferedReader = null;

PrintWriter printWriter = null;

    try {  
       serverSocket = new ServerSocket(2123); 
       socket = serverSocket.accept(); 
       bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
       printWriter = new PrintWriter(socket.getOutputStream(), true);  
        int i = 1;  
        while (true) {  

            System.out.println("accept " + i);  

            System.out.println("begin " + i++ + ": " + "accept");  


           // 获取从客户端读入的字符串  
            String result = bufferedReader.readLine();  

            System.out.println("Client say : " + result);  

            if ("bye".equals(result)) {  
               System.out.println("Client say : " + result);  
               printWriter = new PrintWriter(socket.getOutputStream());  
                printWriter.print("hello Client, I am Server! bye-bye.");  
                printWriter.flush();  
                break;  
            }  

            // 由Socket对象得到输出流,并构造PrintWriter对象  

            printWriter.println("hello Client, I am Server!");  
            printWriter.flush();  
            //printWriter.close();  
            //bufferedReader.close();  
         }  
        printWriter.close();  
        bufferedReader.close();  
        socket.close();  
         serverSocket.close();  
     } catch (IOException e) {  
         e.printStackTrace();  
     } finally {  
         if (socket != null) {  
             try {  
                 socket.close();  
             } catch (IOException e) {  
                 // TODO Auto-generated catch block  
                 e.printStackTrace();  
             }  
         }  
         if (serverSocket != null) {  
             try {  
                 serverSocket.close();  
             } catch (IOException e) {  
                 e.printStackTrace();  
             }  
         }  
         if (printWriter != null) {  
             printWriter.close();  
         }  
         if (bufferedReader != null) {  
             try {  
                 bufferedReader.close();  
             } catch (IOException e) {  
                 // TODO Auto-generated catch block  
                 e.printStackTrace();  
             }  
         }  
     }  
 }  

}

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

public class SocketClient {

public static void main(String[] args) {

Socket socket = null;

PrintWriter printWriter = null;

BufferedReader bufferedReader = null;

try {

        socket = new Socket(InetAddress.getLocalHost(), 2123);  

        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
        printWriter = new PrintWriter(socket.getOutputStream(), true);  


        int i=1; 
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(System.in));  
        while (true) {  
            System.out.println("input " + i);  

            String result = bufIn.readLine();  
            System.out.println("client input data " + i++ + ": " + result);  
            printWriter.println(result);  
            printWriter.flush();  

            String serverStr = bufferedReader.readLine();  
            System.out.println("Server : " + serverStr);// 在标准输出上打印从Server读入的字符串  
            if (result.equals("bye")) {  
                bufIn.close();  
                break;  
            }  

        }  
        printWriter.close();  
        bufferedReader.close();  
        socket.close();  

    } catch (UnknownHostException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        if(socket != null) {  
            try {  
                socket.close();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
        if(printWriter != null) {  
            printWriter.close();  
        }  
        if(bufferedReader != null) {  
            try {  
                bufferedReader.close();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    }  
}  

}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c#socket双向通信,收不到服务器的反馈信息

请问大神们:为什么c#socket通信时,同步的,客户端必须先收到服务器的应答,才开始发送数据,但是在服务器收到数据处理完后,反馈给客户端时为什么收不到了?

关于服务器与服务器间的双向通信问题

嵌入式小白,还望大神指点迷津。 我使用S3C6410作为网关服务器,要与Windows下的web服务器进行通信,既要接收数据,也要发送数据。 想要解决的问题: 1. 使用Socket还是HTTP?还是其他方式? 2. 以我自己的查阅,很多都是服务器与客户端之见的双向通信,服务器与服务器间的是否可以实现?还是说在通信过程中要把其中一方当做服务器另一方当做客户端?

C# 单客户端 多服务器同时收发数据

需要用C#编写TCP协议的客户端接收两个服务器传过来的文件。使用了两个Socket连接两个服务器,每一个socket都有一个单独的接收线程recmsg,多线程+阻塞模式。 现在的问题是两个服务器有可能会在同一时刻向客户端发送文件,客户端同一IP地址下从不同端口同时接收到了文件。这种情况下是否会出现冲突的情况,客户端无法判断优先从哪个端口接收数据? 如果会有冲突,那么应该采用何种方式解决这种客户端同时接收到文件的情况? 部分代码如下 private void Form1_Load(object sender, EventArgs e) { socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.2.100"), 7890); socketClient.Connect(ipe); threadClient = new Thread(RecMsg); threadClient.IsBackground = true; threadClient.Start(); Message.AppendText("已经与服务端100建立连接,可以开始通信...\r\n"); socketClient2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe2 = new IPEndPoint(IPAddress.Parse("192.168.2.110"), 7890); socketClient2.Connect(ipe2); threadClient2 = new Thread(RecMs); threadClient2.IsBackground = true; threadClient2.Start(); Message.AppendText("已经与服务端110建立连接,可以开始通信...\r\n"); }

Android作为Socket通信客户端的代码分析

基于Android Studio编写Socket的客户端,与基于Python的Socket服务器进行通信。 这是MainActivity相关代码: ``` import android.annotation.SuppressLint; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.view.View.OnClickListener; import android.os.Bundle; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class MainActivity extends AppCompatActivity { private TextView result = null; private TextView result2 = null; private static final String HOST = "192.168.80.100"; private static final int PORT = 12345; private Socket socket = null; private BufferedReader bufferedReader = null; private PrintWriter printWriter = null; private String content = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText eturl= findViewById(R.id.eturl); Button btn= findViewById(R.id.btn); result = findViewById(R.id.result); result2 = findViewById(R.id.result2); initSocket(); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String msg; msg = eturl.getText().toString(); if (socket.isConnected()){ if (!socket.isOutputShutdown()){ Toast.makeText(MainActivity.this,"正在发送,请稍等……",Toast.LENGTH_LONG).show(); sendMsg(msg); result.setText("正在连接" + HOST + "\n" + "发送URL" + "\n" + "等待接收检测结果" + "\n"); recv(); } } } }); } public void sendMsg(final String msg){ new Thread(new Runnable() { @Override public void run() { if(socket.isConnected()){ if(!socket.isOutputShutdown()){ printWriter.println(msg); } } } }).start(); } public void initSocket(){ new Thread(new Runnable() { @Override public void run() { try{ socket=new Socket(HOST,PORT); bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); }catch (Exception e){ e.printStackTrace(); } } }).start(); } public void recv(){ new Thread(new Runnable() { @Override public void run() { try{ while (true){ if(socket.isConnected()){ if(!socket.isInputShutdown()){ if((content = bufferedReader.readLine()) != null){ content += "\n"; mhandler.sendMessage(mhandler.obtainMessage()); }else{ } } } } }catch (Exception e){ e.printStackTrace(); } } }).start(); } @SuppressLint("HandlerLeak") public Handler mhandler = new Handler(){ public void handleMessage(Message msg) { super.handleMessage(msg); result2.setText(content); } }; } ``` 目前可以正常发送,但接收时有些问题,收不到,安卓客户端没有任何显示。服务器端用另外基于Python的客户端测试过,没问题,应该就是安卓客户端与接收有关的代码可能有问题。 从上面的代码中能看出有什么不妥吗,急求大神指点!!!

VS2010 MFC CSocket为什么只能接收到服务器的一次返回的信息,新手求大神详解谢谢

CSocket sock_client; ...... void Cftp_clientDlg::OnBnClickedconnect() { AfxSocketInit(); if(!sock_client.Create()) { AfxMessageBox(_T("socket创建失败!")); return; } UpdateData(true); if(!sock_client.Connect(m_host,m_port)) { AfxMessageBox(_T("socket连接服务器失败!")); return; } # MySockRecv(); CString send_msg; send_msg = "USER "; send_msg += m_name; send_msg += "\r\n"; MySockSend(send_msg); # MySockRecv(); send_msg = "PASS "; send_msg += m_password; send_msg += "\r\n"; MySockSend(send_msg); # MySockRecv(); } void Cftp_clientDlg::MySockRecv() { char buf_recv[200] = ""; if(SOCKET_ERROR == sock_client.Receive(buf_recv,199)) { AfxMessageBox(_T("数据接收失败!")); return; } CString show_msg("响应:"); show_msg += buf_recv; m_listbox.AddString(show_msg); } void Cftp_clientDlg::MySockSend(CString send_msg) { if(SOCKET_ERROR == sock_client.Send(send_msg,send_msg.GetLength())) { AfxMessageBox(_T("数据发送失败!")); return; } CString show_msg("命令:"); show_msg += send_msg; m_listbox.AddString(show_msg); }![图片说明](https://img-ask.csdn.net/upload/201704/20/1492655407_138058.png)

socket通信在一个虚拟机开两个终端可以通信,换成两个虚拟机出错

在一个虚拟机里开两个终端可以实现通信,但是换成两个虚拟机就在connect函数那里失败了,返回-1,输出的错误提示是:connect:connection timed out。我在网上搜了很久都解决不了。我的设备是virtualbox里的两台ubuntu虚拟机,ip地址分别为10.0.2.15和10.0.3.15,能上网,能ping通,防火墙已关闭,端口没被占用,请问这可能是什么原因呢? 服务器端 ``` #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #define MYPORT 8887 #define QUEUE 20 #define BUFFER_SIZE 1024 int main() { ///定义sockfd int server_sockfd = socket(AF_INET,SOCK_STREAM, 0); ///定义sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(MYPORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); ///bind,成功返回0,出错返回-1 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind"); exit(1); } ///listen,成功返回0,出错返回-1 if(listen(server_sockfd,QUEUE) == -1) { perror("listen"); exit(1); } ///客户端套接字 char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); ///成功返回非负描述字,出错返回-1 int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length); if(conn<0) { perror("connect"); exit(1); } while(1) { memset(buffer,0,sizeof(buffer)); int len = recv(conn, buffer, sizeof(buffer),0); if(strcmp(buffer,"exit\n")==0) break; fputs(buffer, stdout); send(conn, buffer, len, 0); } close(conn); close(server_sockfd); return 0; } ``` 客户端 ``` #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #define MYPORT 8887 #define BUFFER_SIZE 1024 int main() { ///定义sockfd int sock_cli = socket(AF_INET,SOCK_STREAM, 0); ///定义sockaddr_in struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(MYPORT); ///服务器端口 servaddr.sin_addr.s_addr = inet_addr("10.0.3.15"); ///服务器ip ///连接服务器,成功返回0,错误返回-1 if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect"); exit(1); } char sendbuf[BUFFER_SIZE]; char recvbuf[BUFFER_SIZE]; while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) { send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送 if(strcmp(sendbuf,"exit\n")==0) break; recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收 fputs(recvbuf, stdout); memset(sendbuf, 0, sizeof(sendbuf)); memset(recvbuf, 0, sizeof(recvbuf)); } close(sock_cli); return 0; } ``` 代码来自博客园--旭东的博客,谢谢博主。[原博客链接](http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html#commentform "")

关于java与c的socket通信问题

服务器端是java,客户端是c,通过socket,tcp通信,客户端将一张图片传输到服务器,服务器接收完成后返回一个‘ok’字符串作为应答。运行的时候,服务器可以接收到客户端发来的图片,但是客户端无法接收到服务器的‘ok’应答。对socket了解不深,求大神指点,谢谢了~代码如下: server(java): import java.net.*; import java.io.*; public class ServerTcp { public static void main(String args[])throws Exception{ ServerSocket server = new ServerSocket(8866); byte[] inputByte = null; int length = 0; DataInputStream dis = null; FileOutputStream fos = null; PrintStream out = null; fos = new FileOutputStream(new File("/home/gsw/test/cc.jpg")); inputByte = new byte[5120]; System.out.println("等待链接..."); Socket client = server.accept(); dis = new DataInputStream(client.getInputStream()); out = new PrintStream(client.getOutputStream()); while ((length = dis.read(inputByte, 0, inputByte.length)) > 0) { System.out.println(length); fos.write(inputByte, 0, length); fos.flush(); } System.out.println("完成接收"); out.print("ok"); //服务器应答 dis.close(); out.close(); fos.close(); client.close(); server.close(); System.out.println("关闭!"); } } client(c): #include <stdio.h> #include <sys/socket.h> #include <stdlib.h> #include <sys/types.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define SER_PORT 8866 #define MAX_LEN 256 int main(int argc,char **argv) { int sd,rn; struct sockaddr_in client,server; char send_buf[MAX_LEN]; char recv_buf[MAX_LEN]; FILE *fq; int len,opt = 1; if( ( sd = socket(AF_INET,SOCK_STREAM,0)) == -1 ) { perror("socket"); exit(1); } bzero(&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(SER_PORT); server.sin_addr.s_addr = inet_addr("127.0.0.1"); setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); if( connect(sd,(struct sockaddr *)&server,sizeof(server)) < 0 ) { perror("Connect"); close(sd); exit(1); } if( ( fq = fopen("1.jpg","rb") ) == NULL ) { perror("File open"); close(sd); exit(1); } bzero(send_buf,sizeof(send_buf)); memset(send_buf, 0, MAX_LEN); while( !feof(fq) ) { len = fread(send_buf,1,MAX_LEN,fq); if( len != write(sd,send_buf,len) ) { perror("write"); break; } } memset(recv_buf, 0, MAX_LEN); printf("send all!\n"); if(read(sd,recv_buf,sizeof(recv_buf)) ==-1) //接收应答 { perror("read"); exit(1); } printf("received from server:%s\n",recv_buf); close(sd); fclose(fq); return 0; } 程序也不报错,被阻塞了 server端控制台 ![图片说明](https://img-ask.csdn.net/upload/201504/27/1430099983_23487.png) client端 ![图片说明](https://img-ask.csdn.net/upload/201504/27/1430100004_345600.png)

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

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

UDP通讯是单向还是双向

UDP编程中,为什么服务器不能向客户端发送消息呢,客户端也不能接收服务器发送的消息? 服务器代码: import java.net.*; public class Server2 { public static void main(String[] args) { try { //向客户端发送消息 byte[] b="我是服务器".getBytes(); InetAddress ia= InetAddress.getByName("localhost"); DatagramPacket dp=new DatagramPacket(b,b.length,ia,9999); DatagramSocket ds =new DatagramSocket(); ds.send(dp); //接收从客户端发送的数据 byte[] b2=new byte[1024]; DatagramPacket dp2=new DatagramPacket(b2,b2.length); DatagramSocket ds2 =new DatagramSocket(9438); ds2.receive(dp2); //打印客户端发送的数据 System.out.println(new String(b2,0,b2.length)); ds.close(); ds2.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 客户端代码: import java.net.*; public class Client2 { public static void main(String[] args) { try { //向服务器发送数据 byte b[]="我是客户端".getBytes(); InetAddress ia = InetAddress.getByName("localhost"); DatagramPacket dp=new DatagramPacket(b,b.length,ia,9438); DatagramSocket ds=new DatagramSocket(); ds.send(dp); //接收从服务器发送的消息 byte b2[]=new byte [1024]; DatagramPacket dp2=new DatagramPacket(b2,b2.length); DatagramSocket ds2=new DatagramSocket(9999); ds2.receive(dp2); //打印服务器发送的数据 System.out.println("呵呵"); System.out.println(new String(b2,0,b2.length)); ds.close(); ds2.close(); } catch (Exception e) { e.printStackTrace(); } } }

iOS UDP组播服务端收不到客户端发的数据

客户端可以收到服务器发的数据,反过来不行。我想实现双向多播,理论上是可行的吧? 多播绑定的端口是别人向自己发数据的端口吧?加入的多播组应该是向别人发送数据的地址吧? 使用GCDAsyncUdpSocket,为什么只绑定一个端口就行?不是还要绑定IP吗? 本地Socket的IP、端口与发送的目的IP、端口,有点绕晕了,请高手指教

WebSocket服务端怎么储存连接对象

WebSocket实现了客服端和服务端的双向通信,当存在大量连接时,服务端是通过什么 方式来储存连接的,hashmap,链表还是数组,还是其它什么方式?

qt tcp通讯,server端无法进入incomingConnection函数

自己写了一个类继承QTcpServer,重写里面的incomingConnection函数,但是当有新的客户端连接的时候无法进入这个函数。 头文件 ```class TcpServerManager : public QTcpServer { Q_OBJECT public: TcpServerManager(QObject *parent); ~TcpServerManager(); QList<TcpSocketManager*> mSocketList; void ReadUserInfo(); public slots: void ServerNewConnection(); void ServerReadData(); void slotclientdisconnect(qintptr descriptor); void sliotupdateserver(QString, int); private: QTcpSocket *mp_TCPSocket; QTcpServer* mp_TCPServer; std::map<string, string> mMapUserInfo; protected: virtual void incomingConnection(qintptr socketDescriptor); }; ``` cpp ``` TcpServerManager::TcpServerManager(QObject *parent) : QTcpServer(parent) { ReadUserInfo(); mp_TCPServer = new QTcpServer(); mp_TCPSocket = new QTcpSocket(); if (!mp_TCPServer->listen(QHostAddress::Any, 9988)) { QMessageBox::warning(NULL, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("服务器端监听失败!"), QMessageBox::Yes); return; } //connect(mp_TCPServer, SIGNAL(newConnection()), this, SLOT(ServerNewConnection())); } TcpServerManager::~TcpServerManager() { } void TcpServerManager::incomingConnection(qintptr socketDescriptor) { TcpSocketManager *tcpclientsocket = new TcpSocketManager(this); tcpclientsocket->setSocketDescriptor(socketDescriptor); mSocketList.append(tcpclientsocket); connect(tcpclientsocket, &TcpSocketManager::clientdisconnected, this, &TcpServerManager::slotclientdisconnect); connect(tcpclientsocket, &TcpSocketManager::updateserver, this, &TcpServerManager::sliotupdateserver); } ```

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

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

Vue + Spring Boot 项目实战(十九):Web 项目优化解决方案

快来一起探索如何打脸我们的破项目,兄弟姐妹们把害怕打在公屏上!

你连存活到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:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

CSDN:因博主近期注重写专栏文章(已超过150篇),订阅博主专栏人数在突增,近期很有可能提高专栏价格(已订阅的不受影响),提前声明,敬请理解!

CSDN:因博主近期注重写专栏文章(已超过150篇),订阅博主专栏人数在突增,近期很有可能提高专栏价格(已订阅的不受影响),提前声明,敬请理解! 目录 博客声明 大数据了解博主粉丝 博主的粉丝群体画像 粉丝群体性别比例、年龄分布 粉丝群体学历分布、职业分布、行业分布 国内、国外粉丝群体地域分布 博主的近期访问每日增量、粉丝每日增量 博客声明 因近期博主写专栏的文章越来越多,也越来越精细,逐步优化文章。因此,最近一段时间,订阅博主专栏的人数增长也非常快,并且专栏价

一个HashMap跟面试官扯了半个小时

一个HashMap能跟面试官扯上半个小时 关注 安琪拉的博客 1.回复面试领取面试资料 2.回复书籍领取技术电子书 3.回复交流领取技术电子书 前言 HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。 开场 面试官: 你先自我介绍一下吧! 安琪拉: 我是安琪拉,草丛三婊之一,最强中单(钟馗不服)!哦,不对,串场了,我是**,目...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

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

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

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

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

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

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

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

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

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

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

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

工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!

近日,有网友在某职场社交平台吐槽,自己裸辞两个月了,但是找工作却让自己的心态都要崩溃了,全部无果,不是已查看无回音,就是已查看不符合。 “工作八年,两年一跳,裸辞两个月了,之前月薪60K,最近找工作找的心态崩了!所有招聘工具都用了,全部无果,不是已查看无回音,就是已查看不符合。进头条,滴滴之类的大厂很难吗???!!!投简历投的开始怀疑人生了!希望 可以收到大厂offer” 先来看看网...

大牛都会用的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,别再问密...

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的生命...

用了这个 IDE 插件,5分钟解决前后端联调!

点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!作者 |李海庆我是一个 Web 开发前端工程师,受到疫情影响,今天是我在家办公的第78天。开发了两周,...

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

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

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

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

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

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

Java14 新特性解读

Java14 已于 2020 年 3 月 17 号发布,官方特性解读在这里:https://openjdk.java.net/projects/jdk/14/以下是个人对于特性的中文式...

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

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

爬虫(101)爬点重口味的

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

工作两年简历写成这样,谁要你呀!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获! 一、前言 最近有伙伴问小傅哥,我的简历怎么投递了都没有反应,心里慌的很呀。 工作两年了目前的公司没有什么大项目,整天的维护别人的代码,有坑也不让重构,都烦死了。荒废我一身技能无处施展,投递的简历也没人看。我是不动物园里的猩猩,狒狒了! 我要加班,我要996,我要疯狂编码,求给我个机会… ...

正点原子:STM32F103(战舰)、STM32F407(探索者)、STM32F103(MINI)原理图和PCB

正点原子:STM32F103(战舰)、STM32F407(探索者)、STM32F103(MINI)原理图和PCB

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

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

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

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

大专学历就职会不会有瓶颈?

二哥,看了你的那篇外包程序员的文章,想问问您,大专学历以后就职会不会有瓶颈,升职难什么的? 以上是读者阿莫私信我的一个问题,我觉得很有必要认真地谈一谈。单从这个问句上,我现在就可以给出一个无比肯定的回答:“谁要说没有瓶颈,那绝对是骗人的。” 先说一点。这句提问很简短,但有一个瑕疵,眼睛雪亮的读者一眼就能看得出来——先用了“你”,再用了“您”。不是我在故意鸡蛋里挑骨头,我没那么闲,用“您”肯定...

又一起程序员被抓事件

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

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

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

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

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

相关热词 c# cad插入影像 c#设计思想 c#正则表达式 转换 c#form复制 c#写web c# 柱形图 c# wcf 服务库 c#应用程序管理器 c#数组如何赋值给数组 c#序列化应用目的博客园
立即提问