使用最基本socket编写程序
要求是当客户端连接上服务器后,socket一直不断开。
其中一端发送一个JSON对象,另外一端接收后做出处理,然后能够循环做上述事件。
每次发送的JSON对象的数据内容是随机的,每次发送的JSON对象转化为字符串的长度也是随机的。
求围观,求真相.................
因为服务端是别人用C/C++写的,我只能用socket来模拟服务端

解决方案 »

  1.   

    啥千古难题啊,别把人都吓死了Servlet别结束就行了,每次发送完毕记得调用 flush()参见:
    http://blog.csdn.net/ldh911/article/details/7268879
      

  2.   

    首先我承认我是标题党-_-!
    哥哥啊,我说了服务端是别人用C/C++写的只能用最基本的socket啊
    如果可以用其他的技术,我也能够解决,譬如apache的MINA也可以达到,问题是,现在我不能使用这些东西。只能用基本的socket。
    真实的场景是:服务端应用在ARM开发板上面,没有装JAVA环境,所以也没有servlet,也没有apache的MINA,
    我要实现的效果和QQ类似,客户端和服务器都可以主动发起消息。
      

  3.   


    既然是Socket,那就不要强调JSON了吧,难道你还要模仿HTTP协议么?我还是没看出难度究竟是啥,你用Java写过SocketServer 和 Socket 之间的通讯协议么?QQ的模型很简单(只是示例,并非实际情况):
    1、QQ服务器启动后,建立ServerSocket监听连接请求;
    2、Client启动时,通过Socket去连接QQ服务器;
    3、QQ服务器会接获连接请求,然后启动一条Worker线程来为该Socket连接提供服务;
    4、QQ服务器继续监听下一个连接请求;
    5、Client可以与服务端的Worker线程进行双向通讯了。
    给个简单的服务端示例:import java.io.*;
    import java.net.*;
    import java.util.*;public class EchoServer {
        public static final int PORT = 10000;    public static void main(String[] args) throws Exception {
            ServerSocket serverSocket = new ServerSocket(PORT);
            try {
                while (true) {
                    System.out.println("服务端就绪,等待客户端连接");                // 侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
                    Socket socket = serverSocket.accept();
                    System.out.println("有客户端连接上来了,已建立Socket链接");                EchoServerWorker worker = new EchoServerWorker(socket);
                    System.out.println("启动工作线程");
                    new Thread(worker).start();
                }
            } finally {
                serverSocket.close();
            }
        }
    }class EchoServerWorker implements Runnable {
        private Socket socket; // 工作线程所服务的目标Socket    EchoServerWorker(Socket socket) {
            this.socket = socket;
        }    public void run() {
            try {
                try {
                    // 准备输入输出端口
                    Scanner sc = new Scanner(socket.getInputStream());
                    OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
                    System.out.println("Socket for " + socket.getPort() + " started.");
                    
                    // 读取信息并直接返回,这里按行读取(\n)
                    String str;
                    while ((str = sc.nextLine()) != null) {
                        System.out.println("【From Client】" + str);
                        out.write(str + "\n");
                        out.flush();
                    }
                } finally {
                    socket.close();
                    System.out.println("Scoket for " + socket.getPort() + " closed.");
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }}