刚接触socket,今天弄的好崩溃~~~~   
我已经对照过了正确的代码了呀~ 还是看不出下面的代码哪里出了错,请各位帮我纠正一下
package Frame;import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Server extends Thread{

Socket socket;
BufferedReader in;
PrintWriter out;


public Server(){
try {
ServerSocket ss=new ServerSocket(6);
while(true)
      {
        Socket s = ss.accept();
        new Server(s).start();
      }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public Server(Socket s){
this.socket = s;
}

 public void run()
  {
    try {
      
      in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  out=new PrintWriter(socket.getOutputStream(),true);
  System.out.println(in.read());
  
  out.write("Hello,welcome you!");
      out.flush();
             out.close();
      in.close();
      socket.close();
      
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 public static void main(String[] args){
new Server().start();
}
}package Frame;import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Server extends Thread{

Socket socket;
BufferedReader in;
PrintWriter out;


public Server(){
try {
ServerSocket ss=new ServerSocket(6);
while(true)
      {
        Socket s = ss.accept();
        new Server(s).start();
      }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public Server(Socket s){
this.socket = s;
}

 public void run()
  {
    try {
      
      in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  out=new PrintWriter(socket.getOutputStream(),true);
  System.out.println(in.read());
  
  out.write("Hello,welcome you!");
      out.flush();
             out.close();
      in.close();
      socket.close();
      
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 public static void main(String[] args){
new Server().start();
}
}
为什么我的端口在 程序运行一次之后就不能用了呢?  还有为什么关闭程序之后会报错
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.read(Unknown Source)
at Frame.Server.run(Server.java:46)我想实现一个不断运行的server  在有client访问时  就弹出一个简单的对话框框能进行对话,在这里先多谢各位了

解决方案 »

  1.   

    你关闭的顺序不对,先关闭client 再关闭server
      

  2.   

    楼主 。。若若的问句,你的Socket在那儿呢??
      

  3.   

    ServerSocket ss=new ServerSocket(6);
    把6改成大一点的数字,例如 8088小于1023的端口号可能被系统占用
      

  4.   

    抱歉复制错了package Frame;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetSocketAddress;
    import java.net.Socket;public class Client extends Thread{

    Socket socket;
    BufferedReader in;
    PrintWriter out;

    public Client(){

    }
    public void run(){
    socket = new Socket();
    try {

    socket.connect(new InetSocketAddress("192.168.1.45",6),5000);
        in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out=new PrintWriter(socket.getOutputStream(),true);
    System.out.println(in.read());

    out.write("i'm client!");
        out.flush();
        
        
        out.close();
        in.close();
        socket.close();
        
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public static void main(String[] args){
    new Client().start();
    }
    }
      

  5.   

    呵呵,找到原因了:你的程序被堵塞了,之间的connect,out,in,仍在连接,你的sockt.close();没被执行;当你强行关闭时当然会出现connection.reset();你在server和client的out.write()之后加入out.close();使对方的读取停止,不再处于堵塞状态;我看书上的程序都定义一个退出消息 比如说quit,当字符中有quit时out,in就关闭;像你这样无法关闭程序
      

  6.   

    package Frame;import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;public class Server extends Thread{
        
        Socket socket = null;
        BufferedReader in;
        PrintWriter out;
        
        
        public Server(){
        }
        
        public Server(Socket s){
            this.socket = s;
        }
            
         public void run()
          {
          if (socket != null) {
            try {
              
              in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
              out=new PrintWriter(socket.getOutputStream(),true);
              String line = null; 
              while ((line = in.readLine()) != null) {
               System.out.println(line);
              }
              
              out.write("Hello,welcome you!");
              out.flush();
              
              in.close();
              out.close();
              socket.close();
            }
            catch (Exception ex) {
              ex.printStackTrace();
            }
          } else {
            try {
                ServerSocket ss=new ServerSocket(9900);
                while(true)
                  {
                    Socket s = ss.accept();
                    new Server(s).start();
                  }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
          }
         public static void main(String[] args){
                new Server().start();
         }
    }
    package Frame;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetSocketAddress;
    import java.net.Socket;public class Client extends Thread { Socket socket; BufferedReader in; PrintWriter out; public Client() { } public void run() {
    socket = new Socket();
    try { socket.connect(new InetSocketAddress("localhost", 9900), 5000);
    in = new BufferedReader(new InputStreamReader(socket
    .getInputStream()));
    out = new PrintWriter(socket.getOutputStream(), true);
    out.write("i'm client!");
    out.flush();
    socket.shutdownOutput();

    String line = null;
    while ((line = in.readLine()) != null) {
    System.out.println(line);
    }

    out.close();
    in.close();
    socket.close(); } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } public static void main(String[] args) {
    new Client().start();
    }
    }
      

  7.   

    (来源java仿qq)
    服务器类import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;import com.jp.frame.LiaoTianFrame;public class QQServer {
    private ServerSocket ss;
    private int port=5500;
    private static boolean flag=true;
    public void startServer(){
    try {
    ss=new ServerSocket(port);
    while(flag){
    Socket incoming = ss.accept();
    new LiaoTianFrame(incoming,incoming.getInetAddress().getHostAddress());
    }
    } catch (IOException e) {
    e.printStackTrace();
    }finally{
    if(ss!=null)
    try {
    ss.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    public static void stopServer(){
    flag=false;
    }
    }聊天窗口类import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.Socket;
    import java.util.Date;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;public class LiaoTianFrame extends JFrame{
    private JTextArea jiluTXT;
    private JTextField mesTXT;
    private JScrollPane jiluSP;
    private JPanel mesP;
    private JButton sendB;
    private StringBuffer ms=new StringBuffer();//存储聊天记录

    private Socket socket=null;
    private DataInputStream read=null;
    private DataOutputStream write=null;
    private Date date;
    private String myname=ListModelThread.myname;
    public LiaoTianFrame(Socket socket,String title){
    String plaf="com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
    try {
    UIManager.setLookAndFeel(plaf);//设置界面风格
    SwingUtilities.updateComponentTreeUI(this);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (InstantiationException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
    e.printStackTrace();
    }
    init();
    this.socket=socket;
    try {
    read=new DataInputStream(socket.getInputStream());
    write=new DataOutputStream(socket.getOutputStream());
    } catch (IOException e) {
    e.printStackTrace();
    }
    new Thread(){//启动一个接收信息的线程
    private String s;
    public void run(){
    while(true){
    try {
    s=read.readUTF();
    } catch (IOException e) {
    e.printStackTrace();
    }
    ms.append(s+"\n");
    jiluTXT.setText(ms.toString());
    }
    }
    }.start();
    this.setTitle(title);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    this.setSize(320,250);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
    }
    public void init(){//初始化界面
    jiluTXT=new JTextArea();
    jiluTXT.setEditable(false);
    jiluSP=new JScrollPane(jiluTXT);

    mesTXT=new JTextField();
    sendB=new JButton("发送");
    sendB.addActionListener(new ActionListener(){//监听事件
    @Override
    public void actionPerformed(ActionEvent e) {
    sendMessage();//调用方法使代码更清晰
    }

    });
    mesP=new JPanel();
    mesP.setLayout(new BorderLayout());
    mesP.add(mesTXT);
    mesP.add(sendB,BorderLayout.EAST);

    this.add(jiluSP,BorderLayout.CENTER);
    this.add(mesP,BorderLayout.SOUTH);
    }
    public void sendMessage(){
    date=new Date();
    String sdate=date.getYear()+"-"+date.getMonth()+"-"+date.getDay()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
    String s=sdate+myname+"\n"+mesTXT.getText().trim();
    try {
    write.writeUTF(s);
    } catch (IOException e) {
    s="发送失败";
    }
    ms.append(s+"\n");
    jiluTXT.setText(ms.toString());
    mesTXT.setText("");
    }
    }