CSDNRGY 2017-09-11 06:49 采纳率: 87.5%
浏览 978
已采纳

哪位大神能帮忙看下这个socket程序?

程序第一次可以发送pojo
但是第二次就无法发送pojo了
为什么呢?

可以把代码粘到本地运行下,只能发送一次消息,第二次不知道为什么就发不出去了

 package chat;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    private List<ObjectOutputStream> outs;
    private ServerSocket serverSocket;

    public Server() throws Exception{
        outs = new ArrayList<>();
        serverSocket = new ServerSocket(5000);
    }
    public void start() throws Exception {
        while (true) {
            Socket socket = serverSocket.accept();
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            outs.add(out);
            new Thread(()->{
                try {
                    ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
                    Msg msg = (Msg)in.readObject();
                    System.out.println(msg);
                    printMsg(msg);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    //广播
    public void printMsg(Msg msg) {
        outs.forEach(out->{
            try {
                out.writeObject(msg);
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

    //启动主线程
    public static void main(String[] args) throws Exception {
        System.out.println("服务器已启动");
        new Server().start();

    }

}
 package chat;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.Timestamp;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Client implements Runnable{

    private JFrame mFrame;
    private JPanel mPane;
    private JTextArea mArea;
    private JScrollPane mScrollPane;
    private JButton mButton;
    private JTextField mField;

    private Socket socket;
    private ObjectOutputStream out;
    private ObjectInputStream in;

    public Client() throws Exception {
        setUI();
        setNetWork();
    }

    private void setNetWork() throws Exception {
        socket = new Socket("127.0.0.1", 5000);
        out = new ObjectOutputStream(socket.getOutputStream());
        in = new ObjectInputStream(socket.getInputStream());
    }
    private void setUI() {
        mButton = new JButton("Send");
        mButton.setFocusable(false);
        mButton.setBackground(Color.WHITE);
        mButton.addActionListener((evt)->{
            //System.out.println(2);
            String message = mField.getText().toString();
            System.out.println(message);
            Msg msg = new Msg();
            msg.setSendUser("user1");
            msg.setSendTime(new Timestamp(System.currentTimeMillis()));
            msg.setSendContext(message);
           // System.out.println(msg);
            try {
                //为什么第二次发送不出去了?
                out.writeObject(msg);
                out.flush();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            mField.setText("");
            mField.requestFocus();
        });

        mField = new JTextField(20);

        mArea = new JTextArea(6, 18);
        Font font = new Font("sanserif", Font.BOLD, 24);
        mArea.setFont(font);
        mArea.setLineWrap(true);
        mArea.setWrapStyleWord(true);
        mArea.setEditable(false);

        mScrollPane = new JScrollPane(mArea);
        mScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        mScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        mPane = new JPanel();
        mPane.add(mScrollPane);
        mPane.add(mField);
        mPane.add(mButton);

        mFrame = new JFrame();
        mFrame.getContentPane().add(mPane, BorderLayout.CENTER);
        mFrame.setSize(480, 320);
        mFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mFrame.setLocationRelativeTo(null);
        mFrame.setVisible(true);

    }
    //运行线程
    @Override
    public void run() {
        try {
            //问题好像是在这里,但是不知道该怎么写,求大神帮忙
            while(true){
            //  System.out.println(1);
                 Msg msg = (Msg) in.readObject();
                 System.out.println(msg);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        new Client().run();
    }

}
 package chat;

import java.io.Serializable;
import java.sql.Timestamp;

public class Msg implements Serializable{

    String sendUser;
    String sendContext;
    Timestamp sendTime;
    public String getSendUser() {
        return sendUser;
    }
    public void setSendUser(String sendUser) {
        this.sendUser = sendUser;
    }
    public String getSendContext() {
        return sendContext;
    }
    public void setSendContext(String sendContext) {
        this.sendContext = sendContext;
    }
    public Timestamp getSendTime() {
        return sendTime;
    }
    public void setSendTime(Timestamp sendTime) {
        this.sendTime = sendTime;
    }
    @Override
    public String toString() {
        return "Msg [sendUser=" + sendUser + ", sendContext=" + sendContext + ", sendTime=" + sendTime + "]";
    }



}
  • 写回答

3条回答

  • qq_23488947 2017-09-15 03:21
    关注

    你这是神级程序或者神级需求

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题