本文共 4563 字,大约阅读时间需要 15 分钟。
这几天一直在写一个GPS+SMS模式的定位程序,流程大致是这样,首先接收用户的定位请求,然后把这个请求按照制定的协议用xml包装,用Socket发给短信服务器,短信服务器发送指令至终端,终端反回经续度,然后再把这个经纬度送到GIS系统,获取地理信息位置描述,最后把这个结果返回给客户端。
但是因为网络或其它的原因,短信服务器经常没有响应,因此必须不停的建接,直到这个连接被建立。
client code
package com.tdt.client;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import java.util.Timer;import java.util.TimerTask;import javax.net.SocketFactory;public class Client { private static Client client; private static Timer timer = new Timer(); private static String host="localhost"; private int port =5555; private static Socket socket; private Client() throws UnknownHostException, IOException { socket = SocketFactory.getDefault().createSocket(host, port); System.out.println("connection "+host+":"+port+" success!"); } //获得输出对象 private PrintWriter getWriter(Socket socket) throws IOException { OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut,true); } //获得读取对象 private BufferedReader getReader(Socket socket) throws IOException { InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } //会话 public void talk() throws IOException { try { BufferedReader br = getReader(socket); PrintWriter pw = getWriter(socket); BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String msg=null; while((msg=localReader.readLine()) !=null) { if(msg.equalsIgnoreCase("bye")) { System.out.println("会话结束"); break; } pw.println(msg); System.out.println("server:"+br.readLine()); } }catch(IOException e) { e.printStackTrace(); }finally { try {if (socket !=null)socket.close();} catch(IOException e) { e.printStackTrace(); } } } //实例化client public static void instance() { if(client ==null) { try { client = new Client(); } catch (Exception e) { System.err.println(e.getMessage() +":"+host); } } } public static void main(String[] args) throws Exception{ if(args.length !=0) { host = args[0].toString(); } //用阻塞方法或计时器不断与服务连接,直到连接被建立 /* while(true) { System.out.println("开始实例化"); instance(); if(client !=null) break; Thread.sleep(1000 *5); } client.talk(); */ timer.schedule(new TimerTask() { public void run() { if(client ==null) { instance(); } else { timer.cancel(); try { client.talk(); } catch (IOException e) {System.err.println("IO流异常"); } } } }, 0, 1000 * 5); }}
server code
package com.tdt.server;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Server { private ServerSocket serverSocket = null; private Socket socket = null; private int port =5555; public Server() { try { serverSocket = new ServerSocket(port); System.out.println("服务器端监听"+port+"端口"); } catch (IOException e) { e.printStackTrace(); } } //获取输入流读取对象 public BufferedReader getReader(Socket st) throws IOException { InputStream socketIn = st.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } //获取输出对象 public PrintWriter getWriter(Socket st) throws IOException{ OutputStream out = st.getOutputStream(); return new PrintWriter(out,true); } public String echo(String msg) { return "通讯测试,由服务器端发出"; } public void service() { try { socket=serverSocket.accept(); System.out.println("有客户端连接"); System.out.println("IP="+socket.getInetAddress()+":"+socket.getPort()); } catch (IOException e1) { e1.printStackTrace(); } while(true) { try { BufferedReader br = getReader(socket); PrintWriter pw = getWriter(socket); String msg = null; while((msg =br.readLine()) !=null) { System.out.println("client:"+msg); String echoMsg = echo(msg); pw.println(echoMsg); System.out.println("服务器回应:"+echoMsg); if(msg.equalsIgnoreCase("bye")) { break; } } }catch(IOException e) { e.printStackTrace(); System.out.println("IO流异常"); } finally { try { if(serverSocket!=null) serverSocket.close(); if(socket !=null) socket.close(); System.out.println("通讯测试结束,服务器端关闭"); System.exit(0); } catch(IOException e) {e.printStackTrace();} } } } public static void main(String[] args) { //启动服务器 new Server().service(); }}
先启动client,让它不停的去连服务端,当然了,服务器端没有启动肯定没法与服务器建立连接
启动服务器端
转载地址:http://mdkxi.baihongyu.com/