关于java socket长连接问题

kunpp 2009-11-03 07:00:27
求客户端和服务器源代码及解释
...全文
646 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kunpp 2009-11-04
  • 打赏
  • 举报
回复
好了 我今天弄出来了
Agile牧 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lk_echo 的回复:]
长连接,只要你不关闭服务端,就不会关闭,不管你有多少客户端都没有问题。
Java codepackage lmd.echo.socket.server;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import org.apache.log4j.Logger;/**
*
*@author:牛车水
* @mail:lk_echo@163.com
* @date:20090924
* @info:java socket 服务端
**/publicclass SocketServerimplements Runnable{private Socket client;private ServerSocket server;public SocketServer() {// TODO Auto-generated constructor stub }

Logger logger= Logger.getLogger(SocketServer.class);publicvoid run(){
logger.info("java socket 开始执行……");try {
server=new ServerSocket(8888);
}catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();
}try{while(true){
String firstValue="";
String returnStr="";
client= server.accept();
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out=new PrintWriter(client.getOutputStream());
ExecuteSocketServer ess=new ExecuteSocketServer();
String reciverInfo= in.readLine();//得到客户端传来的数据//your code out.println(returnStr);
out.flush();
client.close();
}

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

}

}publicstaticvoid main(String[] args){
Thread t=new Thread(new SocketServer());
t.start();

}

}
[/Quote]
up
NickCheng 2009-11-03
  • 打赏
  • 举报
回复
路过看看……
kunpp 2009-11-03
  • 打赏
  • 举报
回复
下面是我从网上找的,但是有人说java的ss.setKeepAlive(true);方法很迟钝,有更好的解释吗?
Client:

Socket ss = null;
InputStream in = null;
DataOutputStream dos = null;

public MySocketClient() {

}

public static byte[] intToBytes(int v) {
byte[] b = new byte[4];
b[0] = (byte) ((v >>> 24));
b[1] = (byte) ((v >>> 16));
b[2] = (byte) ((v >>>);
b[3] = (byte) ((v >>> 0));
for(int i=0;i<b.length;i++)
System.out.println(b[i]);
System.out.println(Integer.toBinaryString(v));
return b;
}

public static int bytesToInt(byte[] b) {
int ret = 0;
ret |= (b[0] & 0xff) << 24;
ret |= (b[1] & 0xff) << 16;
ret |= (b[2] & 0xff) << 8;
ret |= (b[3] & 0xff) << 0;
return ret;
}

public boolean keeplive() {
try {
if (ss == null || !(ss.isConnected() && !ss.isClosed())) {
ss = new Socket("127.0.0.1", 9901);
ss.setKeepAlive(true);
in = ss.getInputStream();
dos = new DataOutputStream(ss.getOutputStream());
}
return true;
} catch (IOException e) {
if (ss != null) {
try {
ss.close();
ss = null;
dos = null;
in = null;
} catch (IOException e1) {
}
}
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e1) {
}
return false;
}
}

public void run() {
while (!keeplive())
;
while (true) {
try {
byte[] b = "hello".getBytes();
int l = b.length;
dos.write(intToBytes(l));
dos.write(b);
dos.flush();

int leng = 0;
byte[] buffer = new byte[1024];
leng = in.read(buffer);
if (leng > 0)
System.out.println(new String(buffer));
Thread.sleep(1000);
} catch (Exception e) {
if (ss != null) {
try {
ss.close();
ss = null;
dos = null;
in = null;
} catch (IOException e1) {
e1.printStackTrace();
}
}
while (!keeplive())
;
}
}
}





Server:


public void run() {

try {
while (true) {
byte[] totalData = new byte[0];
int totalLeg = 0;
int leng = 0;

byte[] size = new byte[4];
int readsize = 0;
if (in.read(size) > 0)
readsize = bytesToInt(size);
else
continue;

byte[] buffer = new byte[readsize];
leng = in.read(buffer, 0, readsize);
System.out.println(new String(buffer).trim());
int le=(int)(Math.random()*100)+1;
byte[] b=new byte[le];
new Random().nextBytes(b);
os.write(b);
os.flush();
}
} catch (IOException e) {
// e.printStackTrace();
}
finally {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}



public static void main(String[] args) throws IOException{
ServerSocket ss=null;
try {
ss=new ServerSocket(9901);
} catch (IOException e) {
e.printStackTrace();
}
while(true){
Socket socket=ss.accept();
socket.setKeepAlive(true);
new MyRunableSocket(socket).start();
}
}
kunpp 2009-11-03
  • 打赏
  • 举报
回复
定义个心跳协议,客户端定时不间断发送心跳包,接受服务器的响应,从而判断连接是否失效,进而进行重连


谁给个代码,100分就全发了,谢谢!
wifewifewife 2009-11-03
  • 打赏
  • 举报
回复
长:connect连上后不断开, 进行N次收发操作.
长连接:
run(){
while(NotEnd){
read
process
write
}
}
阿士匹灵 2009-11-03
  • 打赏
  • 举报
回复
下班 路过 学习 呵呵
lk_echo 2009-11-03
  • 打赏
  • 举报
回复
长连接,只要你不关闭服务端,就不会关闭,不管你有多少客户端都没有问题。

package lmd.echo.socket.server;

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

import org.apache.log4j.Logger;

/**
*
* @author:牛车水
* @mail:lk_echo@163.com
* @date:20090924
* @info:java socket 服务端
*
*/
public class SocketServer implements Runnable{

private Socket client;
private ServerSocket server;
public SocketServer() {
// TODO Auto-generated constructor stub
}

Logger logger = Logger.getLogger(SocketServer.class);

public void run(){
logger.info("java socket 开始执行……");
try {
server = new ServerSocket(8888);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{

while(true){
String firstValue = "";
String returnStr = "";
client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
ExecuteSocketServer ess = new ExecuteSocketServer();
String reciverInfo = in.readLine();//得到客户端传来的数据
//your code
out.println(returnStr);
out.flush();
client.close();
}

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

}

}
public static void main(String[] args){
Thread t = new Thread(new SocketServer());
t.start();

}

}

bawgiitx 2009-11-03
  • 打赏
  • 举报
回复
先抢位,再写代码

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