大家好,想请教一个问题.内容如下:服务器代码://服务器开始代码(可以写到服务器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");
    }以上问题还请各位帮忙。谢谢先!

解决方案 »

  1.   

    吃干抹尽了就想走?钱呢?钱还没给咧!!
    大哥,用完Socket要给它关闭啊,你没有关闭,又去连接,当然连接不上了。
    虽然JVM自动帮你处理一些垃圾啊之类的东西,但你自己也要做事情的。
      

  2.   

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

  3.   

    如果你只有一个客户端,在Socket client = server.accept();时已经连接上了,它阻塞是在等一个新的连接,第一次连接上后你的线程应该到ssocket里去了,我也刚从这个问题里逃出来啊
      

  4.   


    不是连不上,他说的很清楚,是发第一个字符串,再发就没反应了。
    再连一次又能发。
    问题很明显嘛,run中没有写循环,响应一次就退出了。
      

  5.   

    谢谢各位回答...十分感谢.
    to bayougeng:
    谢谢您的回答!问题基本解决。如再有问题,再向各位请教。准备结帖
      

  6.   

    好像每次用的时候都要重连接一下server
      

  7.   

    你这个是长连接拉,但有个问题拉,即使你在线程的run()方法中加了循环,这个线程就一直在运行,但是你服务端在接受的时候没来一次请求你也循环了,就是说来一次请求你就开一个线程,这样是不是有问题,你还有没有其他的好的写法拉,while(true){
      Socket client = server.accept();
      SSocket ss = new SSocket(client);
      new Thread(ss).start();
    }
    你这段代码就是客户端请求一次就来开一线程,多了,服务端就吃不消了,而且你里面每一个线程都在循环使用,没有停拉。
    我现在也在弄这个长链接,就是一个客户端与服务端一直保留这个链接,不关闭。
      

  8.   

    可以把 SSocket 这个类发给我一下么?  我想试试看~