在下写了服务器端的程序:包testsocket,包中唯一文件Main.java   代码如下:目的接收来自客户端某个JTextField的内容,并显示在JTextArea jta1中,但不成功,请指教
package testsocket;
    import java.net.*;
    import java.io.*;
    import java.util.*;
    import java.lang.*;
    import javax.swing.*;public class Main extends javax.swing.JFrame {    private ServerSocket ss;    private Socket servers;    java.io.BufferedReader sdis=null;    java.io.InputStreamReader isr=null;    java.io.BufferedWriter bw=null;//输出流
    
    java.io.OutputStreamWriter osw=null;//    
    public Main() {
        initComponents();
        waitlink();
    }
    
    void waitlink()
    {
        try
        {
            ss=new ServerSocket(8000);
            
            servers=ss.accept();
            
            sdis=new BufferedReader(isr=new InputStreamReader(servers.getInputStream()));
            
            bw=new BufferedWriter(osw=new OutputStreamWriter(servers.getOutputStream()));
            while(sdis.readLine()!=null)
            {
                
                jta1.setText(    jta1.getText()+sdis.readLine()          );
                jta1.repaint();
                
            }
           bw.write("hello");
        }
        catch(Exception e)
        {
            
        }
    }
    
    
    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jta1 = new javax.swing.JTextArea();        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jLabel1.setText("\u670d\u52a1\u5668\u7aef");        jta1.setColumns(20);
        jta1.setRows(5);
        jScrollPane1.setViewportView(jta1);        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 343, Short.MAX_VALUE)
                .add(47, 47, 47))
            .add(layout.createSequentialGroup()
                .add(172, 172, 172)
                .add(jLabel1)
                .addContainerGap(180, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jLabel1)
                .add(19, 19, 19)
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 217, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(39, Short.MAX_VALUE))
        );
        pack();
        public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }
    
    // 变量声明 - 不进行修改                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jta1;
    // 变量声明结束                       
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【cqandy】截止到2008-07-24 13:25:48的历史汇总数据(不包括此帖):
    发帖的总数量:11                       发帖的总分数:270                      每贴平均分数:24                       
    回帖的总数量:9                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:11                       结贴的总分数:270                      
    无满意结贴数:1                        无满意结贴分:50                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:9.09  %               无满意结分率:18.52 %                  
    敬礼!
      

  2.   

    有客户端运行的程序:包clientsocket,包中唯一文件Main.java ,代码如下:
    package clientsocket;
    import java.net.*;
        import java.io.*;
        import java.util.*;
        import java.lang.*;
        import javax.swing.*;
    public class Main extends javax.swing.JFrame {    Socket c_soc=new Socket();
        java.net.SocketAddress sa=null;
        BufferedWriter bwout=null;
        BufferedReader brin=null;        java.io.InputStreamReader c_isr=null;
            String c_strin=null;
        public Main() {
            initComponents();
        }
        
        private void initComponents() {
            jLabel1 = new javax.swing.JLabel();
            jTextField1 = new javax.swing.JTextField();
            jButton1 = new javax.swing.JButton();
            jta1 = new javax.swing.JTextArea();
            jTextField2 = new javax.swing.JTextField();        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            jLabel1.setText("\u8f93\u5165\u670d\u52a1\u5668IP:");        jButton1.setText("\u53d1\u9001");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });        jta1.setColumns(20);
            jta1.setRows(5);        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(layout.createSequentialGroup()
                            .add(jTextField2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 263, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(14, 14, 14)
                            .add(jButton1))
                        .add(layout.createSequentialGroup()
                            .add(jLabel1)
                            .add(15, 15, 15)
                            .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 157, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(org.jdesktop.layout.GroupLayout.TRAILING, jta1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                        .add(jLabel1)
                        .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                    .add(jta1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
                    .add(17, 17, 17)
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                        .add(jTextField2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(jButton1))
                    .add(21, 21, 21))
            );
            pack();
        }// </editor-fold>                            private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO 将在此处添加您的处理代码:
             try{
                //c_soc=new Socket(jTextField1.getText().toString().trim(),8000);
                c_soc=new Socket();
                sa=new java.net.InetSocketAddress(jTextField1.getText(),8000);
                c_soc.connect(sa);
                bwout=new BufferedWriter(new java.io.OutputStreamWriter(c_soc.getOutputStream()));
                bwout.write(jTextField2.getText());
                //bwout.newLine();
                bwout.flush();
                
                brin=new BufferedReader(c_isr=new InputStreamReader(c_soc.getInputStream()));
                while(brin.readLine()!=null) {
                    jta1.setText(jta1.getText()+jTextField2.getText()+"\n");
                }
                
            } catch(Exception e) {
                
            }
            finally
            {
                try {
                    bwout.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                try {
                    c_soc.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }                                        
        
            public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Main().setVisible(true);
                }
            });
        }
        
        // 变量声明 - 不进行修改                     
        private javax.swing.JButton jButton1;//单击此按钮,就连接服务器并发送
        private javax.swing.JLabel jLabel1;
        private javax.swing.JTextField jTextField1;//输入服务器IP
        private javax.swing.JTextField jTextField2;//输入发送到服务器的内容
        private javax.swing.JTextArea jta1;
        // 变量声明结束                   
        
    }
      

  3.   

    我只有一台电脑,好象我怎么调,也调不出来呀,两个port8000重叠了感觉是
      

  4.   

    有点晕!下面的代码有点小问题: while(sdis.readLine()!=null) 

                    
      jta1.setText(jta1.getText()+sdis.readLine()); 
      jta1.repaint();           
    } 应改为:
    String lineStr = null;
    while((lineStr=sdis.readLine())!=null) 

                    
      jta1.setText(jta1.getText()+lineStr); 
      jta1.repaint();           
    } 另外,如果是在本机上测试,客户端的代码:
    sa=new java.net.InetSocketAddress(jTextField1.getText(),8000); //jTextField1.getText()的值应为localhost
      

  5.   

    客户端Socket调用getInputStream()一般获取的是阻塞流,也就是当调用阻塞流的read()方法时,客户端线程会一直阻塞在那里直至超时或有数据能够接收,监控的话可以在read()方法后写log语句,或利用tcpdump等工具;至于实时性由于服务端和客户端是在两个不同的进程(线程)里、客户端被动接收的特性及网络的原因(重发机制)很难做到。
      

  6.   

    增加个问题..如果我给这个项目服务端和客户端再加一层呢.现在这个是 服务端<---->客户端  进行交互.但是我现在想用代理服务器来实现这个东西.改怎么去做.也就是说给服务端和客户端中间加个代理服务器.起到一个中间层的意思.有哪位高手帮我解决一下.在下谢过了先.MSN:[email protected]
      

  7.   

    也许是在下没有把这个实时表达清楚!!!
    在下的意思其实是想说,比如:服务器端是通过
                ss=new ServerSocket(8000);
                
                servers=ss.accept();
    阻塞在那里,如果有client接入,就会连通这个client接入,并为之生成一个socket在服务器端,并且因为这个阻塞被一个client连接激活,而可以接收一个由此次client连接所发来的一个输出流,是吧.如果我理解没有错的话那么,如果服务器端,想要由某一个动作返回一个字符串,比如由服务器端的一个JButton按下后,传出一个JTextField中的值到一个client端,那么这个client端如何监视(或者说监听)服务器向它这个IP传来了一个返回数据呢???在下先不去讨论多客户,多线程,就一个c-s-c-s的点对点而言来向各位请教,望指点,client如何监听?
      

  8.   

    客户端不存在监听,当客户端和服务器连通后,接下来一般就是获得socket对象的输入输出流,向输出流发送数据,从输入流中读取数据,如果输出流中的数据没有发送完或输入流中没有数据,将处于等待(阻塞)状态。一般是两个线程分别处理输入和输出。java的socket与windows的socket的I/O模型有所不同,windows的I/O模型包括选择模型、异步选择模型、事件选择模型、重叠模型及完成端口模型,除选择模型外,其他的都是非阻塞的。java的没有这么复杂,我记得java也有非阻塞的模型,只是我手上现在没有资料,不好回答。
      

  9.   

    那么是不是可以理解为:我在做程序的时候,只要一连通了服务器,我就把一个接收输入流,放入一个线程中,让它自己等待接收.
    然后,我自己写一个事件来处理发送到server的信息?只要线程中接收到了一个由服务器传来的数据后,就是它在线程中处理相应的动作(比如,显示到某个容器中去)即可???
      

  10.   

    log语句是什么呀???兄台可否祥述一下或示例一下,谢谢
      

  11.   

    各位老师或者教在下一个办法怎么让一个client在接通了和服务器的一个socket后,等在那里,有数据来时,就处理数据,无数据来时,就监听等待java中的socket好象是读/传数据同步完成的,请老师斧正