Java如何通过Socket实现TCP服务端

时间:2025-10-01 07:30:40 java语言

Java如何通过Socket实现TCP服务端

  Socket 通常也称作“套接字”,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;

  /**

  * TCP服务器端,单例模式

  * @author xiang

  *

  */

  public class TCPServer implements Runnable {

  private static final Logger logger = LoggerFactory.getLogger(TCPServer.class);

  /pic/

  private static TCPServer serverInstance;

  private static Map<String, SocketThread> socketMaps = new HashMap<String,SocketThread>();        /pic/pic/p>

  private static int serPort = 9999;              /pic/p>

  private static boolean flag;                /pic/p>

  private static final int BUFFER_SIZE = 512;          /pic/p>

  /pic/

  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;

  /pic/p>

  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());

  /**************************************************************

  *

  * 接收数据后的处理过程

  *

  **************************************************************/

  }

  /pic/p>

  byte[] sendByte = "The Server has received".getBytes();

  /pic/p>

  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();

  }

  }

  }

  /pic/pic/pic/pic/pic/pic/pic/p>

  public int getport(){

  return socket.getPort();

  }

  }

  /pic/p>

  }

【Java如何通过Socket实现TCP服务端】相关文章:

如何运用Java socket实现多人聊天室功能01-14

讲解Java的Socket网络编程的多播与广播实现02-11

如何通过编程发现Java死锁09-30

java如何通过url读取文件08-24

java如何实现汉诺塔01-31

java通用组合算法如何实现10-04

Java中如何实现显示动态的时间03-14

Java网络基础和Socket通信基础11-24

Java中Socket设置连接超时的代码03-04