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 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体