工作中没涉及有关JAVA SOCKET编程的实际经历,但理论大概了解。想正明一下自已的对JAVA SOCKET理解写个通信TEST,通过TEST验证了基本与理论相近。下面是TEST SRC CODE 如果有牛人指点一二在下谢谢了,想写个类似QQ的局网通信程序,可没有太多时间如果您有JAVA SRC CODE 请与我联系。 1.开发工具:eclips3.2 2.工程基本结构: 2.1 工程名:SocketTest 2.2 包test1.service含类功能说明: 2.2.1 KKMultiServerThread 服务端多线程处理类. 2.2.2 KnockKnockProtocol 双方通信协义处理类。 2.2.3 KnockKnockProtocolFace 双方通信协义处理接口。 2.2.4 MyService 服务端监听处理主方法类。 2.2.5 MyClient 客户端主方法类。 2.3 包test1.error含类功能说明: 2.3.1 ResponseError 服务端处理客户端响应异常类。 3.工程基本结构具体说明及原码。 2.1 工程名:SocketTest 2.2 包test1.service含类功能说明: 2.2.1 KKMultiServerThread 服务端多线程处理类. package test1.service; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import test1.error.ResponseError; /** * @作者:刘家鸽 * @功能:服务端处理客户端请求返回响应(多线程) */ public class KKMultiServerThread extends Thread { private Socket clentSocket = null; private KnockKnockProtocol kkpf = null; private PrintWriter pw = null; private BufferedReader bir = null; public KKMultiServerThread() { super("KKMultiServerThread"); } public KKMultiServerThread(Socket clentSocket) { super("KKMultiServerThread"); this.clentSocket = clentSocket; } public KKMultiServerThread(Socket clentSocket, KnockKnockProtocolFace kkpf) { super("KKMultiServerThread"); this.clentSocket = clentSocket; this.kkpf = (KnockKnockProtocol) kkpf; } public Socket getClentSocket() { return clentSocket; } public void setClentSocket(Socket clentSocket) { this.clentSocket = clentSocket; } public KnockKnockProtocol getKkpf() { return kkpf; } public void setKkpf(KnockKnockProtocol kkpf) { this.kkpf = kkpf; } // 运行线程 public void run() { try { pw = new PrintWriter(clentSocket.getOutputStream()); bir = new BufferedReader(new InputStreamReader(clentSocket .getInputStream())); String request = bir.readLine(); System.out.println("客户端请求: " + request); InetAddress ia = clentSocket.getInetAddress(); System.out.println("客户端ip:"+ia.getHostAddress()); String response = kkpf.processInput(request); // 向客户端发送 System.out.println("返回客户端响应:" + response); kkpf.sendResponse(pw, response); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ResponseError e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { System.out.println("关闭客户与服务端的连接"); this.pw.close(); this.bir.close(); this.clentSocket.close(); } catch (Exception e) { e.printStackTrace(); } } } } 2.2.2 KnockKnockProtocol 双方通信协义处理类。 package test1.service; import java.io.PrintWriter; import test1.error.ResponseError; /** * @作者:刘家鸽 * @功能:协义处理类 */ public class KnockKnockProtocol implements KnockKnockProtocolFace { private String response = null; //获得客户端协义 public String processInput(String request) throws ResponseError { if (request.equalsIgnoreCase(KnockKnockProtocolFace.QUERY_USER)) { response = this.processQUERY_USER(request); } else { response = KnockKnockProtocolFace.NOT_EXIST_REQUEST_PROTOCOL_ERROR; } return this.response; } //处理QUERY_USER协义 public String processQUERY_USER(String request) throws ResponseError { this.response = this.QUERY_USER_SUCCEED_INFO; return this.response; } // 发送服务端请求 public void sendResponse(PrintWriter pw, String response) throws ResponseError { pw.println(response); pw.flush(); } } 2.2.3 KnockKnockProtocolFace 双方通信协义处理接口。 package test1.service; import java.io.PrintWriter; import test1.error.ResponseError; /** * @作者:刘家鸽 * @功能:协义处理类接口 */ public interface KnockKnockProtocolFace { //此属性没有从数据库或属性文件中读取。 public static final String EXIT = "EXIT"; public static final String QUERY_USER = "QUERY_USER"; public static final String ERROR = "ERROR"; public static final String QUERY_USER_ERROR_INFO = "QUERY_USER_ERROR"; public static final String QUERY_USER_SUCCEED_INFO = "QUERY_USER_SUCCEED"; public static final String NOT_EXIST_REQUEST_PROTOCOL_ERROR = "NOT_EXIST_REQUEST_PROTOCOL_ERROR"; public String processInput(String request) throws ResponseError; public String processQUERY_USER(String request) throws ResponseError; public void sendResponse(PrintWriter pw,String response) throws ResponseError; } 2.2.4 MyService 服务端监听处理主方法类。 package test1.service; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * @作者:刘家鸽 * @功能:服务监听 */ public class MyService { private ServerSocket ss = null; private KKMultiServerThread kkst = null; private int PORT = 65534; private long MILLIS = 0l; private Socket s = null; // 服务 public static void main(String[] args) { new MyService().startMainService(); } // 开启服务 private void startMainService() { try { // 设置服务端提供服端口 ss = new ServerSocket(this.PORT); KnockKnockProtocol kkpl = new KnockKnockProtocol(); kkst = new KKMultiServerThread(); // /s = ss.accept(); int count = 0; // 读取客户端信息 while (true) { System.out.println("等待读取客户端信息"); //s = ss.accept(); KKMultiServerThread st = new KKMultiServerThread(ss.accept(), new KnockKnockProtocol()); st.start(); st.sleep(0); } // 关闭客户端连接 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { System.out.println("服务端关闭客户端连接"); if (s != null) s.close(); if (ss != null) ss.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 2.2.5 MyClient 客户端主方法类。 package test1.service; import java.io.IOException; import java.net.*; import java.io.*; /** * @作者:刘家鸽 * @功能:客户监听 */ public class MyClient { private Socket s = null; private BufferedReader br = null; private BufferedReader brClent = null; private PrintWriter pw = null; // 客户端实实读取 public static void main(String[] args) { // TODO Auto-generated method stub for (int i = 0; i < args.length; i++) { new MyClient().startClientService(args[i]); } } // 开启客户端 private void startClientService(String command) { try { // for (int i = 0; i < 10; i++) { s = new Socket(InetAddress.getLocalHost(), 65534); System.out.println("建立与服务端的连接1" + s); br = new BufferedReader(new InputStreamReader(s.getInputStream())); pw = new PrintWriter(s.getOutputStream()); // pw.println("QUERY_USER"); pw.println(command); pw.flush(); // 如果得到服务端响应 新关闭与服务端的连接 boolean flag = true; while (flag) { if (br.ready()) { System.out.println("res: " + br.readLine()); break; } } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 关闭与服务端的连接 System.out.println("关闭与服务端的连接"); try { if (br != null) br.close(); if (pw != null) pw.close(); if (s != null) s.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 2.3 包test1.error含类功能说明: 2.3.1 ResponseError 服务端处理客户端响应异常类。 package test1.error; /** * @作者:刘家鸽 * @功能:异常处理类 */ public class ResponseError extends Exception { public ResponseError(String msg) { super(msg); } } 总结: 1.使用JAVA SOCKET 能够实现强健的网络程序。JAVA SOCKET 帮我们实现了许多网络通信底层技术。 2.以上代码并不作为实际应用,很多地方没有实现开闭原则,但是就测试程序而言足够。 |
|