socket 服务端 长连接问题

问题描述

各位大神,我问个问题:我使用Socket写了一个服务器,别人访问我的时候,他程序启动之后,发送数据可以成功返回,然后再发送就失败,再次发送又成功了,以此循环下去,就是从第二次开始,每次发送,第一次是打开连接,第二次才是发送数据。publicclassEchoThreadextendsThread{protectedPrintStreamout;protectedStringmessage;protectedSocketclientSocket;publicEchoThread(SocketclientSocket){super();try{//接受数据,但不允许有中文,因为会乱码DataInputStreamin=newDataInputStream(clientSocket.getInputStream());byte[]buffer=newbyte[10000];//缓冲区的大小in.read(buffer);//处理接收到的报文,转换成字符串/***C++传递过来的中文字,需要转化一下。C++默认使用GBK。*GB2312是GBK的子集,只有简体中文。因为数据库用GB2312,所以这里直接转为GB2312**/message=newString(buffer,"GB2312").trim();this.clientSocket=clientSocket;//获得输出输出流out=newPrintStream(clientSocket.getOutputStream());}catch(IOExceptionex){Logger.getLogger(EchoServerThread.class.getName()).log(Level.SEVERE,null,ex);}finally{try{if(clientSocket!=null)clientSocket.close();}catch(IOExceptionex1){Logger.getLogger(EchoServerThread.class.getName()).log(Level.SEVERE,null,ex1);}}}publicvoidrun(){try{/***这里需要使用底层的byte方法来传递。因为即使直接写字符串,到底层还是调用了传递byte的方法。*这里涉及到编码问题。C++默认使用GBK,而GB2312是GBK的子集。*/byte[]responseBuffer=newClientRequestHandler(message).response().getBytes("GB2312");out.write(responseBuffer,0,responseBuffer.length);//Stringtest=newClientRequestHandler(message).response();//out.print(test);//直接UTF8输出,最终底层每个中文用3个字节传输//out.print(new//String(test.getBytes(),"GBK"));//转GBK失败,实际每个中文字用了4到5个字节传递//out.print(new//String(test.getBytes("GBK"),"GBK"));//转GBK,但底层还是要拆成字节数组,当然最终还是跟UTF8一样//sleep(1000);}catch(Exceptionex){Logger.getLogger(EchoThread.class.getName()).log(Level.SEVERE,null,ex);}try{clientSocket.close();}catch(IOExceptionex){Logger.getLogger(EchoThread.class.getName()).log(Level.SEVERE,null,ex);}}publicStringgetMessage(){returnmessage;}/***获取输出流**@return*/publicPrintStreamgetOutputStream(){returnout;}}

publicclassEchoServerThread{//服务端侦听的SocketServerSocketserverSkt=null;//构造方法publicEchoServerThread(intport){System.out.println("服务器代理正在监听,端口:"+port);try{//创建监听socketserverSkt=newServerSocket(port);}catch(IOExceptionex){Logger.getLogger(EchoServerThread.class.getName()).log(Level.SEVERE,null,ex);}while(true){try{//接收连接请求SocketclientSocket=serverSkt.accept();EchoThreadet=newEchoThread(clientSocket);//et.setDaemon(true);et.start();}catch(IOExceptione){System.out.println("无法接受当前客户连接请求!");break;}}}}

和这个问题是一模一样的:http://bbs.csdn.net/topics/330162464

解决方案

解决方案二:
你应该在服务端的处理线程中,通过while(true)去接收消息,你直接在线程的构造函数中接收了消息(实际上这时候还是在主线程运行的),并且立即将socket关闭了,所以你这里开启线程一点意义都没有。socket都关闭了,下次再发当然就不行了。至于你说的通一次断一次,依次循环,那应该是你的客户端对断了之后做了处理,就是接着下一次再重新连接。关键原因就是你的服务端收了一条消息之后就立即关闭了。
解决方案三:
楼上说的对,具体代码(示意代码)可能是这样:while(running){try{Socketsocket=socketServer.accept();BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream(),"UTF-8"));Stringcmd=reader.readLine();CmdCentercc=newCmdCenter(socket,reader,cmd);cc.setDaemon(false);cc.start();}catch(Exceptione){logger.error(e.getMessage());}}

时间: 2024-09-14 05:52:39

socket 服务端 长连接问题的相关文章

java ocket 反向-java Socket服务端反向查数据

问题描述 java Socket服务端反向查数据 需求是 两个java web项目,用socket实现数据即时查询 client向server注册,并保持连接 server向client发送请求,client返回数据. 我现在不知道怎么用ServerSocket向Socket对象发送请求,并且能得到回复. 帮我考虑一下,多谢. 解决方案 http://bbs.51cto.com/thread-1084435-1.html 一个简单的Demo 解决方案二: 看一下例子就行了http://blog.

java-JAVA Socket服务端 的到socket的连接数

问题描述 JAVA Socket服务端 的到socket的连接数 RT:怎么获取 多少个客户端连接我的服务端,求大神指教!!! 解决方案 可以用一个变量计数,没有一个客户端连接就加1. 解决方案二: 应该是服务端在接到连接的时候用一个链表把链接存储起来,然后遍历链表得到数量. 解决方案三: 创建一个连接就存到hash表里,断开连接就从hash表里删除,获取hash表的大小就是连接数 解决方案四: 做一个计数器,增加连接+1,断开连接-1 解决方案五: java Socket服务端3.java s

多个socket服务端,一个socket客户端在调用其中一个不通时,如何有选择的调用其它几个

问题描述 socket服务端:server1,server2,server3,server4socket客户端:client1,client2,client3,client41.client1先调server1不通,进而试着调用server2,server2不通就调server3,server3不通就调用server42.client2先调server2不通,进而试着调用server1,server1不通就调server3,server3不通就调用server43.client3先调server

socket服务端向客户端发送字节数组消息时客户端无法接收问题

问题描述 socket服务端向客户端发送字节数组消息时客户端无法接收问题

scoket tcp ip 报文-Java 的 Socket服务端客户端以tcp/ip协议发送接收报文

问题描述 Java 的 Socket服务端客户端以tcp/ip协议发送接收报文 代码谁有模板,比如给你一个login报文,logout报文!!急急急!!! 解决方案 Android Socket 编程(WIFI 和 ADB) 有了发送数据的功能,再发送文件还需要分包等协议. 解决方案二: 这个不知道是不是你要的答案, 解决方案三: http://blog.csdn.net/u013301192/article/details/46336719 解决方案四: 网页上的1楼回复应该对你有用,祝你好运

extjs4-使用Ext.form.action.Action ,断开与服务端的连接,再提交,提示框无法关闭

问题描述 使用Ext.form.action.Action ,断开与服务端的连接,再提交,提示框无法关闭 使用Ext.form.action.Action 来提交数据,提交前断开与服务端的连接,再提交.waitMessage的信息一直显示,该怎么关闭啊 解决方案 配置timeout 和failure,超时后触发failure事件,隐藏起来就行了~ timeout单位为妙..

Android Socket服务端与客户端用字符串的方式互相传递图片的方法_Android

发送图片: 首先找到具体传递的图片: <span style="font-family: comic sans ms,sans-serif; font-size: 16px;">private Bitmap getimage(String srcPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); // 开始读入图片,此时把options.inJustDecodeBounds 设回true了

请教SOCKET 服务端代码

问题描述 //监听函数publicvoidListen(){//初始化SOCKET实例newsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//初始化终结点实例localEP=newIPEndPoint(IPAddress.Any,setPort);try{//绑定newsock.Bind(localEP);//监听newsock.Listen(10);//用于设置按钮状态m_Listen

java socket 服务端:javascript 的Socket 服务端编程。

这里的Socket编程不是指使用XmlHttpRequest对象, 而是真正的创建一个Socket实现收发数据. 使用Javascript调用Java的NIO接口实现的Socket编程.实现一个简单的EchoServer,创建文件 :EchoServer.jsvar socket = __import__('Socket', null, {}) //导入Socket library..var server = new socket.SocketServer('127.0.0.1', 8000)