一个同学弄了一个服务器与客户端界面通信的简单实现,其想法非常怪,发送消息竟然用线程死循环监听,用一个if语句判断点击按钮后得到文本框的字符串是否为‘’;不是则发送,是则循环。这个代码我看了以后也相当的无语,运行后非常卡,最后连eclipse也启动不了,死循环的后遗症.但是这毕竟是他自己的想法,也是一种提升。问题是客户端发服务器都能接收,服务器发客户端有时接受有时接受不到,我用System.out.pritnln("")跟踪了下,发现当服务器放松客户端接收不到的时候,服务器确实是发过去了,问题出现在客户端了,这个问题我也遇到过,那时是用了ObjectOutputStream造成并发异常也产生的,原因new了多个ObjectOutputStream对象,可是其他流应该没有这个异常吧。我怀疑是服务器发送客户端的时候,接受消息有两个处理函数。 我无能为力了,只能来请教给位java前辈。代码下面贴出.

解决方案 »

  1.   

    客户端.package day01;
    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.Socket;
    import java.util.Scanner;
    public class Client {
    Socket socket;
    InputStream in;
    OutputStream out;
    FtpServerJFrame jf;
    public Client(FtpServerJFrame jf) {
    this.jf = jf;
    }
    public void open(String host, int port) throws Exception {
    socket = new Socket(host, port);
    in = socket.getInputStream();
    out = socket.getOutputStream();
    new send(socket,out).start();
    new resver(socket, in).start();
    }

    class send extends Thread {//发送
    Socket socket;
    OutputStream out;
    public send(Socket socket,  OutputStream out) {
    this.socket = socket;
    this.out = out;
    }
    public void run() {
    while (true) {
    PrintWriter pw = new PrintWriter(out, true);
    try {
    // Scanner c = new Scanner(System.in);
    if (!(jf.getWords()).equals("")) {
    String str = jf.getWords();
    pw.println(str);
    jf.Empety();
    System.out.println("发送成功!");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    class resver extends Thread{//接收
    Socket socket;
    InputStream in;
    public resver(Socket socket, InputStream in) {
    this.socket = socket;
    this.in = in;

    }
    public void run(){
    while(true){
    BufferedReader br = new BufferedReader(
    new InputStreamReader(in));
    try {
    String mes;
    mes = br.readLine();
    System.out.println(mes);
    if (!mes.equals("")) {
    System.out.println(mes);

    jf.setText(mes);
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }
    public static void main(String[] args) throws Exception {
    FtpServerJFrame jf = new FtpServerJFrame();
    Client c = new Client(jf);
    Socket socket = new Socket("192.168.0.102", 7700);
    c.open("192.168.0.102", 7700);
    }
    }
      

  2.   

    package day01.Clint;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;
    import java.util.Scanner;import day01.Clint.FtpServer.resver;public class ftp {
    Socket socket;
    InputStream in;
    OutputStream out;
    private String str ;
    private FtpServerJFrame jf;
    public ftp(FtpServerJFrame jf){
    this.jf = jf;
    }
    public void listen(int port) throws Exception {
    ServerSocket ss = new ServerSocket(port);
    while(true){
    socket = ss.accept();
    in = socket.getInputStream();
    out = socket.getOutputStream();
    new send(socket,out).start();
    new resver(socket, in).start();
    }

    }

    class send extends Thread {//发送
    Socket socket;
    OutputStream out;
    public send(Socket socket,  OutputStream out) {
    this.socket = socket;
    this.out = out;
    } public void run() {
    while (true) {
    PrintWriter pw = new PrintWriter(out, true);
    try {
    // Scanner c = new Scanner(System.in);
    String cmd = jf.getWords();
    if (!cmd.equals("")) {
    //String str = jf.getWords();
    pw.println(cmd);
    System.out.println(cmd+"3");
    jf.Empety();
    System.out.println("发送成功!");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    } }
    }
    class resver extends Thread{//接收
    Socket socket;
    InputStream in;
    public resver(Socket socket, InputStream in) {
    this.socket = socket;
    this.in = in;

    }
    public void run(){
    while(true){
    BufferedReader br = new BufferedReader(
    new InputStreamReader(in));
    try {
    String mes;
    if ((mes = br.readLine()) != null) {
    System.out.println("运行了没有,服务器");

    jf.setText(mes);
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

    public static void main(String[] args) throws Exception {
    FtpServerJFrame ftp = new FtpServerJFrame();
    ftp ftp1 = new ftp(ftp);
    ftp1.listen(7700);
    }
    }
      

  3.   

    package day01.Clint;
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    public class FtpServerJFrame extends JFrame {
    private JTextArea text;
    private JTextArea mes;
    String words="";
    private JButton send;
    private JButton cancel;
    public FtpServerJFrame() {
    super("服务器");

    init();
    }
    public void init(){ setLayout(new BorderLayout());
    setSize(600, 400);
    add(create(),BorderLayout.CENTER);
    add(createUp(),BorderLayout.SOUTH);
    setVisible(true);

    }
    public JPanel createUp(){
    JPanel pane = new JPanel();
    send = new JButton("发送");
    send.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
    setWords();
    }
    });
    cancel = new JButton("取消");
    pane.add(send);
    pane.add(cancel);
    return pane;
    } public JPanel create(){
    JPanel pane = new JPanel (new GridLayout(2, 1));
    pane.add(contentPane());
    pane.add(createMessage());
    return pane;
    }
    public JPanel contentPane(){
    JPanel pane = new JPanel(new BorderLayout());
    JTextArea t = new JTextArea("等待客户端连接....");
    text = t;
    pane.add(text,BorderLayout.CENTER);
    return pane;
    }
    public JPanel createMessage(){
    JPanel pane = new JPanel(new BorderLayout());
    JTextArea t = new JTextArea("消息界面....");
    mes = t;
    pane.add(t,BorderLayout.CENTER);
    return pane;
    }
    public void setText(String str){
    text.setText(str);
    }
    public void setWords(){
    words =  mes.getText();
    System.out.println(words+"1");
    }
    public String getWords(){
    return words;
    }
    public void Empety(){
    mes.setText("");
    words = "";
    }
    public static void main(String[] args) throws Exception {

    FtpServerJFrame a = new FtpServerJFrame();
    }
    }