wanghef 2015-05-03 02:55 采纳率: 0%
浏览 997

为什么serversocket每次收到的消息都是一样的

请大家帮忙看看,为什么每次serversocket收到的信息都是一致的,如何解决。谢谢。
用户名1101密码1111
详细代码
package client;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;
import java.util.Scanner;

import cash.Cashier;
import warehouse.StoreKeeper;
import datas.Datas;
import datas.Goods;
import datas.User;

public class ClientDemo {

public static void main(String[] args) throws IOException {


    Scanner input = new Scanner(System.in);
    Socket socket = null;
    InputStream is = null;
    OutputStream os = null;
    ObjectOutputStream oos = null;
    ObjectInputStream ois = null;
    User user=null;
    // 登陆界面
    System.out.println("***********欢迎使用超市管理系统***********");
    System.out.println("1.登陆");
    System.out.println("2.退出系统");
    System.out.println("*****************请选择数字1/2*****************");
    int n = input.nextInt();
    if (n == 1) {

        do {
            socket = new Socket("localhost", 8800);
            is = socket.getInputStream();
            os = socket.getOutputStream();
            oos = new ObjectOutputStream(os);
            ois = new ObjectInputStream(is);

            try {
                /*
                 * 给用户赋值,用户名和密码
                 */
                user = new User();
                System.out.print("请输入用户名:");
                user.setName(input.next());
                System.out.print("请输入密码:");
                user.setPassword(input.next());
                // 写出对象
                oos.writeObject(user);
                /*
                 * 读取服务器返回的对象数据
                 */
                Datas datas = (Datas) ois.readObject();
                String msg = datas.getMsg();
                if (msg != null) {
                    System.out.println(msg);
                }
                user = datas.getUser();
                /*
                 * 判断是否是仓库管理员
                 */

                if (user != null) {

                    if (user.isAdmin()) {
                        StoreKeeper storeKeeper = new StoreKeeper();
                        System.out.println("*****欢迎登陆超市库存管理系统*****");
                        do {
                            storeKeeper.showMenu();
                            //Goods good=new Goods();
                            String choise=input.next();
                            datas.setChoose(choise);
                            oos.writeObject(datas);

                        } while(true);

                    } else {
                        Cashier cashier = new Cashier();
                        System.out.println("*****欢迎登陆超市收银系统*****");

                        cashier.showMenu();




                    }
                }

            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                ois.close();
                oos.close();
                is.close();
                os.close();
                socket.close();
            }
        } while (user == null);
    } else {
        System.exit(1);

    }
}
package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {

public static void main(String[] args) throws IOException {
    //服务端
    ServerSocket ss=new ServerSocket(8800);
    while(true){
        Socket socket=ss.accept();
        ServerThread st=new ServerThread(socket);
        st.start();
    }
}

}
package server;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import datas.Datas;
import datas.Goods;
import datas.User;

public class ServerThread extends Thread{
private Socket socket;
//利用构造方法进行初始化
public ServerThread(Socket socket) {
this.socket = socket;
}

public void run() {
    InputStream is = null;
    OutputStream os = null;
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;


    try {


        ServerBiz biz = new ServerBiz();


        is = socket.getInputStream();
        os = socket.getOutputStream();
        ois = new ObjectInputStream(is);
        oos = new ObjectOutputStream(os);
        User user = (User) ois.readObject();
        Datas datas = new Datas();
        //Goods good=null;
        user = biz.login(user);
        if (user != null) {
            datas.setUser(user);
            // datas.setMsg("登陆成功");
        } else {
            datas.setMsg("用户名或密码输入错误!登陆失败!");
        }
        oos.writeObject(datas);
        while(user!=null){

        datas=(Datas)ois.readObject();
        System.out.println(datas.getChoose());
        //System.out.println(datas.getGood().getGoodId());



        //oos.writeObject(datas);
        oos.flush();

        }


    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {

        try {
            oos.close();
            ois.close();
            os.close();
            is.close();
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 18:59
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Java中,Serversocket 是一个用于监听网络连接的工具类,主要用于处理客户端与服务器之间的通信。然而,你提到的问题似乎是关于 ServerSocket 的某个特定行为或者问题,但你的描述不够清晰。如果你是在问为什么 ServerSocket 每次接收的消息都是相同的,那么这可能是因为 ServerSocket 在等待新连接时会一直阻塞,直到有新的客户端尝试连接到它。当有新的客户端连接进来后,服务器会自动关闭当前连接并创建一个新的连接来处理这个新来的客户端。

    要解决这个问题,你可以考虑以下几种方法:

    1. 增加线程池:如果服务器总是处于阻塞状态,可以考虑将服务器设置为非阻塞模式(即允许其他线程并发执行)。这样可以减少服务器的阻塞时间,并提高响应速度。

      @Override
      public void run() {
          try {
              ServerBiz biz = new ServerBiz();
              ServerSocket ss = new ServerSocket(8800, 5, InetAddress.getByName("localhost"));
              while (!socket.isClosed()) {
                  Socket socket = ss.accept();
                  ServerThread st = new ServerThread(socket);
                  st.start();
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      
    2. 优化服务器结构:如果你的服务器非常繁忙并且无法满足所有请求,考虑扩展服务器的资源或能力。例如,添加更多的处理器、内存或其他资源,以确保服务器能够更好地处理请求。

    3. 使用多线程或多进程:如果你的应用程序具有多个任务或子任务,可以考虑使用多线程或多进程来管理这些任务。这可以通过在服务器上运行多个线程来实现,每个线程处理不同的任务。

    4. 使用消息队列:如果服务器接收到大量相同类型的请求,可以考虑使用消息队列来存储这些请求。然后,当服务器有空闲的时间时,它可以从消息队列中取出请求并处理它们。

    5. 监控和日志:定期检查服务器的日志文件,查看是否有任何异常情况。这有助于识别潜在的问题并提供解决方案。

    请注意,以上建议都需要根据具体情况进行调整。你需要根据你的应用程序的具体需求来选择最合适的解决方案。

    评论

报告相同问题?