您的位置:首页 > 编程语言 > Java开发

Java Socket使用小技巧

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



启动服务器端

 



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息