java Socket通信 长连接

yc_8301 2010-03-18 01:59:25
大家好,想请教一个问题.内容如下:

服务器代码:

//服务器开始代码(可以写到服务器main函数里作为测试使用)
ServerSocket server = new ServerSocket(9000);
while(true){
Socket client = server.accept();
SSocket ss = new SSocket(client);
new Thread(ss).start();
}

//服务器 接受/发送 类
class SSocket implements Runnable{
protected Socket client;

public Socket (Socket client){
this.client = client;
}

public void run() {

DataInputStream input = null;
DataOutputStream output = null;
try{
System.out.println("Thread:strat()");

input = new DataInputStream(client.getInputStream());
output = new DataOutputStream(client.getOutputStream());

String inputs = input.readUTF();

String value = inputs + "123";
output.writeUTF(value);
output.flush();

}catch(IOException e){
e.printStackTrace();
}
}
}



客户端代码:

public class CSocket {

private String host;
private int port;
private Socket socket;

public CSocket(String host, int port) {
this.host = host;
this.port = port;
}

public boolean connect() {
boolean success = false;
try {
if(socket == null)
socket = new Socket(host, port);
success = true;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return success;
}

public void send(String data) {
DataOutputStream output = null;
DataInputStream input = null;
try {
output = new DataOutputStream(socket.getOutputStream());
output.writeUTF(data);
output.flush();

input = new DataInputStream(socket.getInputStream());
String result = input.readUTF();
System.out.println(result);

} catch (IOException e) {
e.printStackTrace();
}
}
}


客户端测试代码:

public void sendTest(){
CSocket csocket = new CSocket("127.0.0.1", 9000);
csocket.connect();
csocket.send("abcdefg");

System.out.println("------");

csocket.connect();
csocket.send("123456789");
}

问题是:
客户端测试时,第一次请求:csocket.send("abcdefg");
服务器可以接受数据,并且服务器的应答数据也能接受到。
但是,第二次请求:csocket.send("123456789");
服务器接受不到数据,经测试好像是服务器的 Socket client = server.accept();
并没有触发,一直处于 阻塞状态。

请问各位这个如何解决。
另外,如果客户端测试代码 每次请求都重新建立 CSocket 对象,服务器端是可以接受多次请求的。如下:

public void sendTest(){
CSocket csocket = new CSocket("127.0.0.1", 9000);
csocket.connect();
csocket.send("abcdefg");

System.out.println("------");

CSocket cs = new CSocket("127.0.0.1", 9000);
cs.connect();
cs.send("123456789");
}

以上问题还请各位帮忙。谢谢先!

...全文
2018 15 打赏 收藏 转发到动态 举报
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaotongbeyond 2012-06-01
  • 打赏
  • 举报
回复
可以把 SSocket 这个类发给我一下么? 我想试试看~
deng129253 2012-03-20
  • 打赏
  • 举报
回复
我也遇到这问题了,晕死,解决不了
renjy1123 2011-10-11
  • 打赏
  • 举报
回复
你这个是长连接拉,但有个问题拉,即使你在线程的run()方法中加了循环,这个线程就一直在运行,但是你服务端在接受的时候没来一次请求你也循环了,就是说来一次请求你就开一个线程,这样是不是有问题,你还有没有其他的好的写法拉,while(true){
Socket client = server.accept();
SSocket ss = new SSocket(client);
new Thread(ss).start();
}
你这段代码就是客户端请求一次就来开一线程,多了,服务端就吃不消了,而且你里面每一个线程都在循环使用,没有停拉。
我现在也在弄这个长链接,就是一个客户端与服务端一直保留这个链接,不关闭。
xiaoyiabc123 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ivorytower 的回复:]
引用 6 楼 bayougeng 的回复:

引用 3 楼 xiesisi3 的回复:

引用 2 楼 bayougeng 的回复:
SSocket启动线程是没有错。但是你启动线程的run方法里只读了一次啊。
也就是说,这个run方法读完一次以后就退出了。这个线程也就不复存在了。
你应该在run里面加上while(true)这样的循环。


