黑马程序员技术交流社区

标题: 一个自己封装的TCP通讯类,大家看看如何 [打印本页]

作者: 袁啟雄x    时间: 2014-4-11 18:00
标题: 一个自己封装的TCP通讯类,大家看看如何
首先是底层类
  1. import java.io.ObjectInputStream;
  2. import java.io.ObjectOutputStream;
  3. import java.net.Socket;

  4. public class MySocket {
  5.        
  6.         //内置连接对象
  7.         private Socket socket ;
  8.         //对象发送流,发送的对象必须序列化
  9.         private ObjectOutputStream oos;
  10.         //对象接收流
  11.         private ObjectInputStream ois;
  12.        
  13.         //重载构造函数 , 这个主动连接,提供IP地址和端口
  14.         public MySocket(String ip , int port){
  15.                 try {
  16.                         //初始化对象,并连接到指定的IP地址和端口
  17.                         socket = new Socket(ip, port);
  18.                         //获取输入流.
  19.                         ois = new ObjectInputStream(socket.getInputStream());
  20.                         //获取输出流
  21.                         oos = new ObjectOutputStream(socket.getOutputStream());
  22.                 } catch (Exception e) {
  23.                         //当发生异常调用关闭连接函数
  24.                         close();
  25.                 }
  26.         }
  27.        
  28.         //重载构造函数 , 这个被动连接,通过ServerSocket监听获取socket对象进行
  29.         public MySocket(Socket socket){
  30.                 this.socket = socket;
  31.                 try {
  32.                         //因为主动连接哪里是先获取输入流,这里必须先获取输出流,不然会卡死
  33.                         oos = new ObjectOutputStream(socket.getOutputStream());
  34.                         //然后获取输入流
  35.                         ois = new ObjectInputStream(socket.getInputStream());
  36.                 } catch (Exception e) {
  37.                         //当发生异常调用关闭连接函数
  38.                         close();
  39.                 }
  40.         }
  41.        
  42.         public boolean write(Object msg){
  43.                 //若输出流对象为NULL,返回FALSE
  44.                 if(oos==null) return false;
  45.                 try {
  46.                         //进行发送对象操作
  47.                         oos.writeObject(msg);
  48.                         //成功返回TRUE
  49.                         return true;
  50.                 } catch (Exception e) {
  51.                         //发送失败调用关闭连接函数
  52.                         close();
  53.                         //返回FALSE
  54.                         return false;
  55.                 }
  56.         }
  57.        
  58.         public Object read(){
  59.                 //若输入流对象为NULL,返回NULL
  60.                 if(ois==null) return null;
  61.                 try {
  62.                         //闭塞方法,若要即时通讯,请用多线程调用此函数 , 进行读消息
  63.                         return ois.readObject();
  64.                 } catch (Exception e) {
  65.                         //接收失败调用关闭连接函数
  66.                         close();
  67.                         //返回NULL
  68.                         return null;
  69.                 }
  70.         }
  71.        
  72.         //关闭连接
  73.         public boolean close(){
  74.                 if(socket!=null){
  75.                         try {
  76.                                 socket.close();
  77.                                 oos.close() ;
  78.                                 ois.close() ;
  79.                                 socket = null ;
  80.                                 oos = null ;
  81.                                 ois = null ;
  82.                                 return true;
  83.                         } catch (Exception e) {
  84.                                 return false;
  85.                         }
  86.                 } else return false;
  87.         }

  88. }
复制代码

然后就是上层的服务端,用于测试的
  1. import java.net.ServerSocket;

  2. import org.thisdk.conn.MyMsg;
  3. import org.thisdk.conn.MySocket;

  4. public class MyServer {

  5.         public static void main(String[] args) throws Exception {
  6.                 //监听本地特定端口
  7.                 ServerSocket ss = new ServerSocket(3866);
  8.                 //开始监听并把连接进来的客户端生成的socket对象传递到MySocket的重载构造函数
  9.                 MySocket tc = new MySocket(ss.accept());
  10.                 //读取消息
  11.                 MyMsg msg =(MyMsg)tc.read();
  12.                 //打印读取的消息
  13.                 System.out.println(msg.getMsg());
  14.                 //定义要发送的消息
  15.                 msg.setMsg("这是服务端发送的消息!");
  16.                 //发送消息
  17.                 tc.write(msg);
  18.                 //循环接收客户端发送的消息
  19.                 do {
  20.                         //读取消息
  21.                         msg =(MyMsg)tc.read();
  22.                         //检查读取到的内容是否正常
  23.                         if(msg==null) System.out.println("客户端关闭连接...");
  24.                         //正常就打印内容
  25.                         else System.out.println(msg.getMsg());
  26.                 } while (msg!=null);
  27.         }

  28. }
复制代码

再就是用于测试客户端
  1. import org.thisdk.conn.MyMsg;
  2. import org.thisdk.conn.MySocket;

  3. public class MyClient {


  4.         public static void main(String[] args) {
  5.                 //新建对象并连接
  6.                 MySocket tc = new MySocket("127.0.0.1", 3866);
  7.                 //定义要发送的消息
  8.                 MyMsg msg = new MyMsg("这是客户端发送的消息");
  9.                 //发送消息
  10.                 tc.write(msg);
  11.                 //读取消息
  12.                 msg = (MyMsg) tc.read();
  13.                 //查看读取到的内容
  14.                 System.out.println(msg.getMsg());
  15.                 //继续发送
  16.                 tc.write(new MyMsg("tttttttttt"));
  17.                 tc.write(new MyMsg("qqqqqqqqqq"));
  18.                 tc.write(new MyMsg("yyyyyyyyyy"));
  19.                 //关闭连接
  20.                 tc.close();
  21.         }

  22. }
复制代码

工具类,用于通讯的
  1. import java.io.Serializable;

  2. //这是测试对象,必须实现Serializable接口以序列化
  3. public class MyMsg implements Serializable{

  4.         private static final long serialVersionUID = 3866L;
  5.        
  6.         private String msg ;
  7.        
  8.         public MyMsg(String msg){
  9.                 this.msg = msg ;
  10.         }

  11.         public String getMsg() {
  12.                 return msg;
  13.         }

  14.         public void setMsg(String msg) {
  15.                 this.msg = msg;
  16.         }

  17. }
复制代码

思路是这样的.通过封装好Socket的连接等相应操作,然后在客户端直接调用封装好的操作,来达到简单操作.
因为是发送对象的.这样做我觉得好处在于,无论要发送什么,我都可以直接把要发送的东西封装在类里面,无论是文字,图片,甚至是其他自定义的类对象都行.只要定义好相应的通讯类即可.有什么建议的可以提出来,大家共同进步






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2