当前位置: 移动技术网 > IT编程>开发语言>Java > Java通过 Socket 实现 TCP服务端

Java通过 Socket 实现 TCP服务端

2019年07月22日  | 移动技术网IT编程  | 我要评论

兰花劫国语,绝地战争官网,奔驰汽车论坛

1 java socket简介

  所谓socket 通常也称作”套接字“,用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。socket和serversocket类库位于java.net包中。serversocket用于服务器端,socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。

2 tcpserver代码实例

import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.net.serversocket;
import java.net.socket;
import java.util.date;
import java.util.hashmap;
import java.util.map;

import org.slf4j.logger;
import org.slf4j.loggerfactory;

/**
 * tcp服务器端,单例模式
 * @author xiang
 *
 */
public class tcpserver implements runnable {
  private static final logger logger = loggerfactory.getlogger(tcpserver.class);
  //成员变量/
  private static tcpserver serverinstance;      
  private static map<string, socketthread> socketmaps = new hashmap<string,socketthread>();        //每个客户端连接时都会新建一个socketthread与之对应  private static serversocket serversocket;          //服务器套接字
  private static int serport = 9999;              //服务器端口号
  private static boolean flag;                //服务器状态标志
  private static final int buffer_size = 512;          //数据接收字符数组大小
  
  //构造函数/
  private tcpserver() {
    
  }
  
  /**
   * 获取实例
   * @return tcpserver实例serverinstance
   */
  public static tcpserver getserverinstance(){
    if(serverinstance==null)
      serverinstance = new tcpserver();
    return serverinstance;
  }
  
  /**
   * 开启服务器
   * @throws ioexception
   */
  public void opentcpserver() throws ioexception{    if(serversocket==null || serversocket.isclosed()){
      serversocket = new serversocket(serport);
      flag = true;
    }
  }
  
  /**
   * 关闭服务器
   * @throws ioexception 
   */
  public void closetcpserver() throws ioexception{
    flag = false;   if(serversocket!=null)
      serversocket.close();
    /*for (map.entry<string, socketthread> entry : socketmaps.entryset()) { 
       system.out.println("key = " + entry.getkey() + ", value = " + entry.getvalue());     
    } */ 
    for (socketthread value : socketmaps.values()) 
      value.closeconnect();
    socketmaps.clear();    
  }
  
  /**
   * 服务器向客户端发送数据
   * @param bytes[]:待发送的字符数组
   * @param key 客户端的key,为空或""时表示数据群发
   * @throws ioexception 
   */
  public void sendmessage(string key,byte[] msgbytes){
    if(key==null||key.equals("")){
      for (socketthread value : socketmaps.values()) 
        value.sendmassage(msgbytes);
    }else{
      socketthread thread = socketmaps.get(key);
      if(thread!=null)
        thread.sendmassage(msgbytes);
    }
  }
  
  /**
   * 服务器向客户端发送数据
   * @param key 客户端的key,为空或""时表示数据群发
   * @param msgstr:待发送的字符串
   * @throws ioexception 
   */
  public void sendmessage(string key,string msgstr){   byte[] sendbyte = msgstr.getbytes();
    if(key==null||key.equals("")){
      for (socketthread value : socketmaps.values()) 
        value.sendmassage(sendbyte);
    }else{
      socketthread thread = socketmaps.get(key);
      if(thread!=null)
        thread.sendmassage(sendbyte);
    }
  }
  
  @override
  public void run() {
    logger.info("服务器线程已经启动");   while(true){
      try {
        while(flag){
          logger.info("服务器线程在监听状态中");
          socket socket = serversocket.accept();
          string key = socket.getremotesocketaddress().tostring();
          socketthread thread = new socketthread(socket,key);
          thread.start();
          socketmaps.put(key, thread);          
          logger.info("有客户端连接:"+key);
        }        
      } catch (exception e) {
        e.printstacktrace();        
      } 
    }
  }     
  
  /**
   * 处理连接后的数据接收请求内部类
   * @author xiang
   *
   */
  private class socketthread extends thread{
    private socket socket;
    private string key;
    private outputstream out;
    private inputstream in;
    
    //构造函数
    public socketthread(socket socket,string key) {
      this.socket = socket;
      this.key = key;
    }
    
    /**
     * 发送数据
     * @param bytes
     * @throws ioexception 
     */
    public void sendmassage(byte[] bytes){
      try {
        if(out==null)
          out = socket.getoutputstream();
        out.write(bytes);
      } catch (exception e) {
        e.printstacktrace();
        try {
          closeconnect();
        } catch (ioexception e1) {
          e1.printstacktrace();
        }
        socketmaps.remove(key);        
      } 
    }

    /**
     * 关闭连接,释放资源
     * @throws ioexception 
     */
    public void closeconnect() throws ioexception{
      if(out!=null)  out.close();
      if(in!=null)  in.close();
      if(socket!=null && socket.isconnected())  socket.close();
    }
    
    @override
    public void run() {
      byte[] receivbuf = new byte[buffer_size];
      int recvmsgsize;
      try {
        in = socket.getinputstream();
        out = socket.getoutputstream();
        while ((recvmsgsize = in.read(receivbuf)) != -1) {
          string receiveddata = new string(receivbuf, 0, recvmsgsize);
          system.out.println("reverve form[port" + socket.getport() + "]:" + receiveddata);
          system.out.println("now the size of socketmaps is" + socketmaps.size());
          /**************************************************************
           * 
           * 接收数据后的处理过程
           * 
           **************************************************************/
        }
        // response to client
        byte[] sendbyte = "the server has received".getbytes();
        // out.write(sendbyte, 0, sendbyte.length);
        out.write(sendbyte);
        system.out.println("to cliect[port:" + socket.getport() + "] 回复客户端的消息发送成功");
        closeconnect();
        socketmaps.remove(key);        
      } catch (exception e) {
        e.printstacktrace();
        try {
          closeconnect();
        } catch (ioexception e1) {
          e1.printstacktrace();
        }
      }
    }
    
    //////////////
    public int getport(){
      return socket.getport();
    }
  }
  //. end socketthread  
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网