在下写的serversock和socket代码,服务器能够成功接收客户端的信息,并处理相关业务,但就是无法返回信息给客户端,还望各位老师指教//SERVER端
package testsocket;
import java.lang.*;
import java.io.*;
import java.net.*;
import java.sql.*;public class newmain extends javax.swing.JFrame {   //服务器端主窗体
       public static String lr="";  //用于存放客户端传来的信息中的某一个字符串
    public newmain() {
        initComponents();
    }
    
                       
    private void initComponents() {//        此处窗体构造部分忽略
    }                       
    
    public static void main(String args[]) throws IOException{
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run()  {
                new newmain().setVisible(true);
                
            }
        });
        ServerSocket s=new ServerSocket(8056);
        while(true){
            Socket socket=s.accept();//无限监听客户的请求
                      
                  try
                  {
                      new Ctosthread(socket);//创建新线程
                  }
                  catch(IOException e)
                  {
                      socket.close();
                  }      
      }
    }
    
    // 变量声明 - 不进行修改                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    public static javax.swing.JTextArea jta1;
    // 变量声明结束                   
    
}
class Ctosthread extends java.lang.Thread  //此类用于接收client发来的信息  ,此类能够成功接收,并在服务器端根据接收值进行数据库处理
{
    private Socket ts;
    private BufferedReader in;//定义输入流
    private PrintWriter out;//定义输出流
    private boolean flag=false;
    private java.sql.ResultSet rs;
   
        public Ctosthread(Socket socket) throws IOException 
        {
            this.ts=socket;
            in=new BufferedReader(new InputStreamReader(ts.getInputStream()));//创建输入流
            start();//启动线程
        }
        
