栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java通过 Socket 实现 TCP服务端

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java通过 Socket 实现 TCP服务端

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;


public class TCPServer implements Runnable {
  private static final Logger logger = LoggerFactory.getLogger(TCPServer.class);
  //成员变量/
  private static TCPServer serverInstance;      
  private static Map socketMaps = new HashMap();        //每个客户端连接时都会新建一个SocketThread与之对应  private static ServerSocket serverSocket;   //服务器套接字
  private static int serPort = 9999;//服务器端口号
  private static boolean flag;  //服务器状态标志
  private static final int BUFFER_SIZE = 512;   //数据接收字符数组大小
  
  //构造函数/
  private TCPServer() {
    
  }
  
  
  public static TCPServer getServerInstance(){
    if(serverInstance==null)
      serverInstance = new TCPServer();
    return serverInstance;
  }
  
  
  public void openTCPServer() throws IOException{    if(serverSocket==null || serverSocket.isClosed()){
      serverSocket = new ServerSocket(serPort);
      flag = true;
    }
  }
  
  
  public void closeTCPServer() throws IOException{
    flag = false;   if(serverSocket!=null)
      serverSocket.close();
     
    for (SocketThread value : socketMaps.values()) 
      value.closeConnect();
    socketMaps.clear();    
  }
  
  
  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);
    }
  }
  
  
  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(); 
      } 
    }
  }     
  
  
  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;
    }
    
    
    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); 
      } 
    }

    
    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  
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/146327.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号