Java Socket 通信 (三)

前言:经过昨天的学习,感觉对socket越来越熟悉了,但还是得多写写。业精于勤荒于嬉,行成于思毁于随!今天我写了一个与项目稍微接近的一个小程序。对socket越来越深入了。我模拟了两个接口,发送到服务器,服务器进行数据操作后,将数据返回给客户端。

一、服务器端代码 :



import org.json.JSONException;
import org.json.JSONObject;

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


/**
 * Created by demi on 16/10/12.
 */

public class JsonServer {

    public static void main(String args[]) {
        ServerSocket ss = null;
        Socket s = null;
        DataInputStream dis = null;
        DataOutputStream dos = null;

        try {
            ss = new ServerSocket(3320);
            s = ss.accept();
            System.out.println("Client :" + s.getInetAddress() + " : " + s.getPort() + " 已连接》》》》》》");
            dos = new DataOutputStream(s.getOutputStream());
            dis = new DataInputStream(s.getInputStream());
            while (true) {
                String data = dis.readUTF();
                System.out.println(data);
                if (null != data) {
                    if (!data.contains("data")) {
                        JSONObject jo = new JSONObject(data);
                        int a =jo.getInt("numA");
                        int b =jo.getInt("numB");
                        dos.writeUTF(creatSumJson(a,b));//写入数据到客户端

                    } else {
                        JSONObject jo = new JSONObject(data);
                        int a =jo.getInt("data");
                        for (int i = 0; i < 100; i++) {
                            a++;
                            dos.writeUTF(createRandomJson(a));//写入数据到客户端
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            try {
                dis.close();
                dos.close();
                s.close();
                ss.close();
                System.out.print("链接已断开");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
    /**
     * 模拟现实项目中的接口,在做了自加运算后创建一个json。
     */

    public static String createRandomJson(int a){
        JSONObject s = new JSONObject();
        try {
            s.put("data", a);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return s.toString() ;
    }

    /**
     * 模拟现实项目中的接口,获取客户端的两个加数,做完加法后返回给客户端。
     */
    //
    public static String creatSumJson(int a, int b){
        JSONObject s =new JSONObject();
        try {
            s.put("sum", a+b);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return s.toString() ;
    }
}
二、客户端代码:
 
JsonClient.java
package mysocket.jsonway;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Random;

/**
 * Created by demi on 16/10/12.
 */

public class JsonClient {

    public static void main(String args[]){
        DataOutputStream dos =null;
        Thread chat = null;
        Socket socket = null;
        DataInputStream dis =null;
        try {
            socket =new Socket("127.0.0.1",3320);
            dos =new DataOutputStream(socket.getOutputStream());
            dos.writeUTF(createRandomJson());//写入数据到服务器端
            chat = new Thread(new ChatThread(socket));
            chat.start();
            socket.setKeepAlive(true);
            int i = 0;
            while(i<=100){
                Thread.sleep(1000);
                dos.writeUTF(creatSumJson());//写入数据到服务器端
                i++;
            }
        } catch (IOException e) {
            e.printStackTrace();
            try {
                dos.close();
                socket.close();
                chat.stop();
                System.out.print("链接已断开");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    /**
     * 模拟现实项目中的接口,创建一个20以内的随机数的json,发送到服务器,让服务器做++运算,加一次向客户端推送一次结果。
     */

    public static String createRandomJson(){
        JSONObject s = new JSONObject();
        try {
            s.put("data", new Random().nextInt(20));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return s.toString() ;
    }

    /**
     * 模拟现实项目中的接口,创建两个100以内的随机数的json,发送到服务器,让服务器做完加法后返回给客户端。
     */
    //
    public static String creatSumJson(){
        JSONObject s =new JSONObject();
        try {
            s.put("numA", new Random().nextInt(100));
            s.put("numB", new Random().nextInt(100));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return s.toString() ;
    }
}
ChatThread.java
package mysocket.jsonway;

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

/**
 * Created by demi on 16/10/13.
 */

public class ChatThread implements Runnable {
    private Socket s = null;
    DataInputStream dis =null;
    public ChatThread(Socket s){
        this.s = s;
    }

    @Override
    public void run() {
        try {
            dis =new DataInputStream(s.getInputStream());
            while(true){
                System.out.println(dis.readUTF()); //打印来自服务器的数据
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
先启动服务器,再启动客户端,运行结果:
写到这,我就想到一个问题,目前只能一个客户端连接一个服务器,而现实项目中,很多客户端连接一个服务器的。所以需要将服务器改造改造。
JsonServer.java
 public static void main(String args[]) {
        ServerSocket ss = null;
        Socket s = null;
        Thread thread = null;
        try {
            ss = new ServerSocket(3320);
            while (true) {
                s = ss.accept();
                System.out.println("Client :" + s.getInetAddress() + " : " + s.getPort() + " 已连接》》》》》》");
                thread = new Thread(new ServerThread(s));
                thread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
可以看到,我写了一个while死循环,一直在accept(),少了好多代码,多了一个线程,只要一个客户端链接上来,我就新建一个线程,在线程中去操作数据,返回给客户端数据:
ServerThread.java
package mysocket.versionone;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

/**
 * Created by demi on 16/10/14.
 */
public class ServerThread implements Runnable {
    private Socket s = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;

    public ServerThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            while (true) {
                dos = new DataOutputStream(s.getOutputStream());
                dis = new DataInputStream(s.getInputStream());
                String data = dis.readUTF();
                System.out.println(data);
                if (null != data) {
                    if (!data.contains("data")) {
                        JSONObject jo = new JSONObject(data);
                        int a = jo.getInt("numA");
                        int b = jo.getInt("numB");
                        dos.writeUTF(creatSumJson(a, b));//写入数据到客户端
                    } else {
                        JSONObject jo = new JSONObject(data);
                        int a = jo.getInt("data");
                        for (int i = 0; i < 100; i++) {
                            a++;
                            dos.writeUTF(createRandomJson(a));//写入数据到客户端
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            try {
                dis.close();
                dos.close();
                s.close();
                System.out.print("链接已断开");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    /**
     * 模拟现实项目中的接口,在做了自加运算后创建一个json。
     */

    public static String createRandomJson(int a) {
        JSONObject s = new JSONObject();
        try {
            s.put("data", a);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return s.toString();
    }

    /**
     * 模拟现实项目中的接口,获取客户端的两个加数,做完加法后返回给客户端。
     */
    //
    public static String creatSumJson(int a, int b) {
        JSONObject s = new JSONObject();
        try {
            s.put("sum", a + b);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return s.toString();
    }
}

这样就搞定了。run!!!


总结:在写这个程序的时候,遇到了一个坑--Android环境下是自带jsonjar包的,可jdk中没有。还得自己导入。我最开始是在AS中写的,一运行就出现异常。LOG中的关键字 “stub”.导入了json包后还报错。没办法,换了个编译环境 ---> IDEA,导入json包,就搞定了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值