`
sunnylocus
  • 浏览: 870180 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

Java Socket使用小技巧

    博客分类:
  • Java
阅读更多

     这几天一直在写一个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,让它不停的去连服务端,当然了,服务器端没有启动肯定没法与服务器建立连接

启动服务器端

 

4
0
分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。...

    java jdk实列宝典 光盘源代码

    使用异常的技巧和原则; 7 IO输入输出流 获取文件的基本信息;列出指定目录下的文件,并可过滤文件;创建文件和目录;删除文件和目录;移动文件和目录; 复制文件和目录;一个简单的文件搜索器; 多种方式读文件内容...

    清华大学JAVA教程

    ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本概念和编程简介 ◇9.4 EJB简介 ◇本...

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    6.2.3 使用点操作符的技巧 148 6.2.4 类的数组 149 6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    6.2.3 使用点操作符的技巧 148 6.2.4 类的数组 149 6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 ...

    java 精美 多人聊天系统

    2、其中所有涉及底层文件保存和用户信息保存采用了文件读写(该部分十分重要,是整个系统正常运作的基础,该部分由...效果展示图和更多小技巧尽在:http://blog.csdn.net/ahmclishihao/article/details/52732698

    软件工程师Java班课程

    J2SE平台Java程序设计 Java AWT图形界面程序开发,Swing图形程序设计, Socket网络应用程序设计,对象序列化,Java 常用数据结构,Applet,高级I/O流和文件编程,多线程程序设计 熟练掌握J2SE平台的Java程序设计技能 ...

    java 小项目,用于学习,总结经验知识

    自己整理的一些java方面的技巧知识,对平时的应用,学习还是比较有用的.

    21天学通Java-由浅入深

    28 1.3 程序开发过程 29 1.4 编码规范 29 1.5 HelloWorld:第一个Java程序 30 1.5.1 编写程序代码 30 1.5.2 编译程序代码并运行 30 1.5.3 注意事项 31 1.6 使用Eclipse集成开发工具开发 32 1.7 综合练习 32 1.8 小结...

    java网络编程技术课程设计.doc

    正确的使用WindowsSocket,就可使得不同地址下的进程得以在Windows环境下顺利进 行各种网络通信,因此研究WinSock更有意义。而基于TCP/IP协议网络环境下的应用程序 是通过客户机/服务器(C/S)作用方式模式在网络(应用)...

Global site tag (gtag.js) - Google Analytics