博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Socket使用小技巧
阅读量:4156 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
VMware Workstation 14中文破解版下载(附密钥)(笔记)
查看>>
日志框架学习
查看>>
日志框架学习2
查看>>
SVN-无法查看log,提示Want to go offline,时间显示1970问题,error主要是 url中 有一层的中文进行了2次encode
查看>>
NGINX
查看>>
Qt文件夹选择对话框
查看>>
DeepLearning tutorial(7)深度学习框架Keras的使用-进阶
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>
转载知乎-前端汇总资源
查看>>
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>
HTML 5 新的表单元素 datalist keygen output
查看>>
(转载)正确理解cookie和session机制原理
查看>>
jQuery ajax - ajax() 方法
查看>>
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>