前言:经过昨天的学习,感觉对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
ChatThread.javapackage 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() ; } }
写到这,我就想到一个问题,目前只能一个客户端连接一个服务器,而现实项目中,很多客户端连接一个服务器的。所以需要将服务器改造改造。先启动服务器,再启动客户端,运行结果: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
可以看到,我写了一个while死循环,一直在accept(),少了好多代码,多了一个线程,只要一个客户端链接上来,我就新建一个线程,在线程中去操作数据,返回给客户端数据: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(); } }
ServerThread.javapackage 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包,就搞定了。