        public void run()
        {
            if(!flag)
            {
                flag=true;
                try
                {
                    String lineStr = in.readLine();
                   
                   if(lineStr.toString().startsWith("注册"))
                    {
                       newmain.lr="注册";
                        String reginsert="insert into info values('";                        
                        for(int i=1;i<lineStr.toString().split(",").length;i++)
                        {
                            reginsert+=lineStr.toString().split(",")[i].toString()+"','";
                        }                           reginsert+="否','";
                           String clientip=ts.getInetAddress().toString();
                           reginsert+=clientip+"','";                           String clientport=String.valueOf(ts.getPort());
                           reginsert+=clientport+"','";                           try{
                            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
                            String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hhdb";
                                String user="sa";
                                String password="135ade";
                                Connection con=java.sql.DriverManager.getConnection(url,user,password);
                                Statement stmt=con.createStatement();
                                String sql="SELECT MAX(CONVERT(int, no)) AS hhno FROM info";
                                rs=stmt.executeQuery(sql);  
                                while(rs.next())
                                {
                                    if(rs.getString(1)==null)
                                    {
                                        reginsert+="1')";
                                    }
                                    else
                                    {
                                        int newno=Integer.parseInt(rs.getString(1))+1;
                                        reginsert+=String.valueOf(newno)+"')";
                                    }
                                }
                                stmt.executeUpdate(reginsert);
                               }
                               catch(Exception err)
                               {
                                   err.printStackTrace();
                               }
                    }
                    if(newmain.lr=="")//如果主类(窗体类中的String类型变量 lr值依然为空,就启用回发client端类)
                    {
                        serversend ssd=new serversend(ts,newmain.lr);
                        ssd.start();
                    }
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }
} class serversend extends Thread  //此类用于向cleint端回发信息  此类不能成功,client端无法接收服务器回传来的信息
{
        PrintWriter outy;
        Socket sendsocket;
        String se="";
        public serversend(Socket socket,String s) //此处传入的s即是主窗体中的lr值
        {
            this.sendsocket=socket;
            this.outy=null;
            this.se=s;
        }
    public void run() 
    {
           
        if(se=="")  //如果主窗体类的lr值为空
        {
            try{
                outy=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sendsocket.getOutputStream())),true);//创建输出流
                        
                           System.out.println("运行到else了");
                        
                        outy.write("返回给client来了\n");
                        
                        outy.flush();     
                        sendsocket.close();
                        }
            catch(Exception ex)
            {
                
            }
        }
    }
}
/* 
 报错如下:
     java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
        at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at java.io.BufferedReader.fill(BufferedReader.java:136)
        at java.io.BufferedReader.readLine(BufferedReader.java:299)
        at java.io.BufferedReader.readLine(BufferedReader.java:362)
        at testsocket.Ctosthread.run(newmain.java:125)
生成成功(总时间:25 秒)
*/

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【cqandy】截止到2008-07-29 16:05:02的历史汇总数据(不包括此帖):
    发帖的总数量:15                       发帖的总分数:500                      每贴平均分数:33                       
    回帖的总数量:14                       得分贴总数量:1                        回帖的得分率:7%                       
    结贴的总数量:15                       结贴的总分数:500                      
    无满意结贴数:1                        无满意结贴分:50                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:6.67  %               无满意结分率:10.00 %                  
    敬礼!
      

  2.   

    //client端程序package hhchat;
    import java.awt.Color;
    import java.util.Iterator;
    import java.util.Vector;
    import javax.swing.*;
    import javax.swing.border.Border;
    import javax.swing.tree.*;
    import javax.swing.tree.DefaultTreeModel;
    import java.sql.*;
    import java.net.*;
    import java.io.*;
    import java.lang.*;public class chatpanel extends javax.swing.JFrame implements Runnable{
        javax.swing.tree.DefaultMutableTreeNode dmtn=new javax.swing.tree.DefaultMutableTreeNode("root");
        javax.swing.tree.DefaultTreeModel dtm=null;
        java.sql.ResultSet rs;
        
        public static String sessionno;
        public static String sessionpwd;
        
        
        Socket link_server=new Socket();
        String link_sports="8056";
        java.net.SocketAddress link_sa=null;
        
        BufferedWriter link_bwout=null;
        BufferedReader link_in=null;
        
        
        String link_server_ip=null;
        
        boolean flag=false;    public chatpanel() {
            initComponents();
            jLabel1.setText(Main.sessionno.toString().trim());
            this.getContentPane().setBackground(Color.WHITE);        
            dtm=new DefaultTreeModel(dmtn);
            
            dtm.setRoot(dmtn);
            jTree1.setModel(dtm);
            jScrollPane1.setBorder(null);
        }
        
        public void run()
        {  
            System.out.println("chatpanel运行了");//这里能正常打印出来
            String send_info=Main.flag.toString().trim()+","+Main.sessionno.toString().trim()+","+Main.sessionpwd.toString().trim();
            
            try{
            link_server_ip=java.net.InetAddress.getByName("www.abc.net").getHostAddress().toString();
            link_sa=new java.net.InetSocketAddress(link_server_ip,java.lang.Integer.parseInt(link_sports));        link_server.connect(link_sa);
            
            
            
            link_bwout.write(send_info);
            link_bwout.flush();
            link_in=new BufferedReader(new InputStreamReader(link_server.getInputStream()));
            System.out.println(send_info);
            String readstr=null;
           if(true)
           {
                System.out.println("到ifelse了");//这里能正常打印出来
                readstr=link_in.readLine();
                System.out.println("值来了:"+readstr);
                
           }
           link_bwout.close();
            
            link_server.close();
            }
            catch(Exception e)
            {
                
            }
            
            
           
        }
        
                          
        private void initComponents() {
           //此处窗体构造,忽略
        }                      
        
        
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new chatpanel().setVisible(true);
                    
                }
            });
            
        }    
        
        // 变量声明 - 不进行修改                     
        private javax.swing.JLabel jLabel1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTree jTree1;
        // 变量声明结束                   
        
    }
      

  3.   

    你的服务器端程序不全啊?应该有部分While循环去等待客户端来连的,没有那部分,看不出你的Socket处理有没有问题。另外觉得你用一层Thread就应该够了,为什幺用两层啊?我的Socket服务器端程序,好用的。你可以忽略业务部分,只看Socket部分就可以了。public class IndexSeeker implements Runnable{
        
        protected static Logger m_Logger;

        protected String   m_szIP ;
        protected int      m_nPort;
        
        private ServerSocket serverSocket;
        private ExecutorService executorService;//线程池
        private final int POOL_SIZE=10;//单个CPU线程池大小
        
        protected static String FIELD_TITLE = "Description";
        protected static String FIELD_ID = "JobID";
        protected static String INDEX_STORE_PATH = "E:\\Baizeju\\Index";
        
        public IndexSeeker( ) {
            Logger.initialLogger();
            m_Logger = new Logger();
        }
        public IndexSeeker( String szIP, int nPort ) throws IOException{
            
            Logger.initialLogger();
            m_Logger = new Logger();
            
            m_szIP  = szIP;
            m_nPort = nPort;
            
            serverSocket=new ServerSocket(m_nPort);
            //Runtime的availableProcessor()方法返回当前系统的CPU数目.
            executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE/2);
            m_Logger.info("IndexSeeker","IndexSeeker","服务器启动");
            m_Logger.info(System.getProperty("file.encoding"));
        }
        
        public void run() {
            while(true){
                Socket socket=null;
                try {
                    //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
                    socket=serverSocket.accept();
                    executorService.execute( new searchHandler(socket) );
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        public void shutDown() {
            
        }
        
        
        public static void main( String[] args ) {
            IndexSeeker seeker=null;
            try {
                seeker = new IndexSeeker( "127.0.0.1", 10001 );
                Thread thread = new Thread( seeker);
                thread.start();            
            }
            catch( IOException e ) {
                System.out.println( "Cannot open server port!");
                System.exit(-1);
            }
        }
    } class searchHandler implements Runnable {
        protected static String FIELD_TITLE = "Description";
        protected static String FIELD_ID = "JobID";
        protected static String INDEX_STORE_PATH = "E:\\Baizeju\\Index";

        private Socket socket;
        public searchHandler(Socket socket){
            this.socket=socket;
        }
        private PrintWriter getWriter(Socket socket) throws IOException{
            OutputStream socketOut=socket.getOutputStream();
            return new PrintWriter(socketOut,true);
        }
        private BufferedReader getReader(Socket socket) throws IOException{
            InputStream socketIn=socket.getInputStream();
            return new BufferedReader(new InputStreamReader(socketIn));
        }
        public String echo(String msg){
            return "echo:"+msg;
        }
        public void run(){
            Logger logger = new Logger();
            try {
                System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
                BufferedReader br=getReader(socket);
                PrintWriter pw=getWriter(socket);
                String msg=null;
               
                while((msg=br.readLine())!=null){
                    if( !msg.trim().equalsIgnoreCase("") ) {
                        ArrayList<String> results = doSearch( new String(msg.getBytes(),"GBK" ) );
                        
                        for( int nIndex=0; nIndex<results.size();nIndex++) {
                            pw.print(new String(results.get(nIndex).getBytes("GBK")));
                            pw.print("<br>");
                        }
                        pw.println();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {
                    if(socket!=null){
                        socket.close();
                    }
                    System.out.println( "Connection closed!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        public ArrayList<String> doSearch( String szQuery ) {
            ArrayList<String> results = new ArrayList<String>();
            
            try {
                //Directory ramDir = new RAMDirectory(INDEX_STORE_PATH);

                // 将庖丁封装成符合Lucene要求的Analyzer规范
                Analyzer analyzer = new PaodingAnalyzer();

                IndexReader reader =  IndexReader.open( INDEX_STORE_PATH );            QueryParser parser = new QueryParser(FIELD_TITLE, analyzer);
                Query query = parser.parse(szQuery);
                Searcher searcher = new IndexSearcher(INDEX_STORE_PATH);
                query = query.rewrite(reader);
                System.out.println("Searching for: " + new String( query.toString().getBytes("GBK")));
                Hits hits = searcher.search(query);            int nItemNumber = Math.min( 20, hits.length());
                for (int i = 0; i < nItemNumber; i++) {
                    String szText = hits.doc(i).get(FIELD_TITLE);
                    QueryScorer scorer = new QueryScorer( query );
                    Highlighter highlighter = new Highlighter( new SimpleHTMLFormatter("<b><I>", "</I></b>"),scorer );                TokenStream tokenStream = new PaodingAnalyzer().tokenStream( FIELD_TITLE, new StringReader(szText));
                    
                    results.add(highlighter.getBestFragment(tokenStream, szText));
                }
                //reader.close();
            }
            catch( CorruptIndexException e ) {
                e.printStackTrace();
            }
            catch( IOException e ) {
                e.printStackTrace();
            }
            catch( ParseException e ) {
                e.printStackTrace();
            }
            catch( Exception e ) {
                e.printStackTrace();
            }
            return results;
        }
    }
      

  4.   

    另外at testsocket.Ctosthread.run(newmain.java:125) 是哪一行?
    应该是刚刚进run的前面吧,String lineStr = in.readLine(); 
    在这一行就出Exception了,当然走不到后面初始化serversend ssd=new serversend(ts,newmain.lr); 那里,也就没有给客户端发信息了。
      

  5.   

    那是什么原因让这个lineStr=in.readline()出错呀???就我的代码而言?
      

  6.   

    哈哈,楼主的程序错误真隐蔽啊。帮你调了一下才找到。首先看看这篇文章:
    http://www.baizeju.com/html/Java/200807/30-159.html
    了解一下Java Socket编程各种Exception的含义。
    你遇到的异常说明如下:
    第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。看来问题出在客户端,客户端退出,但是退出前没有关闭链接,造成这个异常。下面来看看客户端为什么会退出。
    你关闭链接用的是link_server.close(); 如果没有走到这一句,就不会关闭。你下面的
    catch(Exception e)
            {
               
            } 
    看上去就很可疑。在里面增加一句:e.printStackTrace();看看,再跑一次,狐狸尾巴就出来了。客户端报错:
    java.lang.NullPointerException
            at TestCode.SocketClient.run(SocketClient.java:65)
            at TestCode.SocketClient.main(SocketClient.java:104)
    BUILD SUCCESSFUL (total time: 1 second)
    到65行去看看:
     link_bwout.write(send_info);
    link_bwout是null。找一找,link_bwout好像没有初始化啊。
      

  7.   

    我重新写了代码,接收和发送现在都能成了,但是新的问题是:在我构造的介面中,只有第一次按下按钮,能正常收发,第二次按下按钮后,就报错了,请指教server端
    package socketcs;import java.awt.BorderLayout;
    import java.io.*;
    import java.net.*;
    import java.awt.event.*;
    import java.lang.*;
    import javax.swing.*;
    public class serversk extends JFrame
    {
        JLabel title=new JLabel("服务器监视登录");
        javax.swing.JScrollPane jsp;
        public static javax.swing.JTextArea jta1;
        public serversk()
        {
            this.setLayout(new BorderLayout());
            jsp=new JScrollPane();
            jta1=new JTextArea();
            jta1.setSize(640,480);
            jsp.setViewportView(jta1);
            jta1.setVisible(true);
            this.getContentPane().add(title,BorderLayout.NORTH);
            title.setVisible(true);
            this.getContentPane().add(jsp,BorderLayout.CENTER);
        }
        
        
        public static void main(String[] args)
        {
            serversk sk=new serversk();
            
            sk.setSize(800,600);
            sk.setVisible(true);
            try{
                ServerSocket ss=new ServerSocket(9516);
                Socket s=ss.accept();
                inout ios=new inout(s);
                new Thread(ios).start();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            sk.setDefaultCloseOperation(sk.EXIT_ON_CLOSE);
        }
    }class inout implements Runnable
    {
        Socket iosocket=null;
        java.io.BufferedReader br=null;
        java.io.BufferedWriter bw=null;
        public inout(Socket ss)
        {
            this.iosocket=ss;
        }    public void run() {
            try
            {
                bw=new BufferedWriter(new java.io.OutputStreamWriter(iosocket.getOutputStream()));
                br=new BufferedReader(new java.io.InputStreamReader(iosocket.getInputStream()));
                if(true)
                {
                    String gets=br.readLine();
                    serversk.jta1.append(gets);
                }
                bw.write("收到");
                bw.flush();
                bw.close();
                br.close();
                this.iosocket.close();
            }
            catch(Exception ex)
            {
                
            }
        }
    }client端
    package h;
    import java.io.*;
    import java.net.*;
    import javax.swing.*;public class cinout extends javax.swing.JFrame {
        
        java.net.Socket c=new Socket();
        java.net.SocketAddress link_sa=null;
        BufferedWriter cout=null;
        BufferedReader cin=null;
        String link_sports="9516";
        String link_server_ip=null;
        boolean flag=false;
        public cinout() {
            initComponents();
            
        }
                           
        private void initComponents() {
    //略
        }// </editor-fold>                            private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//此处第一次按下收发正常,再按即报错        
             try{
                 if(cjtf1.getText().length()>0)
                 {
                         link_server_ip=java.net.InetAddress.getByName("www.abc.net").getHostAddress().toString();
                         link_sa=new java.net.InetSocketAddress(link_server_ip,java.lang.Integer.parseInt(link_sports));
                         c.connect(link_sa);
                         flag=true;                     cin=new BufferedReader(new java.io.InputStreamReader(c.getInputStream()));
                         cout=new BufferedWriter(new java.io.OutputStreamWriter(c.getOutputStream()));
                         cout.write(cjtf1.getText()+"\n");
                         cout.flush();
                         if(true)
                         {
                             String appstr=cin.readLine();
                             cjta1.append(appstr);
                         }
                         cout.close();
                         cin.close();
                         c.close();
                 }
                 else
                 {
                     cjtf1.setText("请输入信息");
                 }
                 
             }
             catch(Exception e)
             {
                 e.printStackTrace();
             }
             
        }                                        
        
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new cinout().setVisible(true);
                }
            });
        }
        
        // 变量声明 - 不进行修改                     
        private javax.swing.JTextArea cjta1;
        private javax.swing.JTextField cjtf1;
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JScrollPane jScrollPane1;
        // 变量声明结束                   
        
    }
      

  8.   


    -----------------------客户端package test2;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;public class Client {
    private Socket socket; private BufferedReader in; private PrintWriter out; public Client() {
    try {
    socket = new Socket("localhost", 8020);
    in = new BufferedReader(new InputStreamReader(socket
    .getInputStream()));
    out = new PrintWriter(socket.getOutputStream());
    System.out.println("请输入你要说的话");
    BufferedReader line = new BufferedReader(new InputStreamReader(
    System.in));
    String message = line.readLine();
    System.out.println(message);
    out.write(message);
    out.flush();
    line.close();
    in.close();
    out.close();
    socket.close(); } catch (UnknownHostException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    }
    } public static void main(String[] args) {
    // TODO 自动生成方法存根
    new Client();
    }}----------------------------服务器端package test2;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;public class Service { private ServerSocket ss; private Socket socket; private PrintWriter out; private BufferedReader in; public Service() {
    try {
    ss = new ServerSocket(8020);
    while (true) {
    socket = ss.accept();
    in = new BufferedReader(new InputStreamReader(socket
    .getInputStream()));
    out = new PrintWriter(socket.getOutputStream());
    String line = in.readLine();
    System.out.println("你输入的是" + line);
    out.close();
    in.close();
    socket.close();
    // ss.close();
    } } catch (IOException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    } } public static void main(String[] args) {
    // TODO 自动生成方法存根
    new Service();
    }}