高手,您好:
        小弟遇到的故障如下:
        小弟设计了一个全双工通信实验,由两个通信端点C端与S端组成。
        运行其中的通信接收端S端,它的源代码如下:
        package pack;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;public class Server extends JFrame {
    Vector<Socket> v = new Vector<Socket>(); // 创建存放客户端连接套接字的集合
    int port;// 端口号
    JTextField jtf; // 设置为属性 方便写事件的时候使用    public Server() { // 设置服务器默认窗口
        this.setTitle("基于TCP协议的服务器中转聊天");
        this.setSize(320, 100);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation(d.width / 2 - getWidth() / 2, d.height / 2 - getHeight() / 2);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);
        setAlwaysOnTop(true);        // 文本框 输入端口号
        jtf = new JTextField();
        jtf.setColumns(10);
        jtf.setBounds(10, 10, 80, 30);
        jtf.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                char c = e.getKeyChar();
                if ('\n' == c) {
                    String s = jtf.getText();
                    if (s.matches("[0-9]{4,6}")) {
                        port = new Integer(s);
                        setVisible(false); // 该设置要放在服务区启动之前
                        server();
                    } else {
                        jtf.setText("");
                        JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
                    }
                }
            }
        });
        this.add(jtf);
        // 按钮 启动服务器(事件)
        JButton jb = new JButton("启动服务器");
        jb.setBounds(180, 10, 100, 30);
        jb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String s = jtf.getText();
                if (s.matches("[0-9]{4,6}")) {
                    port = new Integer(s);
                    setVisible(false); // 该设置要放在服务区启动之前
                    server();
                } else {
                    jtf.setText("");
                    JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
                }
            }
        });
        this.add(jb);
    }    public void server() {
        // 创建服务器,病不停等待客户端连接,并将客户端连接存入集合
        try {
            ServerSocket s = new ServerSocket(2222);//这里的端口号“9999”是为Server端的本地端口号。
            System.out.println("服务器已创建...");
            while (true) {
                Socket c = s.accept();// 等待客户端响应
                System.out.println("客户端+[" + c.getInetAddress() + "]已连接");
                v.add(c); // 将连接的客户端套接字放入集合,存放起来
                // 启动转发线程
                Transmit t = new Transmit(); // new一个线程实例
                t.c = c; // 将连接的客户端套接字C传递给线程
                t.start();
            }
        } catch (IOException e) {
            System.out.println("服务器启动出错");
            e.printStackTrace();
        }
    }    public class Transmit extends Thread { // 实现转发功能的线程
        Socket c;        public void run() {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                while (true) { // 循环读取
                    String s = br.readLine();
                    System.out.println("成功!!=========="+s);
                    for (Socket c : v) { // 转发给其他所有已连接的线程
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
                        bw.write(s + "\n");
                        bw.flush();
                    }
                }
            } catch (IOException e) {
                System.out.println(c.getInetAddress() + "已退出");
                v.remove(c);// 不执行服务器会出现问题 要经常重启
            }
        }
    }    public static void main(String[] args) {
        new Server().setVisible(true);
    }
}
        接着,小弟运行了源代码如下的通信C端的主类TestServerSocket:
        package test0;import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;public class TestServerSocket extends JFrame{
// JTextArea jta = new JTextArea();
JTextField jtf = new JTextField();
JTextField jtf0 = new JTextField();
JButton jb = new JButton();
// JButton jb0 = new JButton();
JPanel jp = new JPanel();
String str0;
String str1;
int port;

public TestServerSocket() {
// TODO Auto-generated constructor stub
jp.setBounds(new Rectangle(0,0,400,200));
jp.setLayout(new BorderLayout());
// jp.add(jta,BorderLayout.NORTH);
jp.add(jtf,BorderLayout.NORTH);
jp.add(jtf0,BorderLayout.SOUTH);
jp.add(jb,BorderLayout.EAST);
// jp.add(jb0,BorderLayout.WEST);
this.add(jp);
this.setBounds(new Rectangle(200,100,400,200));
this.setVisible(true);
jb.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try{
String str1 = jtf.getText();
// jta.setText(str);
String str0 = jtf0.getText();
if(str0!=""){
System.out.println("abc");
}
str1 = jtf.getText();
port = Integer.parseInt(str1);
System.out.println(str0);
System.out.println(port);Socket s = null;
try {
 s = new Socket("127.0.0.1",2222);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
BufferedWriter bw = null;
            try {
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
            try {
bw.write("Hello_World"+"\n");
WriteStr obj = new WriteStr(s,"Hello_World"+"\n");
obj.start();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}catch(Exception e2){
e2.printStackTrace();
}
}});
this.add(jp);
} public static void main(String[] args) {
// TODO Auto-generated method stub
new TestServerSocket();
}}        上面“TestServerSocket类”中的“WriteStr类”,它的源代码如下:
        package test0;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;public class WriteStr extends Thread{
static Socket s = null;
BufferedWriter bw = null;
String str = null;

public WriteStr(Socket s,String str){
this.s = s;
try {
bw = new BufferedWriter(new OutputStreamWriter(this.s.getOutputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.str=str;
}

public void run(){
try {
bw.write("CJCO"+this.str);
System.out.println("++++Client端write下方++++"+this.str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}        高手,现在小弟运行完毕S端Server类与C端TestServerSocket类之后,得到的运行结果如下:
        
        小弟点击其中的“JButton按钮”,得到下面S端的监视器console的报告:
        “
        服务器已创建...
        客户端+[/127.0.0.1]已连接
        ”
        于是,小弟定位到“客户端+”关键字所在的小弟实验项目的代码现场,得到代码如下:
       
        高手,小弟自认为,上面的小弟的S端接收用户写数据的readLine()方法代码现场,没有什么没有考虑到的地方。怎么S端的console窗口,就是打印不出来应当接收到的值呢?
        希望得到高手的点拨!!
        谢谢高手的过目!!

解决方案 »

  1.   


    1.做一下输入输出非空校验,看看有没有获取到
    2.通过DEBUG,检查一下swing界面按钮触发事件,是否有把值获取正确
    3.最后就是端口问题,检查一下端口有没有被占用
      

  2.   

    不知道你是如何使用对象流传递数据得,客户端服务器端最好做个common包,不然接收不到传递过来的对象。
      

  3.   

    没看到你把消息输出到console上,客户端也没有接收服务器传的消息