他是通过两次连接,每一次连接只发一次……
[/Quote]正解
luxiaoshuai 2010-03-18
  • 打赏
  • 举报
回复
好像每次用的时候都要重连接一下server
xiesisi3 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bayougeng 的回复:]
引用 3 楼 xiesisi3 的回复:

引用 2 楼 bayougeng 的回复:
SSocket启动线程是没有错。但是你启动线程的run方法里只读了一次啊。
也就是说,这个run方法读完一次以后就退出了。这个线程也就不复存在了。
你应该在run里面加上while(true)这样的循环。


他是通过两次连接,每一次连接只发一次也只需要读一次。
现在问题是连接不上


……
[/Quote]


晕。是我看错了。不好意思。
我把他那个说连不上的问题和后面测试的代码混在一起了,恩是的,是你说的解决方式。
yc_8301 2010-03-18
  • 打赏
  • 举报
回复
谢谢各位回答...十分感谢.
to bayougeng:
谢谢您的回答!问题基本解决。如再有问题,再向各位请教。

准备结帖
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bayougeng 的回复:]

引用 3 楼 xiesisi3 的回复:

引用 2 楼 bayougeng 的回复:
SSocket启动线程是没有错。但是你启动线程的run方法里只读了一次啊。
也就是说,这个run方法读完一次以后就退出了。这个线程也就不复存在了。
你应该在run里面加上while(true)这样的循环。


他是通过两次连接,每一次连接只发一次也只需要读一次。
现在问题是连接不上


不是连不上,他说的很清楚,是发第一个字符串,再发就没反应了。
再连一次又能发。
问题很明显嘛,run中没有写循环,响应一次就退出了。
[/Quote]
应该让服务器端一直运行着,还有就是缺少了关闭流
bayougeng 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiesisi3 的回复:]

引用 2 楼 bayougeng 的回复:
SSocket启动线程是没有错。但是你启动线程的run方法里只读了一次啊。
也就是说,这个run方法读完一次以后就退出了。这个线程也就不复存在了。
你应该在run里面加上while(true)这样的循环。


他是通过两次连接,每一次连接只发一次也只需要读一次。
现在问题是连接不上
[/Quote]

不是连不上,他说的很清楚,是发第一个字符串,再发就没反应了。
再连一次又能发。
问题很明显嘛,run中没有写循环,响应一次就退出了。
iceriver_1980 2010-03-18
  • 打赏
  • 举报
回复
代码挺清晰的,O(∩_∩)O~,可惜俺不会,顶一顶,坐等高人指点,(*^__^*) ……
wslzxql 2010-03-18
  • 打赏
  • 举报
回复
如果你只有一个客户端,在Socket client = server.accept();时已经连接上了,它阻塞是在等一个新的连接,第一次连接上后你的线程应该到ssocket里去了,我也刚从这个问题里逃出来啊
xiesisi3 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bayougeng 的回复:]
SSocket启动线程是没有错。但是你启动线程的run方法里只读了一次啊。
也就是说,这个run方法读完一次以后就退出了。这个线程也就不复存在了。
你应该在run里面加上while(true)这样的循环。
[/Quote]

他是通过两次连接,每一次连接只发一次也只需要读一次。
现在问题是连接不上
bayougeng 2010-03-18
  • 打赏
  • 举报
回复
SSocket启动线程是没有错。但是你启动线程的run方法里只读了一次啊。
也就是说,这个run方法读完一次以后就退出了。这个线程也就不复存在了。
你应该在run里面加上while(true)这样的循环。
xiesisi3 2010-03-18
  • 打赏
  • 举报
回复
吃干抹尽了就想走?钱呢?钱还没给咧!!


大哥,用完Socket要给它关闭啊,你没有关闭,又去连接,当然连接不上了。
虽然JVM自动帮你处理一些垃圾啊之类的东西,但你自己也要做事情的。

62,567

社区成员

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