2 u013179958 u013179958 于 2017.09.11 14:49 提问

哪位大神能帮忙看下这个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
qq_23488947   2017.09.15 11:21
已采纳

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

coki4568213
coki4568213   2017.09.11 17:43

你客户端的socket连接只创建了一次,可以通过循环多创建几个试试。
比如:

  public static void main(String[] args) throws Exception {
        while(true) {
                new Client.start();
                Thread.sleep(1000);
    }
    }
u013179958
u013179958   2017.09.11 22:30

问题找到了,服务端需要加一个循环,用于监听

     public void start() throws Exception {
        while (true) {
            Socket socket = serverSocket.accept();
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            while (true) {
                 Msg msg = (Msg)in.readObject();
                 out.writeObject(msg);
                 out.flush();

            }

        }
    }
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
国际标准智商测试题 (转载)
​国际标准智商测试题 (转载)     智商,就是IQ(Intelligence Quotient的简称),通俗地可以理解为智力,是指数字、空间、逻辑、词汇、创造、记 忆等能力,它是德国心理学家施特恩在1912年提出的。智商表示人的聪明程度:智商 越高,则表示越聪明。想检验自己的智商是多少吗?这并不困难,以下就是一例国内 较权威的IQ测试题,请在30分钟内完成(30题),之后你就
《SQL入门经典》学习笔记
第一部分  SQL概念综述 第1章  欢迎来到SQL世界 1.4.1 表命名标准 表的名称以_TBL作为后缀,表的索引以_INX为后缀 1.4.3 表的构成 字段是表里的一列,记录是表里的一行 第二部分  建立数据库 第2章  定义数据结构 2.2.1 定长字符串 CHARACTER(n): n为最大字符数,通常用空格来填充数量不足的字符 2.2.2 变长字符串
构建JDK8报错了,哪位大神能帮忙看下什么原因 ?
构建JDK8报错了,哪位大神能帮忙看下什么原因 ?
请问有哪位大神能破解这个DLL?
请问有哪位大神能破解这个DLL?
复制粘贴软件TXMouse
哪位大侠帮忙看下这个软件用vb6怎么实现,并改进下: TXMouse官网http://fy.chalmers.se/~appro/nt/TXMouse/
众数的程序(使用到快速排序)
以下这个众数的程序,帮忙看下哪里出错了?
xshell5简体中文版安装包
xshell5简体中文版安装包,使用方便,一直下一步就可以安装完成。
大学生贷款
该系统分为三个基本的角色,分别是学生、校方负责人、银行负责人,对应的功能你们自己可以看看,我自己的毕设课题,希望对你有用。
libcrypto-1_1-x64.dll
适用于WINDOW64位下的libcrypto-1_1-x64.dll,由openssl编译生成,经测试可以使用,欢迎下载,如有问题,可私信给我
Android Binder驱动源码下载地址
最近在看《Android框架揭秘》,看到第七章 Android Binder IPC时,其中有涉及到Binder驱动的代码,想了解一下, 找了半天没有一个有效的链接参考,自己动手找: https://android.googlesource.com/kernel/common.git/+/android-3.4/drivers/staging/android/ 我个人测试发现,使