socket 帮忙改错 客户端关闭的时候不要让程序崩

我之前没说清楚 怪我...
图片说明
图片说明
图片说明

我想让客户端给服务器发送CLOSE,然后服务器关闭和这个客户端的连接。 但是只要一输入CLOSE 客户端那边都运行不了 更不要说发送给服务器 感觉是一个很简单的问题 但是一直调不通

只要有一个客户端退出 剩下的程序整个崩 有没有办法加几条语句让剩下的客户端和服务器正常运行

服务器



@RestController
@RequestMapping("/Socket")
@Api("服务器")
@Service
public class SocketService {
    @Autowired
    SetDao setDao;

//    SendData send=new SendData();
    static Scanner input = new Scanner(System.in);
    static List<Socket> list = new ArrayList();
    static Integer count =0;
    public static final Integer PORT=8888;

    @RequestMapping(value = "/photo", method = RequestMethod.POST)
    public String photocontrol(@RequestBody Integer e) throws IOException{
        SendData send=new SendData();
        if(e%2==0)
            send.msg="OPENPHOTO";
        else if(e%2==1)
            send.msg="CLOSEPHOTO";
        return "SUCCESS_PHOTO";
    }

    @RequestMapping(value = "/create", method = RequestMethod.GET)
    public  void createServerSocket(){
//    {
        try {
            //创建服务器
            ServerSocket server = new ServerSocket(PORT);
            System.out.println("***服务器即将启动***");
            while (true) {
                Socket s = server.accept();
                list.add(s);
                System.out.println("当前客户端的数量为:" + (count + 1));
                //发信息(有多个客户端)
                if (count == 0) {
                    new SendData().start();
                }
                //收信息
                new GetData(new DataInputStream(list.get(count).getInputStream())).start();
                count++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
//    }
    }

    //给客户端发送信息
    public static class SendData extends Thread {
        private DataOutputStream dOutput;
        public static String msg;
        @Override
        public void run() {
            while (true) {
                try {
//                  String msg =input.next();
                    if (msg!=null) {
                        for (Socket socket : list) {
                            dOutput = new DataOutputStream(socket.getOutputStream());
                            dOutput.writeUTF(msg);
                        }
                        msg=null;
                    }
                } catch (IOException e) {
//                    break;
                    e.printStackTrace();
                }
            }
        }
    }

    //读取客户端发来的信息
    public static class GetData extends Thread {
        private DataInputStream dInput;
        public GetData(DataInputStream _dInput) {
            dInput=_dInput;
        }
        @Override
        public void run() {
            while (true) {
                try {
                    String msg = dInput.readUTF();
                    if (msg != null) {
                        System.out.println("客户端:"+ msg);
//                       if(msg.equals("CLOSE")) {
//                            dInput.close();
//                            list.remove(count);
//                            count--;
//                            System.out.println("当前客户端的数量为:"+count);
//                        }
//                        if(socket.getKeepAlive()==false){
//                            ((Reader)in).close();
//                            temp="客户端"+socket.getPort()+"退出";
//                            ss.appendMessage(temp);
//                            socket.close();
//                            this.stop();

                    }
                } catch (IOException e) {
                    try {
                        dInput.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    break;
                }
            }
        }
    }

}

客户端



@RestController
@RequestMapping("/TestSocket")
@Api("客户端")
@Service
public class TestSocketService {
    static Scanner input = new Scanner(System.in);
    public static final Integer PORT=8888;

    @RequestMapping(value = "/create", method = RequestMethod.GET)
    public void createSocket() throws IOException {
        Socket socket = new Socket("localhost",PORT);
        System.out.println("已连接服务器");

        new GetData(new DataInputStream(socket.getInputStream())).start();
        new SendData(new DataOutputStream(socket.getOutputStream())).start();
    }

    //读取服务器发来的信息
    public static class GetData extends Thread {
        private DataInputStream dInput;
        public GetData(DataInputStream _dInput) {
            dInput = _dInput;
        }
        @Override
        public void run() {
            while (true) {
                try {
                    String msg = dInput.readUTF();
                    if (msg != null) {
                        System.out.println("服务器:" + msg);

                    }
                } catch (IOException e) {
                    try {
                        dInput.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    break;
                }
            }
        }
    }

    //给服务器发送信息
    public static class SendData extends Thread {
        private DataOutputStream dOutput;
        public SendData(DataOutputStream _dOutput) {
            dOutput = _dOutput;
        }
        @Override
        public void run() {
            while (true) {
                try {
                    System.out.println("给服务器发消息:");
                    String msg =input.next();
                    if (msg != null) {
                        dOutput.writeUTF(msg);
                    }
                } catch (IOException e) {
                    break;
//                    e.printStackTrace();
                }
            }
        }
    }
}
0

5个回答

上面给你回答了一次,没想到还是没解决你的问题哈,看你补充的提问,我又自己测试了下,找到了问题的原因。希望你能采纳。

首先说下你这个错误的原因:多个线程同时操作一个Scanner(看下面代码,你定义的是静态的),而这个Scanner又是个非线程安全的类。这就导致了多线程抢占同一资源,最终引起了不可预测的异常。
static Scanner input = new Scanner(System.in);

一个Scanner只能对应一个客户端,所以如果你要测试多个客户端的话,你需要启动多个进程去测试,而不是在一个进程里启动多个线程。
另外,在eclipse里的话,如果你启动多次main方法,他是有多个输入窗口的,每个scanner对应一个窗口。

0

重新运行一次,再读取一下指令

0
 for (Socket socket : list) {
 ty{
                            dOutput = new DataOutputStream(socket.getOutputStream());
                            dOutput.writeUTF(msg);
                                                        }catch(Throwable ex){
                                                        }
                        }
0
danielinbiti
danielinbiti 回复Mtone_007: 异常就remove掉,count--
一年多之前 回复
Mtone_007
Mtone_007 能帮忙试一下这几条语句吗?
一年多之前 回复
Mtone_007
Mtone_007 我想的是能不能收到客户端发过来的CLOSE 之后 让count--,然后让这个客户端退出list 试了一下 没有实现
一年多之前 回复

具体不知道你在哪里崩了哈,解决问题的思路就是在你崩掉的地方加入逻辑判断来避免异常的抛出或者try/catch来捕获异常
在你遍历客户端list的时候可以加入下面的判断:
1.socket.isClosed();//判断客户端是否已经关闭。
2.socket.isOutputShutdown();//判断客户端的输出流是否已经关闭。
当然,socket对象还提供了很多判断方法,通过这些判断你就可以知道客户端是否正常,如果不正常,你就count--,如果正常,那就继续下面的业务处理。

另外,客户端与服务端如何知道对方是否正常运行的一个办法就是:心跳通讯,就是说客户端与服务端每隔几秒互相发送信息来确认对方是否正常,如果对方进行回复,判断为正常;如果不回复,那么就判断对方掉线。

0

catch(IOException ...

你把IOException全部改成Exception试试

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
socket 帮忙改错 客户端关闭的时候不要让程序崩
我之前没说清楚 怪我...rn![图片说明](https://img-ask.csdn.net/upload/201711/27/1511777190_944800.png)rn![图片说明](https://img-ask.csdn.net/upload/201711/27/1511777198_922355.png)rn![图片说明](https://img-ask.csdn.net/upload/201711/27/1511777207_441247.png)rnrn我想让客户端给服务器发送CLOSE,然后服务器关闭和这个客户端的连接。 但是只要一输入CLOSE 客户端那边都运行不了 更不要说发送给服务器 感觉是一个很简单的问题 但是一直调不通rnrnrnrnrnrnrnrn只要有一个客户端退出 剩下的程序整个崩 有没有办法加几条语句让剩下的客户端和服务器正常运行rnrn服务器rnrn```rn rnrn@RestControllerrn@RequestMapping("/Socket")rn@Api("服务器")rn@Servicernpublic class SocketService rn @Autowiredrn SetDao setDao;rnrn// SendData send=new SendData();rn static Scanner input = new Scanner(System.in);rn static List list = new ArrayList();rn static Integer count =0;rn public static final Integer PORT=8888;rnrn @RequestMapping(value = "/photo", method = RequestMethod.POST)rn public String photocontrol(@RequestBody Integer e) throws IOExceptionrn SendData send=new SendData();rn if(e%2==0)rn send.msg="OPENPHOTO";rn else if(e%2==1)rn send.msg="CLOSEPHOTO";rn return "SUCCESS_PHOTO";rn rnrn @RequestMapping(value = "/create", method = RequestMethod.GET)rn public void createServerSocket()rn// rn try rn //创建服务器rn ServerSocket server = new ServerSocket(PORT);rn System.out.println("***服务器即将启动***");rn while (true) rn Socket s = server.accept();rn list.add(s);rn System.out.println("当前客户端的数量为:" + (count + 1));rn //发信息(有多个客户端)rn if (count == 0) rn new SendData().start();rn rn //收信息rn new GetData(new DataInputStream(list.get(count).getInputStream())).start();rn count++;rn rn catch (IOException e) rn e.printStackTrace();rn rn// rn rnrn //给客户端发送信息rn public static class SendData extends Thread rn private DataOutputStream dOutput;rn public static String msg;rn @Overridern public void run() rn while (true) rn try rn// String msg =input.next();rn if (msg!=null) rn for (Socket socket : list) rn dOutput = new DataOutputStream(socket.getOutputStream());rn dOutput.writeUTF(msg);rn rn msg=null;rn rn catch (IOException e) rn// break;rn e.printStackTrace();rn rn rn rn rnrn //读取客户端发来的信息rn public static class GetData extends Thread rn private DataInputStream dInput;rn public GetData(DataInputStream _dInput) rn dInput=_dInput;rn rn @Overridern public void run() rn while (true) rn try rn String msg = dInput.readUTF();rn if (msg != null) rn System.out.println("客户端:"+ msg);rn// if(msg.equals("CLOSE")) rn// dInput.close();rn// list.remove(count);rn// count--;rn// System.out.println("当前客户端的数量为:"+count);rn// rn// if(socket.getKeepAlive()==false)rn// ((Reader)in).close();rn// temp="客户端"+socket.getPort()+"退出";rn// ss.appendMessage(temp);rn// socket.close();rn// this.stop();rnrn rn catch (IOException e) rn try rn dInput.close();rn catch (IOException e1) rn e1.printStackTrace();rn rn break;rn rn rn rn rnrnrn```rnrnrnrnrn客户端rnrnrn```rn rnrn@RestControllerrn@RequestMapping("/TestSocket")rn@Api("客户端")rn@Servicernpublic class TestSocketService rn static Scanner input = new Scanner(System.in);rn public static final Integer PORT=8888;rnrn @RequestMapping(value = "/create", method = RequestMethod.GET)rn public void createSocket() throws IOException rn Socket socket = new Socket("localhost",PORT);rn System.out.println("已连接服务器");rnrn new GetData(new DataInputStream(socket.getInputStream())).start();rn new SendData(new DataOutputStream(socket.getOutputStream())).start();rn rnrn //读取服务器发来的信息rn public static class GetData extends Thread rn private DataInputStream dInput;rn public GetData(DataInputStream _dInput) rn dInput = _dInput;rn rn @Overridern public void run() rn while (true) rn try rn String msg = dInput.readUTF();rn if (msg != null) rn System.out.println("服务器:" + msg);rn rn rn catch (IOException e) rn try rn dInput.close();rn catch (IOException e1) rn e1.printStackTrace();rn rn break;rn rn rn rn rnrn //给服务器发送信息rn public static class SendData extends Thread rn private DataOutputStream dOutput;rn public SendData(DataOutputStream _dOutput) rn dOutput = _dOutput;rn rn @Overridern public void run() rn while (true) rn try rn System.out.println("给服务器发消息:");rn String msg =input.next();rn if (msg != null) rn dOutput.writeUTF(msg);rn rn catch (IOException e) rn break;rn// e.printStackTrace();rn rn rn rn rnrn```rnrn
客户端关闭,服务器端SocketException异常解决方案
关于客户端一关闭,服务器就提示SocketException:connection reset的实际解决方案。
linux C语言 SOCKET 服务器断开导致客户端SEND崩溃问题解决办法
原文来自:http://blog.chinaunix.net/uid-24830931-id-3786670.html 一、现象描述 在利用librdkafka同kafka broker通信过程中,当kafka broker意外退出时(如kill -9),librdkafka接口的sendmsg接口报出了“Program received signal SIGPIPE, Broken
socket遇到错误直接退出原因和解决办法
原因:socket遇到错误时,默认将错误信息交给系统处理,而系统的处理办法一般是直接关闭整个应用,所以就会出现遇到错误程序直接关闭,比如客户端关闭,服务器还在给客户端发信息,就会出现发送失败,导致服务器也直接关闭的现象解决办法:把错误交给自己定义的函数处理 先定义一个函数void Perr(int signum) { if(signum==SIGPIPE) { fpri
Java网络编程_半关闭的Socket
在IO流中,如果要表示输出已经结束,可以通过关闭输出流来实现。但在不能通过关闭输出流来表示输出已经结束,因为当关闭输出流时,该输出流对应的Socket也将随之关闭,这样导致程序无法再从该Socket的输入流读取数据。在这种情况下,Socket提供了两个半关闭的方法,只关闭Socket的输入流或者输出流,用以表示输出数据已经发送完成。
LINUX C语言 SOCKET 服务器断开导致客户端SEND崩溃问题解决办法
<br />#include <signal.h><br />在客户端建立好连接的时候  WHILE循环前面 增加signal( SIGPIPE, SIG_IGN );<br />管道破裂导致程序崩溃。<br />屏蔽一下 SIGPIPE 信号就好了。
socket的连接(三次握手)和关闭过程(四次握手)与服务器各种关闭对客户端的不同影响
之前对socket的TIME_WAIT看的很迷糊,今天在这里总结下,以备今后查看: socket的连接(三次握手)和关闭过程(四次握手): socket状态变迁图: 服务器和客户端各种状态总结: CLOSED:没有使用该套接字 LISTEND:套接字正在监听连接 SYN_SENT:套接字正在试图主动建立连接 SYN_RECEIVED:正在处于建立连接的初始同步
linux socket解决客户端socket断开后, 服务器端进程退出的问题
最近做一个socket服务器时,发现如果强行关闭客户终端,server会接收到一些奇怪的信息然后非正常退出。 原因:强行关闭客户终端后,client进程交付给初始进程。等初始进程查询到client后将它杀掉。但是在杀掉之前,由于关掉了终端(主要是关掉了输入缓冲区),导致本来阻塞中的cin或scanf返回EOF,程序得以继续执行send和recv操作。服务器发现client有消息传入,但是在尝试回...
怎么让客户端关闭后服务器不会报错?
标题:怎么让客户端关闭后服务器不会报错? 解释:当你客户端(clientSocket)连接上服务器(serverSocket)之后,服务器会创建一个clientSocket,这个clientSocket和你自己的客户端进行交互,当你关闭客户端时,在服务器中的clientSocket还在一直就收客户端发送的消息,所以会报错,因此我们在就收消息这里写一个try{} catch{}语句就可以了: ...
linux下关于服务端断开后客户端自动退出的问题
问题描述:谢了一个客户端和服务端,正常运行后,客户端不断向服务端发送消息,当服务端跟客户端断开连接或者把服务端关闭后,客户端会再发送一次消息后自动退出。而有些情况我们不希望这种情况发生。 原因分析:简单的说就是服务端关闭后,客户端给服务端发送了一条信息,服务端已经关闭,则客户端收到信息,产生SIGPIPE信号,这个信号告诉进程关闭,我们要做的就是捕获这个信号让它按自己的意愿进行 解决方法:
TCP socket异常关闭总结
游戏测试过程中发现某些socket错误经常出现,以下是测试游戏服务器时通常考虑的case. 服务器端: 1. Case:客户端程序正常运行的情况下,拔掉网线,杀掉客户端程序 目的:模拟客户端死机、系统突然重启、网线松动或网络不通等情况 结论:这种情况下服务器程序没有检测到任何异常,并最后等待“超时”才断开TCP连接 2. Case:客户端程序发送很多数据包后正常关闭Socket并ex
Socket 客户端不显示的关闭连接服务端read一直阻塞
初次学习socket,写了下面例子 public class SocketServer { public static void main(String[] args) { int port = 8089; ServerSocket server = null; InputStream in = null; Socket socket = null; t...
Linux下客户端主动Close,服务端阻塞的read函数不会马上返回
今天在做一个socket通信的时侯,发现close后,阻塞的read函数并没有马上返回,导致后面的时序出现问题,具体情况如下: 服务端与客户端正常建立通信,都采用阻塞模式。当客户端close后,服务端阻塞的read函数并没有马上返回,并且此时在服务端还可以向此连接写入数据,并成功,然后客户端又成功读到数据,接着服务端阻塞的read函数返回<0,表示断开连接。 以上客户端主动Close,服务端阻塞
Socket在终端退出后,程序如何继续运行
描述:设置程序进入后台作为守护进程运行。说明:长时间运行的服务器端程序必须启用此项。如果不启用守护进程,当ssh终端退出后,程序将被终止运行。启用守护进程后,标准输入和输出会被重定向到 log_file,如果 log_file未设置,则所有输出会被丢弃。示例:'daemonize' =&amp;gt; true如果设置为true,ssh终端退出后,程序将继续运行。...
输出流关闭造成的Socket关闭
今天写安卓向服务器发送图片,发送完毕后,调用out.close(),然后接受a=in.read(data)时,安卓6.0报错。 错误代码:socket recvfrom failed: EBADF (Bad file descriptor) 首先尝试:将out.close()移动至代码块最后,但发现服务器端的in.read(data)不会返回-1,造成死循环。 经过查询得知,Java的sock
当接收端的内核缓冲区中的数据没有全部交给应用程序时, 如果接收端关闭socket(比如调用close或者进程挂掉),就会回以RST报文
在通常情况下,  调用close的时候, 会发FIN包, 但是, 如果接收端没有用recv把内核缓冲区的数据取完, 却执行了关闭socket的操作(比如调用close或者进程挂掉), 那么这就是异常的情况, 此时接收端会回RST报文。         我们来看看, 服务端程序为: #include #include #include #include #include #includ
linux socket tcp server 解决客户端socket断开后, 服务器端进程退出的问题
当服务器监听并接受一个客户端链接的时候, 可以不断向客户端发送数据, 这时如果客户端断开socket链接, 服务器继续向一个关闭的socket 发送数据(send, write)的时候, 系统会默认对服务器进程发送一个SIGPIPE信号, 这个信号的默认动作就是终止当前服务器进程. 所以为了解决客户端断开后导致服务器进程结束的问题, 使用如下方法忽略SIGPIPE信号. struct siga
TCP 一端关闭,另一端调用send进程退出了
http://www.lxway.com/188949016.htm 在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试.  但是服务器总是莫名退出,没有core文件. 最后问题确定为, 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程. 具体的分析可以结合TCP的"四次握手"关闭. TCP是全
服务器关了已经连接的客户端socket…
服务端关闭已连接客户端,客户端接着发数据产生问题,    1. 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。     根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client
linux下,socket端口不能释放
我的工作流中有一个即时消息服务器,布署在tomcat下。在linux系统环境下启动tomcat后,服务器跟着启动,指定socket端口处于监听状态,但在tomcat停止时,socket不能释放。同样的应用,在windows环境下就是正常的。a)在linux下启动消息服务器时,用“/tomcat/bin/catalina.sh run”命令。如果当前在bin目录下,执行“./catalina.sh ...
socket异步连接后,关闭服务端后,客户端再发送信息出现错误
下面的代码是从网找到的,能正常运行没有问题,我有一些问题: 1、TcpListener server 这些变量都是局部的,为什么还能正常工作。 2、我如何停止监听服务。 private void AcceptCallback(IAsyncResult ar)          ...{              TcpListener server = (TcpListener)ar.Asyn
客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出
问题描述: 客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出。 原因分析: 在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。 这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。 解决方法可以有两...
Socket系列(二)基于Socket网络通讯的服务端和客户端程序设计
        Socket系列一主要介绍了Socket的基础知识、工作原理以及与传统的http协议的区别。这部分内容的目的是为本文做铺垫。本文将介绍基于Socket网络通讯的服务器端和客户端的程序设计。 一、服务器端的程序设计         关于Socket服务器端的内容,在这里只提供设计思路,以及相应的测试界面,不提供具体的代码。系列一中有提到,Socket服务器端的程序编写流程大概有创...
Python下UDP的Socket编程:服务器端因客户端的非正常退出而报错?
服务器端代码 import socket import threading import logging import datetime logging.basicConfig(format='%(message)s', level=logging.INFO) class ChatUdpServer: def __init__(self, ip='127.0.0.1', por...
c# 关闭socket的标准方法
c#关闭socket时,单独使用socket.close()通常会造成资源提前被释放,应该在关闭socket之前,先使用shutdown进行接受或者发送的禁用,再使用socket进行释放。
关于客户端断开连接后服务器抛出异常Connection reset
学习了socket  ,在做一个类似qq的c/s结构的聊天软件。发现了一个问题 就是在客户端与服务器通信后,服务器为客户端开启一个线程,使用while(true)循环时刻监听是否有通信。 在界面开启时没有任何异常,可是当界面关闭 就一直抛出异常了。 开启线程代码如下: 异常内容如下: java.net.SocketException: Connection reset at
判断Socket 服务端是否已关闭
最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。 首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。 然后想到是否可以通过OutputStre...
Python中Socket的Close方法假关闭Socket连接的问题
最近用python的Socket写了一个传输通讯测试工具,但是发现在Server端调用close方法后,如果循环没有break的话,此连接还可以继续用来发送和接收数据。所以,我就觉得很是奇怪,难道close方法关闭的连接没有起作用吗?经过试验后,确实如此,以下是我的事例代码, Server端代码:           from socket import * import threading
守护进程的创建,服务器关闭不影响客户端的连接
原理: 当关闭服务器时,客户端还能正常运行。 守护进程的特点? (1)和终端无关。 (2)和输入(键盘)输出(屏幕)无关。 (3)和具体的文件路径无关,实际上它的位置位于根目录。 如何创建守护进程? (1)摆脱终端 创建一个新的子进程,然后将父亲进程杀死。 通过setsid,创建新的会话,并成为会话的首领。(另立山头) 目的是为了避免自己又再开启一个终端,还要再创建一个
Qt实现socket服务端和客户端
QT5实现socket客户端服务端 QtTcpThreadServer-master 来自http://www.dushibaiyu.com/2013/12/qtcpserver%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AE%9E%E7%8E%B0.html 使用了多线程进行客户端的连接 myTcpClient 使用信号和槽,实现发送,发送部分可以使用16进制,方便测试
c# winform socket关闭时需要关闭的东西,停止服务,停止监听,停止socket
1,线程需要关闭 [code=&quot;c#&quot;]Thread TempThread; //开启接收线程 TempThread = new Thread(new ThreadStart(this.StartReceive)); TempThread.IsBackground = true;//设置为后台线程 TempThread.Start(); TempThread.Abort();//关...
解决socket关闭后read、recvfrom 等函数依旧无法退出阻塞
最近项目遇到一个问题,程序退出的时候资源没有正常释放。经过调试发现,原来是网络线程一直阻塞,导致一些必要的资源没有被释放,写了几个简单的测试程序调试了一下才明白,原来在Linux下直接close socket的文件描述符,并不会使程序中调用的一些阻塞式的socket函数(比如 read、recvfrom 等)退出阻塞,从而导致无法正常释放资源。简化示例如下。    下面是一个简化的UDP服务程序,...
unity3D Socket连接C#服务器出现unity3D编辑器再次启动连接 unity3D编辑器立即卡死
unity3D Socket与C#服务器第一次连接时通讯正常,客服端段关闭后,unity3D编辑器再次启动连接 unity3D编辑器立即卡死,但是C#服务器与AS3Socket客服端多次连接就正常
socket编程中send函数引发的线程退出
在多线程编程中其中使用一个线程来accept要连接的客户端。同时在接受client的请求之后新建一个线程来进行具体的操作。其操作包括向client端发送一定字节的数据,使用send()函数来进行操作。如果在发送过程中出现任何一个client端的断线,则整个程序都会退出。         ssize_t send(int sockfd, const void *buff, size_t nbyte
【Java】NIO 客户端关闭
nio的客户端如果关闭了,服务端还是会收到该channel的读事件,但是数目为0,而且会读到-1,其实-1在网络io中就是socket关闭的含义,在文件时末尾的含义,所以为了避免客户端关闭服务端一直收到读事件,必须检测上一次的读是不是-1,如果是-1,就关闭这个channel。 else if(key.isReadable()){ ByteBuffer buffer = ByteBu
Socket异常 客户端异常
java.net.ConnectException: Connection refused: connect。 该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端p
用网络编程中socket编写服务器与客户端程序(TCP)
  服务器程序: 1. 创建一个socket,用函数socket() 2. 绑定IP地址、端口等信息到socket上,用函数bind() 3.设置允许的最大连接数,用函数listen() 4.接收客户端上来的连接,用函数accept() 5.收发数据,用函数send()和recv(),或者read()和write() 6.关闭网络连接 #include&amp;lt;stdio.h&amp;gt...
java socket 以及 流 关闭的问题
首先我一下几个提出问题:稍后再做出解答。     问题一:A如果仅仅将输入流关闭(inA.close()),对A与B之间的连接是否有影响?                   A能否再次获得输入流(inA = socketA.getInputStream())?                   是否A还可以发送数据,因为其输出流没有关闭?      问题二:A如果仅仅将
websocket + html (聊天室) 补上次遗留的一个 强制关闭报error错误
由于建立连接之后,客户端和服务端之前还从在会话,数据传输等一些交互,当我们强行断开连接之后,服务器将会失去和客户端之间的连接,会出现一个(1001 端点丢失,如服务器宕机或浏览器切换其他页面)错误。 正常关闭的话给我返回一个(1000 正常关闭)的消息。 想要解决这个问题我们至于要在页面JS加一个当浏览器关闭或者浏览器刷新时执行一个页面关闭事件,在事件中调用websocket的close方法就行
epoll LT模式 如何检测客户端关闭
TCP的recv返回0就知道对方关闭了,或者注册EPOLLERR,出现EPOLLERR的时候关闭,另外在recv,send返回-1的时候如果错误不是EWOULDBLOCK或者EINTR,那么都主动关闭它。
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java 改错学习法 java学习socket