socket长连接,

原创 2011年01月19日 10:10:00

我想建立socket长连接,建立一个连接可连续发送多次数据。现在遇到的问题是,服务端程序在监听时无法判断客户端传送数据是否完成,如果我在客户端使用socket.shutdownOutput();那么我不能用一个连接连续发送2次数据。如果不使用,这服务端一直在监听,不能进行数据处理。请问我该怎么实现?
贴出部分程序:
客户端:public class SocketClient {
private Socket socket = null;

public void connect() {
try {
if (socket == null) {
socket = new Socket();
socket.setSoTimeout(10000);
socket.setReceiveBufferSize(2048);
socket.setSendBufferSize(2048);
socket.connect(new InetSocketAddress("127.0.0.1", 8081),
10000);
socket.setKeepAlive(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}

public void send(byte[] s) {
try {
InputStream is = new
BufferedInputStream(socket.getInputStream());
OutputStream os = new BufferedOutputStream(socket.getOutputStream());
PrintWriter pw = new PrintWriter(os);
byte[] buf = new byte[1000];
os.write(s);
os.flush();
socket.shutdownOutput();//关键在这个地方,关闭的话无法连续发送,不关闭服务端无法监听客户端是否发送数据结束

} catch (Exception e) {e.printStackTrace();
}finally{}
}

服务端:public class ServerThread extends Thread {
private Socket socket = null;
private int clientNum = 0;

public ServerThread(Socket socket, int clientNum) {
this.socket = socket;
this.clientNum = clientNum + 1;
}
  
public void run() {
try {
BufferedReader bfr = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
OutputStream os = socket.getOutputStream();
String reads = read(socket.getInputStream());
System.out.println(reads);
} catch (Exception e) {
e.printStackTrace();
}
}

private String read(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
while(true) {
int len = is.read(buf, 0, buf.length);
if(len < 0) { break; }
baos.write(buf, 0, len);
}
return baos.toString();
//return baos.toByteArray();
}


import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
private static int clientNum = 0;

public static void start() {
try {
ServerSocket server = new ServerSocket(8081);
 
boolean listener = true;
while (listener) {
new ServerThread(server.accept(), clientNum).start();
clientNum++;
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String args[]) throws Exception {
start();
}
}

Socket如何保证长连接

方法1:应用层自己实现的心跳包  由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中...
  • liaomengge
  • liaomengge
  • 2016年02月28日 17:25
  • 6670

socket长连接的维持

长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的。 如果,长时间未发送维持连接包,服务端程序将断开连接。 客户端: 通过持有Client对象,可以随时(使用sendObj...
  • u011693260
  • u011693260
  • 2016年02月02日 10:47
  • 1410

最近做socket保持长连接的一些心得

来自:http://s.yanghao.org/program/viewdetail.php?i=2945 自己写的客户端马上要发布了,忽然发现了一大堆问题,主要集中在与服务器的TCP连接经常莫名断...
  • ArvinStudy
  • ArvinStudy
  • 2013年03月01日 12:18
  • 6789

使用socket建立长连接

使用socket建立长连接 长连接与短链接区别在于是否每次请求交互后断开,不断开则是长连接: 服务端代码: import java.io.BufferedReader; import java....
  • mhhyoucom
  • mhhyoucom
  • 2016年09月18日 16:15
  • 1855

Socket长连接实现思路

长连接的正确实现方式  1、不关闭流实现长连接?    流关闭了而不关闭Socket,还是无法达到长连接的效果的,所以,要长连接,流必须不能关闭!那么,是不是直接不关闭流,然后每次要发消息就直接往流里...
  • u012441924
  • u012441924
  • 2017年04月19日 10:11
  • 1285

java socket长连接服务端

java socket长连接服务端的实现 网络编程都是最底层都是基于socket的,鉴于客户端需要一直发送消息,使用短连接就不适合了,因为建立socket连接后发送完数据又马上断开连接。而长连接通...
  • u013144287
  • u013144287
  • 2017年08月03日 23:06
  • 1429

Java socket长连接代码实现

服务器端程序: import java.io.*; import java.net.*; import java.util.*; public class ChatServer { boolea...
  • huangbin10025
  • huangbin10025
  • 2014年09月30日 15:42
  • 4191

socket长连接所用到的八大技术

我在做一个APP,连续做了7天终于搞定的一个异步socket通信的问题。由于公司机密不可能把代码贴出来。 不过socket相关的原形在我那篇socket通信中有介绍。 用到5大技术: 第一大技术是:多...
  • jia12216
  • jia12216
  • 2015年08月08日 16:19
  • 2153

Socket与http的长连接和短连接

1.socket长连接与短连接 长连接:在服务端的socket的超时时间内如果没有收到客户端的请求包,那么服务端就会关闭此次连接,因此为了保持长连接的话,客户端需要在服务端的超时时间内发送心跳信息以保...
  • sszgg2006
  • sszgg2006
  • 2015年08月01日 17:05
  • 3432

socket长连接客户端管理

今天看到有人在ask上提问关于socket长连接发送消息的问题,所以突然就想着写一篇博客。 为刚接触socket长连接开发,并且没有用mina或netty这种nio框架的开发者提出的一些思路。 可以根...
  • w172087242
  • w172087242
  • 2016年06月17日 10:26
  • 2190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socket长连接,
举报原因:
原因补充:

(最多只允许输入30个字)