`
sunnylocus
  • 浏览: 876689 次
  • 性别: 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 socket gui 的小 demo

    总之,Java Socket GUI 小 Demo 展示了如何使用Java进行网络通信和创建图形用户界面的基本技巧。通过学习这些知识,开发者可以构建自己的网络应用,如聊天室、文件传输工具等,这些都依赖于Socket进行数据交换,并...

    Java Socket传输图片源代码

    通过学习和实践"Java Socket传输图片源代码",开发者可以掌握网络编程的基本原理和技巧,为构建更复杂的分布式系统打下坚实基础。同时,这个例子也适合初学者作为入门教程,通过实际操作加深对Socket编程的理解。在...

    java Socket文件断点续传 Android

    Java Socket技术在Android开发中广泛...通过对这个类的分析和调试,开发者可以深入理解Java Socket在Android中实现文件断点续传的细节和技巧。在实际应用中,还需要考虑安全问题,如文件的权限控制、防止恶意攻击等。

    IBM Java socket教程

    在Java中,`java.sql.ConnectionPoolDataSource`和`javax.sql.PooledConnection`接口用于数据库连接池,而对于Socket连接池,开发者可以使用第三方库如Apache Commons Pool或HikariCP。连接池的主要优点是减少资源...

    Java基于Socket文件传输示例

    在Java编程中,Socket通信是一种基础且重要的网络编程模型,常用于实现客户端与服务器之间的数据交互,包括文件传输。在这个示例中,我们将探讨如何利用Java的Socket API进行文件的发送与接收。以下是对"Java基于...

    java中socket在线编程聊天系统的小案例

    总的来说,这个"java中socket在线编程聊天系统的小案例"提供了一个实用的起点,帮助开发者掌握Socket编程的基本概念和实践技巧。通过研究和实践这个案例,你将能够构建自己的聊天应用程序,进一步理解和应用网络编程...

    JAVA EJEMPLOS.zip_hearingq4l_java socket _zip

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。在这个"JAVA EJEMPLOS.zip_hearingq4l_java socket _zip...开发者可以通过深入研究这些代码,掌握Java Socket编程的基本原理和实践技巧。

    Socket入门小例子

    Socket编程是计算机网络编程中的重要组成部分,主要用于实现客户端与服务器之间的通信。在Java中,Socket是基于TCP...通过学习和实践"Socket入门小例子",开发者可以更好地理解和掌握Socket编程的核心原理与实践技巧。

    330 Java Tips(330 JAVA 小技巧)

    根据提供的文件信息,我们可以推断出这是一本包含330个Java小技巧的书籍或文档,旨在帮助读者提升Java编程技能。虽然具体内容没有详细列出,但从描述中我们可以大致了解到这本书涉及了Java的多个方面,并且鼓励用户...

    socket编程定长处理数据

    总的来说,Socket编程中的定长和变长数据处理是网络通信中的基础概念,理解和掌握这些技巧对于开发高效、可靠的网络应用至关重要。无论是简单的文件传输,还是复杂的实时通信系统,都需要对这两类数据有恰当的处理...

    Java网络编程-Socket-文件传输小案例

    通过上述步骤,我们可以实现一个简单的Java Socket文件传输小案例。不过,实际项目中还需要考虑更多因素,如文件的大小限制、错误重试机制、网络状况的适应性等。在不断实践和学习中,我们可以逐步掌握更复杂的网络...

    Java TCP/IP Socket编程

    通过以上知识点的介绍,可以看出Java中的TCP/IP Socket编程涉及到广泛的领域,从基础的概念到高级的应用技巧。无论是初学者还是有经验的开发者,都能够从中获得有用的信息。掌握了这些知识,你就能够更好地理解如何...

    vc和java编程小技巧锦集

    这篇文档集合了VC和Java编程的一些小技巧,旨在帮助开发者提高效率,解决实际问题。以下是对这些小技巧的详细解读: 1. **VC++编程技巧**: - **内存管理**:VC++中,理解智能指针如`shared_ptr`和`unique_ptr`的...

    Socket-JAVA-test.rar_java mtk_mtk java

    在实际的"Socket JAVA应用测试小程序"中,我们可能会看到如何设置Socket参数、如何处理连接建立和断开、如何读写数据以及如何进行错误处理等实际操作。这些基本概念和技巧是Java网络编程的基础,对于开发任何需要...

    java socket通信

    Java Socket通信是网络编程中的重要组成部分,...在设计和实现这样的系统时,开发者需要深入理解Socket的工作原理,掌握多线程编程和线程池的使用技巧,以及如何处理网络通信中的各种问题,以确保程序的健壮性和性能。

    java面试技巧及笔试汇集

    1. Socket通信:理解TCP和UDP协议,以及Socket和ServerSocket类的使用。 2. HTTP协议:了解HTTP的基本原理,能实现简单的HTTP客户端和服务端。 七、设计模式 1. 常见设计模式:熟悉单例、工厂、抽象工厂、建造者、...

    安卓app+java服务端+socket通信

    在Android中,可以使用`java.net.Socket`类来创建和管理Socket连接。开发者需要创建一个Socket实例,并指定服务器的IP地址和端口号。然后,通过`Socket.getOutputStream()`获取输出流进行写操作(发送数据),通过`...

    socket 实现http下载

    在Python中,可以使用`socket.socket()`创建Socket对象,`connect()`进行连接,`sendall()`发送数据,`recv()`接收数据。需要注意的是,由于网络的异步性,`recv()`可能不会一次性接收到所有数据,因此通常需要在一...

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

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

    Java Socket实现传输压缩对象的方法示例

    本文将详细介绍Java Socket实现传输压缩对象的方法,并结合具体实例形式分析了Java Socket针对数据的压缩、传输、接收、解压缩等操作相关实现技巧。 一、Java Socket简介 Java Socket是Java语言中的一种网络编程...

Global site tag (gtag.js) - Google Analytics