客户端code
public class Client implements Runnable{

private static Socket s;

private Socket getInstance(){
if(s==null){
try {
return s=new Socket("127.0.0.1",8000);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();

}
return s;
}

public void sendMsg() {
while(true){
try {
run();
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

@Override
public void run() {
System.out.println("come into run");
try {
Socket c = getInstance();
OutputStream ops =c.getOutputStream();
ops.write(new byte[]{0000});
ops.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}

public static void main(String[] args) {
Client c = new Client();
c.sendMsg();
}
}服务端codepublic class Server { private ServerSocket serverSocket;

public Server(){
try {
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(8000));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("服务启动");
} public void service() {
while (true) {
Socket s = null;
try {
s = serverSocket.accept();
System.out.println("come a new request~ "+s.getInetAddress()+":"+s.getPort());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(s!=null)
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Server server = new Server();
server.service();
}
}我的想法是每隔3秒往服务端发送一个数据包,现在的情况是会抛异常:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at com.ls.test.Client.run(Client.java:44)
at com.ls.test.Client.sendMsg(Client.java:28)
at com.ls.test.Client.main(Client.java:57)我发现可能是server端把socket close的原因所以去掉了关闭代码:
 finally {
if(s!=null)
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
但现在服务端确只接受一次请求了,不知道为什么
socketjava

解决方案 »

  1.   

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;public class Client implements Runnable
    {
    private static Socket s; private Socket getInstance()
    {
    if (s == null)
    {
    try
    {
    return s = new Socket("127.0.0.1", 8000);
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    return s;
    } @Override
    public void run()
    {
    while (true)
    {
    try
    {
    System.out.println("come into run");
    Socket c = getInstance();
    OutputStream ops = c.getOutputStream();
    ops.write(new byte[]
    {
    0000
    });
    ops.flush();
    Thread.sleep(3000);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    } public static void main(String[] args)
    {
    Client c = new Client();
    new Thread(c).start();
    }
    }
      

  2.   

    import java.io.DataInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;public class Server implements Runnable
    {
    private ServerSocket serverSocket; private Socket s;

    public Server()
    {
    try
    {
    serverSocket = new ServerSocket();
    serverSocket.bind(new InetSocketAddress(8000));
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    System.out.println("服务启动");
    } public void run()
    {
    while (true)
    {
    try
    {
    if(null == s)
    s = serverSocket.accept();
    InputStream is = s.getInputStream();
    DataInputStream dis = new DataInputStream(is);
    String str = null;
    while(null != (str = dis.readUTF()))
    {
    System.out.println("come a new request~ " + s.getInetAddress()
    + ":" + s.getPort() + str);
    }
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    }
    public static void main(String[] args)
    {
    Server server = new Server();
    new Thread(server).start();
    }
    }
      

  3.   

    仔细测了一下:
    服务端:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.text.SimpleDateFormat;
    import java.util.Date;public class Server implements Runnable
    {
    private ServerSocket serverSocket; private Socket s;

    public Server()
    {
    try
    {
    serverSocket = new ServerSocket();
    serverSocket.bind(new InetSocketAddress(8000));
    s = serverSocket.accept();
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    System.out.println("服务启动");
    } public void run()
    {
    while (true)
    {
    try
    {
    InputStream is = s.getInputStream();
    BufferedReader buf = new BufferedReader(new InputStreamReader(is));
    String str = null;
    while(null != (str = buf.readLine()))
    {
    System.out.println("come a new request~ " + s.getInetAddress()
    + ":" + s.getPort() + str +  new SimpleDateFormat("mm:ss").format(new Date()));
    }
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    }
    public static void main(String[] args)
    {
    Server server = new Server();
    new Thread(server).start();
    }
    }客户端:
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.text.SimpleDateFormat;
    import java.util.Date;public class Client implements Runnable
    {
    private static Socket s; private Socket getInstance()
    {
    if (s == null)
    {
    System.out.println("nullllllllllll");
    try
    {
    return s = new Socket("127.0.0.1", 8000);
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    return s;
    } public void run()
    {
    while (true)
    {
    try
    {
    String d = new SimpleDateFormat("mm:ss").format(new Date()) + System.getProperty("line.separator");
    System.out.println("come into run" + d);
    Socket c = getInstance();
    OutputStream ops = c.getOutputStream();
    ops.write(d.getBytes());
    ops.flush();
    Thread.sleep(3000);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    } public static void main(String[] args)
    {
    Client c = new Client();
    new Thread(c).start();
    }
    }结果:
      

  4.   


    这次ok了。非常感谢~
    我对比了我们之间的代码,发现区别在server端的接收上你的代码是:InputStream is = s.getInputStream();
                    BufferedReader buf = new BufferedReader(new InputStreamReader(is));
                    String str = null;
                    while(null != (str = buf.readLine()))
                    {
                        System.out.println("come a new request~ " + s.getInetAddress()
                                + ":" + s.getPort() + str +  new SimpleDateFormat("mm:ss").format(new Date()));
                    }
    而我是这样写的: s = serverSocket.accept();
                    System.out.println("come a new request~ "+s.getInetAddress()+":"+s.getPort());难道我这样写有问题吗?一直没想通
      

  5.   

    serverSocket.accept();//这一行会被阻塞
    看一下accept的介绍,注意红色部分:
    Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.
    它说这个方法在新的连接到来之前会一直被阻塞。
    而在客户端你写的方法:
    private Socket getInstance(){}
    这个方法保证了只会建立一次连接。
    也就是说客户端在第一次连接建立之后没有新的连接了,而服务端的死循环里接收到第一次连接并打印之后马上又去傻傻的等待第二次连接了,它肯定是等不到的,So……
      

  6.   

    是的,我的客户端需求只要求建立一个socket连接。所以用了单例模式,但服务端我的问题出在哪呀?感觉写法差不多,为什么你的能一直监听到消息,我的只能接受一次
      

  7.   

    是的,我的客户端需求只要求建立一个socket连接。所以用了单例模式,但服务端我的问题出在哪呀?感觉写法差不多,为什么你的能一直监听到消息,我的只能接受一次
    请楼主再仔细考虑一下,然后再看我在6楼的回复。我觉得已经说得够详细了。
      

  8.   

    我懂了,谢谢,我把监听写到while里了,每次请求都会重复监听,一直阻塞了。tks