




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java Socket实战之一 单线程通信 本文地址:/kongxx/article/details/7259436现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用spring,其中就可以支持很多种远程连接的操作,另 外jboss的remoting也是不错的选择,还有Apache的Mina等等,但是在有些时候一些特殊情况仍然逃脱不了直接写Socket的情况,比 如公司内部一些莫名其妙的游戏规则。废话不说了,下面就看看如果自己写Socket应该怎么做吧。首先是写一个Server类,这个类用来监听10000端口,并从这个端口接收消息然后输出,当收到“bye”时退出。package com.googlecode.garbagecan.test.socket.sample1;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;public class MyServer public static void main(String args) throws IOException ServerSocket server = new ServerSocket(10000);Socket socket = server.accept();BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream();PrintWriter out = new PrintWriter(socket.getOutputStream();while (true) String msg = in.readLine();System.out.println(msg);out.println(Server received + msg);out.flush();if (msg.equals(bye) break;socket.close();然后是一个Client类,这个类连接上面启动的Server类,然后接收任何用户输入,当遇到回车时发送字符串到Server上,当输入“bye”是退出。package com.googlecode.garbagecan.test.socket.sample1;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import .Socket;public class MyClient public static void main(String args) throws Exception Socket socket = new Socket(localhost, 10000);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream();PrintWriter out = new PrintWriter(socket.getOutputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(System.in);while (true) String msg = reader.readLine();out.println(msg);out.flush();if (msg.equals(bye) break;System.out.println(in.readLine();socket.close();最后,首先运行MyServer类,然后MyClient类,然后在MyClient的控制台输入任意字符,可以看到当输入bye是server和client都会退出。Java Socket实战之二 多线程通信 本文地址:/kongxx/article/details/7259465Java Socket实战之一 单线程通信l 上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后 续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后 等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。具体代码如下:package com.googlecode.garbagecan.test.socket.sample2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;public class MyServer public static void main(String args) throws IOException ServerSocket server = new ServerSocket(10000);while (true) Socket socket = server.accept();invoke(socket);private static void invoke(final Socket client) throws IOException new Thread(new Runnable() public void run() BufferedReader in = null;PrintWriter out = null;try in = new BufferedReader(new InputStreamReader(client.getInputStream();out = new PrintWriter(client.getOutputStream();while (true) String msg = in.readLine();System.out.println(msg);out.println(Server received + msg);out.flush();if (msg.equals(bye) break; catch(IOException ex) ex.printStackTrace(); finally try in.close(); catch (Exception e) try out.close(); catch (Exception e) try client.close(); catch (Exception e) ).start();下面是Client程序代码:package com.googlecode.garbagecan.test.socket.sample2;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import .Socket;public class MyClient public static void main(String args) throws Exception Socket socket = new Socket(localhost, 10000);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream();PrintWriter out = new PrintWriter(socket.getOutputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(System.in);while (true) String msg = reader.readLine();out.println(msg);out.flush();if (msg.equals(bye) break;System.out.println(in.readLine();socket.close();测试,首先运行MyServer类,然后运行两个MyClient类,然后分别在每个MyClient的提示符下输入字符串,就可以看到Server可以分别接收处理每个Client的请求了。Java Socket实战之三 传输对象 本文地址:/kongxx/article/details/7259827Java Socket实战之一 单线程通信Java Socket实战之二 多线程通信前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象。首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了,入下:package com.googlecode.garbagecan.test.socket.sample3;public class User implements java.io.Serializable private static final long serialVersionUID = 1L;private String name;private String password;public User() public User(String name, String password) = name;this.password = password;public String getName() return name;public void setName(String name) = name;public String getPassword() return password;public void setPassword(String password) this.password = password;对于Server端的代码,代码中分别使用了ObjectInputStream和ObjectOutputStream来接收和发送socket中的InputStream和OutputStream,然后转换成Java对象,如下:package com.googlecode.garbagecan.test.socket.sample3;import java.io.*;import .ServerSocket;import .Socket;import java.util.logging.Level;import java.util.logging.Logger;public class MyServer private final static Logger logger = Logger.getLogger(MyServer.class.getName();public static void main(String args) throws IOException ServerSocket server = new ServerSocket(10000);while (true) Socket socket = server.accept();invoke(socket);private static void invoke(final Socket socket) throws IOException new Thread(new Runnable() public void run() ObjectInputStream is = null;ObjectOutputStream os = null;try is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream();os = new ObjectOutputStream(socket.getOutputStream();Object obj = is.readObject();User user = (User)obj;System.out.println(user: + user.getName() + / + user.getPassword();user.setName(user.getName() + _new);user.setPassword(user.getPassword() + _new);os.writeObject(user);os.flush(); catch (IOException ex) logger.log(Level.SEVERE, null, ex); catch(ClassNotFoundException ex) logger.log(Level.SEVERE, null, ex); finally try is.close(); catch(Exception ex) try os.close(); catch(Exception ex) try socket.close(); catch(Exception ex) ).start();Client也和Server端类似,同样使用ObjectOutputStream和ObjectInputStream来处理,如下:package com.googlecode.garbagecan.test.socket.sample3;import java.io.BufferedInputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .Socket;import java.util.logging.Level;import java.util.logging.Logger;public class MyClient private final static Logger logger = Logger.getLogger(MyClient.class.getName();public static void main(String args) throws Exception for (int i = 0; i 100; i+) Socket socket = null;ObjectOutputStream os = null;ObjectInputStream is = null;try socket = new Socket(localhost, 10000);os = new ObjectOutputStream(socket.getOutputStream();User user = new User(user_ + i, password_ + i);os.writeObject(user);os.flush();is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream();Object obj = is.readObject();if (obj != null) user = (User)obj;System.out.println(user: + user.getName() + / + user.getPassword(); catch(IOException ex) logger.log(Level.SEVERE, null, ex); finally try is.close(); catch(Exception ex) try os.close(); catch(Exception ex) try socket.close(); catch(Exception ex) 最后测试上面的代码,首先运行Server类,然后运行Client类,就可以分别在Server端和Client端控制台看到接收到的User对象实例了。Java Socket实战之四 传输压缩对象 本文地址:/kongxx/article/details/7259834Java Socket实战之一 单线程通信Java Socket实战之二 多线程通信Java Socket实战之三 传输对象上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较大的情况下需要把数据对象进行压缩然后在传输,此时就需要压缩这些对象流,此时就 可以GZIPInputStream和GZIPOutputStream来处理一下socket的InputStream和OutputStream。仍然需要一个实现了java.io.Serializable接口的简单Java对象package com.googlecode.garbagecan.test.socket.sample4;public class User implements java.io.Serializable private static final long serialVersionUID = 1L;private String name;private String password;public User() public User(String name, String password) = name;this.password = password;public String getName() return name;public void setName(String name) = name;public String getPassword() return password;public void setPassword(String password) this.password = password;在Server端使用,socket的InputStream首先被包装成GZIPInputStream,然后又被包装成 ObjectInputStream,而socket的OutputStream首先被包装成GZIPOutputStream,然后又被包装成 ObjectOutputStream,如下:package com.googlecode.garbagecan.test.socket.sample4;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .ServerSocket;import .Socket;import java.util.logging.Level;import java.util.logging.Logger;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;public class MyServer private final static Logger logger = Logger.getLogger(MyServer.class.getName();public static void main(String args) throws IOException ServerSocket server = new ServerSocket(10000);while (true) Socket socket = server.accept();socket.setSoTimeout(10 * 1000);invoke(socket);private static void invoke(final Socket socket) throws IOException new Thread(new Runnable() public void run() GZIPInputStream gzipis = null;ObjectInputStream ois = null;GZIPOutputStream gzipos = null;ObjectOutputStream oos = null;try gzipis = new GZIPInputStream(socket.getInputStream();ois = new ObjectInputStream(gzipis);gzipos = new GZIPOutputStream(socket.getOutputStream();oos = new ObjectOutputStream(gzipos);Object obj = ois.readObject();User user = (User)obj;System.out.println(user: + user.getName() + / + user.getPassword();user.setName(user.getName() + _new);user.setPassword(user.getPassword() + _new);oos.writeObject(user);oos.flush();gzipos.finish(); catch (IOException ex) logger.log(Level.SEVERE, null, ex); catch(ClassNotFoundException ex) logger.log(Level.SEVERE, null, ex); finally try ois.close(); catch(Exception ex) try oos.close(); catch(Exception ex) try socket.close(); catch(Exception ex) ).start();Client也和Server端类似,同样要不socket的XXXStream包装成GZIPXXXStream,然后再包装成ObjectXXXStream,如下:package com.googlecode.garbagecan.test.socket.sample4;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .InetSocketAddress;import .Socket;import .SocketAddress;import java.util.logging.Level;import java.util.logging.Logger;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;public class MyClient private final static Logger logger = Logger.getLogger(MyClient.class.getName();public static void main(String args) throws Exception for (int i = 0; i 10; i+) Socket socket = null;GZIPOutputStream gzipos = null;ObjectOutputStream oos = null;GZIPInputStream gzipis = null;ObjectInputStream ois = null;try socket = new Socket();SocketAddress socketAddress = new InetSocketAddress(localhost, 10000); socket.connect(socketAddress, 10 * 1000);socket.setSoTimeout(10 * 1000);gzipos = new GZIPOutputStream(socket.getOutputStream();oos = new ObjectOutputStream(gzipos);User user = new User(user_ + i, password_ + i);oos.writeObject(user);oos.flush();gzipos.finish();gzipis = new GZIPInputStream(socket.getInputStream();ois = new ObjectInputStream(gzipis);Object obj = ois.readObject();if (obj != null) user = (User)obj;System.out.println(user: + user.getName() + / + user.getPassword(); catch(IOException ex) logger.log(Level.SEVERE, null, ex); finally try ois.close(); catch(Exception ex) try oos.close(); catch(Exception ex) try socket.close(); catch(Exception ex) 最后测试上面的代码,首先运行Server类,然后运行Client类,就可以分别在Server端和Client端控制台看到接收到的User对象实例了。Java Socket实战之五 使用加密协议传输对象 本文地址:/kongxx/article/details/7259837Java Socket实战之一 单线程通信Java Socket实战之二 多线程通信Java Socket实战之三 传输对象Java Socket实战之四 传输压缩对象前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到SSLSocket了。还是一样需要一个实现了java.io.Serializable接口的简单Java对象package com.googlecode.garbagecan.test.socket.ssl;public class User implements java.io.Serializable private static final long serialVersionUID = 1L;private String name;private String password;public User() public User(String name, String password) = name;this.password = password;public String getName() return name;public void setName(String name) = name;public String getPassword() return password;public void setPassword(String password) this.password = password;SSL Server类,这里需要用到ServerSocketFactory类来创建SSLServerSocket类实例,然后在通过 SSLServerSocket来获取SSLSocket实例,这里考虑到面向对象中的面向接口编程的理念,所以代码中并没有出现 SSLServerSocket和SSLSocket,而是用了他们的父类ServerSocket和Socket。在获取到ServerSocket和 Socket实例以后,剩下的代码就和不使用加密方式一样了。package com.googlecode.garbagecan.test.socket.ssl;import java.io.BufferedInputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .ServerSocket;import .Socket;import java.util.logging.Level;import java.util.logging.Logger;import .ServerSocketFactory;import .ssl.SSLServerSocketFactory;public class MyServer private final static Logger logger = Logger.getLogger(MyServer.class.getName();public static void main(String args) try ServerSocketFactory factory = SSLServerSocketFactory.getDefault();ServerSocket server = factory.createServerSocket(10000);while (true) Socket socket = server.accept();invoke(socket); catch (Exception ex) ex.printStackTrace();private static void invoke(final Socket socket) throws IOException new Thread(new Runnable() public void run() ObjectInputStream is = null;ObjectOutputStream os = null;try is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream();os = new ObjectOutputStream(socket.getOutputStream();Object obj = is.readObject();User user = (User)obj;System.out.println(user: + user.getName() + / + user.getPassword();user.setName(user.getName() + _new);user.setPassword(user.getPassword() + _new);os.writeObject(user);os.flush(); catch (IOException ex) logger.log(Level.SEVERE, null, ex); catch(ClassNotFoundException ex) logger.log(Level.SEVERE, null, ex); finally try is.close(); catch(Exception ex) try os.close(); catch(Exception ex) try socket.close(); catch(Exception ex) ).start();SSL Client类和SSL Server类类似,只是将其中获取Socket的方式有所变化,其余的代码也和不使用加密方式一样。package com.googlecode.garbagecan.test.socket.ssl;import java.io.BufferedInputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .Socket;import java.util.logging.Level;import java.util.logging.Logger;import .SocketFactory;import .ssl.SSLSocketFactory;public class MyClient private final static Logger logger = Logger.getLogger(MyClient.class.getName();public static void main(String args) throws Exception for (int i = 0; i 100; i+) Socket socket = null;ObjectOutputStream os = null;ObjectInputStream is = null;try SocketFactory factory = SSLSocketFactory.getDefault();socket = factory.createSocket(localhost, 10000);os = new ObjectOutputStream(socket.getOutputStream();User user = new User(user_ + i, password_ + i);os.writeObject(user);os.flush();is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream();Object obj = is.readObject();if (obj != null) user = (User)obj;System.out.println(user: + user.getName() + / + user.getPassword(); catch(IOException ex) logger.log(Level.SEVERE, null, ex); finally try is.close(); catch(Ex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025装修合同北京范本
- 2025标准房屋买卖合同
- 2025房产交易补充合同条款
- 2025有关代理参展订货合同模板
- 店铺拆除承揽合同范本
- 地皮出售协议合同范本
- 2017林地流转合同范本
- 广告产品购销合同范本
- 工地工程的合同范本
- 2025济南市肉鸡委托饲养合同书
- 足少阴肾经试题及答案
- 眼科OCT基础知识课件
- 2025-2030中国还原铁粉行业市场发展趋势与前景展望战略研究报告
- 2024年《防治煤与瓦斯突出细则》培训课件
- 经皮肾术后护理试题及答案
- 河南航空港发展投资集团招聘笔试真题2024
- 烤烟种植与管理技术精粹
- 财政投资评审咨询服务预算和结算评审项目投标文件(技术方案)
- 《半年度工作总结与规划》课件
- 《稻田养鸭技术》课件
- 污水处理设施运维服务投标方案(技术标)
评论
0/150
提交评论