当前位置: 首页 > 知识库问答 >
问题:

客户端服务器,设计协议

苏涛
2023-03-14

我在套接字上编写客户机-服务器应用程序,我有任务设计我自己的协议。客户端和服务器与XML通信。我使用JAXB库。客户机将XML完美地写入输出流。但我无法在服务器上读取它。你能演示一下如何正确接收客户端的数据吗?

public class Client {
    public static final String SERVER_HOST = "localhost";
    public static final Integer SERVER_PORT = 4444;
    public static final Logger LOG = Logger.getLogger(Client.class);

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

        System.out.println("Welcome to Client side");
        XMLProtocol protocol = new XMLProtocol();
        Socket fromserver = null;

        fromserver = new Socket(SERVER_HOST, SERVER_PORT);

        BufferedReader in = new BufferedReader(new InputStreamReader(fromserver.getInputStream()));

        PrintWriter out = new PrintWriter(fromserver.getOutputStream(), true);

        BufferedReader inu = new BufferedReader(new InputStreamReader(System.in));

        String fuser, fserver;

        while ((fuser = inu.readLine()) != null) {

            protocol.setComId((long) 0);
            protocol.setContent("Client content");
            protocol.setLogin("User");

            try {

                JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);
                Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
                jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                jaxbMarshaller.marshal(protocol, out);

            } catch (JAXBException e) {
                LOG.error("Error while processing protocol"+e);             
            }

            fserver = in.readLine();

            System.out.println(fserver);

            if (fuser.equalsIgnoreCase("close"))
                break;
            if (fuser.equalsIgnoreCase("exit"))
                break;
        }

        out.close();
        in.close();
        inu.close();
        fromserver.close();
    }

}
package dataart.practice.server;

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

import org.apache.log4j.Logger;

public class Server {

    public static final Logger LOG = Logger.getLogger(Server.class);
    public static final String SERVER_HOST = "localhost";
    public static final Integer SERVER_PORT = 4444;
    public static Integer userCount = 0;

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

        LOG.trace("Server started");
        ServerSocket s = new ServerSocket(SERVER_PORT);

        try {
            while (true) {
                LOG.trace("Waiting for connections...");
                Socket socket = s.accept();

                try {
                    new ServerThread(socket);
                    LOG.trace("Users in the chat: "+(userCount+1));
                    userCount++;

                } catch (IOException e) {
                    socket.close();
                }
            }
        } finally {
            s.close();
        }
    }
}

还有我的线。

public class ServerThread extends Thread {
    private static final Logger LOG = Logger.getLogger(ServerThread.class);
    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;
    private String buffer;
        public ServerThread(Socket s) throws IOException {
        socket = s;
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
        start();
    }

    public void run() {
        try {
            while (true) {

            //  if ((buffer = in.readLine()).endsWith("</xmlProtocol>")) {
                    JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);
                    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                    sXMLProtocol protocol = (XMLProtocol) jaxbUnmarshaller.unmarshal(in);
                    LOG.trace("Getting message from user" + protocol.getContent());
                }
                LOG.trace("Nop");
            }
        } catch (JAXBException e) {
            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        } finally {
            try {
                socket.close();
                LOG.trace("Socket closed");
            } catch (IOException e) {
                LOG.error("Socket no closed" + e);
            }
        }
    }
}

我应该在服务器上写什么来解析我得到的XML?我尝试解析InputStream。

编辑我的问题:现在它显示我异常。我改变马歇尔参数。

共有1个答案

闻人思聪
2023-03-14

你试过调试线路吗

    (buffer = in.readLine()).endsWith("</xmlProtocol>")

也许它的结果是假的

 类似资料:
  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 我使用的是hazelcast v3。2.4客户-

  • 我有一个客户端服务器的情况,每一方都在测量时间,但似乎有一个问题,即测量的时间不匹配。长话短说,这个想法是有一个倒计时,之后程序需要做事情。我在服务器端测量这个。但是,倒计时需要显示,所以我所做的是在客户端单独运行它。最终结果是,当服务器发送消息时,客户端显示为23秒,该消息表明时间倒计时为10分钟。 客户端为XNA,代码: 然后从可用时间中减去计时器,并显示出来。在服务器端,这种情况正在发生:

  • 前面的章节介绍了所有 Redis 的重要功能组件: 数据结构、数据类型、事务、Lua 环境、事件处理、数据库、持久化, 等等, 但是我们还没有对 Redis 服务器本身做任何介绍。 不过, 服务器本身并没有多少需要介绍的新东西, 因为服务器除了维持服务器状态之外, 最重要的就是将前面介绍过的各个功能模块组合起来, 而这些功能模块在前面的章节里已经介绍过了, 所以本章将焦点放在服务器的初始化过程,

  • 客户端设计 客户端设计是CAT系统设计中最为核心的一个环节,客户端要求是做到API简单、高可靠性能、无论在任何场景下客户端都不能影响各业务服务的性能(监控只是公司核心业务流程一个旁路环节)。以下客户端设计以及细节均以java客户端为例子。 设计架构 CAT客户端是java,客户端在收集端数据方面使用ThreadLocal,是线程本地变量,也可以称之为线程本地存储。线程局部变量(ThreadLoca