大家好,想请教一个问题.内容如下:服务器代码://服务器开始代码(可以写到服务器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");
}以上问题还请各位帮忙。谢谢先!
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");
}以上问题还请各位帮忙。谢谢先!
大哥,用完Socket要给它关闭啊,你没有关闭,又去连接,当然连接不上了。
虽然JVM自动帮你处理一些垃圾啊之类的东西,但你自己也要做事情的。
也就是说,这个run方法读完一次以后就退出了。这个线程也就不复存在了。
你应该在run里面加上while(true)这样的循环。
不是连不上,他说的很清楚,是发第一个字符串,再发就没反应了。
再连一次又能发。
问题很明显嘛,run中没有写循环,响应一次就退出了。
to bayougeng:
谢谢您的回答!问题基本解决。如再有问题,再向各位请教。准备结帖
Socket client = server.accept();
SSocket ss = new SSocket(client);
new Thread(ss).start();
}
你这段代码就是客户端请求一次就来开一线程,多了,服务端就吃不消了,而且你里面每一个线程都在循环使用,没有停拉。
我现在也在弄这个长链接,就是一个客户端与服务端一直保留这个链接,不关闭。