服务端类:
import java.net.*;
import java.io.*;public class TestServerSocket {
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket(7586);
while(true){
Socket s=ss.accept();
System.out.println("A client connect!");
DataInputStream dis=new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
dis.close();
s.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
---------------------------------------------------------------------
客户端类:
import java.net.*;
import java.io.*;public class TestClientSocket {
public static void main(String[] args){
try{
Socket s=new Socket("127.0.0.1",7586);
DataOutputStream dos=new DataOutputStream(s.getOutputStream()); 
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while(true){
String str="Client: "+br.readLine();
if(str.equals("Client: exit"))
break;
System.out.println(str);
dos.writeUTF(str);
dos.flush();
}
br.close();
dos.close();
s.close();
}catch(IOException e){
e.printStackTrace();
}

}

}编译后通过,运行后,在客户端从键盘敲入文字,然后在服务端显示。
我运行时的情况是:第一次和第二次输入文字时程序正常运行,但第三次输入文字时却发生异常:
提示如下:
java.net.SocketException: Software caused connection abort: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.DataOutputStream.write(DataOutputStream.java:90)
        at java.io.DataOutputStream.writeUTF(DataOutputStream.java:384)
        at java.io.DataOutputStream.writeUTF(DataOutputStream.java:306)
        at TestClientSocket.main(TestClientSocket.java:15)哪位高手帮我看下,谢谢!!!

解决方案 »

  1.   

    服务端类: 
    import java.net.*; 
    import java.io.*; public class TestServerSocket { 
    public static void main(String[] args){ 
    try{ 
    ServerSocket ss=new ServerSocket(7586); 
    while(true){ 
    Socket s=ss.accept(); 
    System.out.println("A client connect!"); 
    DataInputStream dis=new DataInputStream(s.getInputStream()); 
    System.out.println(dis.readUTF()); 

    }catch(IOException e){ 
    e.printStackTrace(); 
    finally {
       if (dis != null) {
          dis.close(); 
          s.close(); 
    }
    }


    --------------------------------------------------------------------- 
    客户端类: 
    import java.net.*; 
    import java.io.*; public class TestClientSocket { 
    public static void main(String[] args){ 
    try{ 
    Socket s=new Socket("127.0.0.1",7586); 
    DataOutputStream dos=new DataOutputStream(s.getOutputStream()); 
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
    while(true){ 
    String str="Client: "+br.readLine(); 
    if(str.equals("Client: exit")) 
    break; 
    System.out.println(str); 
    dos.writeUTF(str); 
    dos.flush(); 

    br.close(); 
    dos.close(); 
    s.close(); 
    }catch(IOException e){ 
    e.printStackTrace(); 
    } finally {
       if (dos != null) {
         br.close(); 
         dos.close(); 
        s.close(); 
    }
    }

    } } 
    好像是这样,我没测试.
      

  2.   

    你的client端和Server端代码不匹配
    Client端的程序是socket连接后。在这一次连里多次写数据到Server端,socket连接是不关闭的。
    Server端的程序是建立连接,一次读取读取数据就关闭连接。
    ----------------------------------------------
    Server端改成如下(这么改不规范,只是让让你明白原理)
    import java.net.*;
    import java.io.*;public class TestServerSocket {
    public static void main(String[] args) {
    try {
    ServerSocket ss = new ServerSocket(7586);
    Socket  s = ss.accept();
    System.out.println("A client connect!");
    while (true) {

    DataInputStream dis = new DataInputStream(s.getInputStream());
    System.out.println(dis.readUTF());

    }

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

  3.   

    你服务器端确实有问题哦
    import java.net.*; 
    import java.io.*; public class TestServerSocket { 
    public static void main(String[] args){ 
    try{ 
    ServerSocket ss=new ServerSocket(7586); 
    while(true){ 
    Socket s=ss.accept(); 
    System.out.println("A client connect!"); 
    DataInputStream dis=new DataInputStream(s.getInputStream()); 
    System.out.println(dis.readUTF()); 
    -------------不应该在这里关的啊,1楼的处理应该是正确的
    dis.close(); 
    s.close(); 
    -------------

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



    你输入三次,第三次就断开的话,应该跟readUTF()的用法有关系吧
    readUTF() 要求流的前两个字节提供UTF字节码长度,而使用notepad转换而来的文件,其格式是前三位是magic code: EF BB BF,后面是UTF字节码,导致读请求失败 你可以试试
    字节流用BufferedInputStream bis = new BufferedInputStream(new DataInputStream(system.in)); 比你的方法方便多了! 
    仅供参考..... 
      

  4.   

    在一楼基础上改的,经过测试可以
    服务器端import java.net.*; 
    import java.io.*; public class TestServerSocket { 

    public static void main(String[] args){ 
    DataInputStream dis=null;
    Socket s=null;
    try{ 
    ServerSocket ss=new ServerSocket(7586); 
    while(true){ 
     s=ss.accept(); 
    System.out.println("A client connect!"); 
    dis=new DataInputStream(s.getInputStream()); 
    System.out.println(dis.readUTF()); 

    }catch(IOException e){ 
    e.printStackTrace(); 
    } finally { 
      if (dis != null) { 
          try {
    dis.close();
     s.close(); 
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();

         

    }} 
    } 客户端
    import java.net.*; 
    import java.io.*; public class TestClientSocket { 
    public static void main(String[] args){ 
    DataOutputStream dos=null;
    BufferedReader br=null;
    Socket s=null;
    try{ 
     s=new Socket("127.0.0.1",7586); 
     dos=new DataOutputStream(s.getOutputStream()); 
     br=new BufferedReader(new InputStreamReader(System.in)); 
    while(true){ 
    String str="Client: "+br.readLine(); 
    if(str.equals("Client: exit")) 
    break; 
    System.out.println(str); 
    dos.writeUTF(str); 
    dos.flush(); 
    } }catch(IOException e){ 
    e.printStackTrace(); 
    } finally { 
      if (dos != null) { 
        try {
    br.close();
       dos.close(); 
        s.close(); 
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();

     


    } } 
      

  5.   

    "while(true){ 
    Socket s=ss.accept(); 
    System.out.println("A client connect!"); 
    DataInputStream dis=new DataInputStream(s.getInputStream()); 
    System.out.println(dis.readUTF()); 
    dis.close(); 
    s.close();
    }"
    Socket s=ss.accept(); 这里是阻塞的,当一个客户连上来之后,他就等下一个了
    dis.readUTF(),这里也是阻塞的,
    如果你的只一个客户的话,就把Socket s=ss.accept(); 
    System.out.println("A client connect!"); 
    DataInputStream dis=new DataInputStream(s.getInputStream()); 
    放到while(true)的外面就行了
    dis.close(); 
    s.close();这2个你那么快关闭他干吗,客户端关了后你才再finally里关掉
      

  6.   

    确实如此,而且就算没关你同一个客户端第二次向服务器输出服务器也不会接收了,因为
    Socket s=ss.accept(); 
    在等待另一个客户来连接,卡那里了。
    可不知道为什么客户端第二次输出没有异常而第三次有呢?