av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語言

Java如何通過Socket實現(xiàn)TCP服務(wù)端

時間:2025-04-27 05:59:36 java語言 我要投稿
  • 相關(guān)推薦

Java如何通過Socket實現(xiàn)TCP服務(wù)端

  Socket 通常也稱作“套接字”,Java如何通過Socket實現(xiàn)TCP服務(wù)端?下面百分網(wǎng)小編帶大家一起來看看詳細內(nèi)容,希望對大家有所幫助!想了解更多相關(guān)信息請持續(xù)關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!

  1 Java Socket簡介

  所謂socket 通常也稱作”套接字“,用于描述IP地址和端口,是一個通信鏈的句柄。應(yīng)用程序通常通過”套接字”向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。Socket和ServerSocket類庫位于Java.NET包中。ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò)連接時使用的。在連接成功時,應(yīng)用程序兩端都會產(chǎn)生一個Socket實例,操作這個實例,完成所需的會話。對于一個網(wǎng)絡(luò)連接來說,套接字是平等的,并沒有差別,不因為在服務(wù)器端或在客戶端而產(chǎn)生不同級別。

  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服務(wù)器端,單例模式

  * @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與之對應(yīng)  private static ServerSocket serverSocket;          //服務(wù)器套接字

  private static int serPort = 9999;              //服務(wù)器端口號

  private static boolean flag;                //服務(wù)器狀態(tài)標志

  private static final int BUFFER_SIZE = 512;          //數(shù)據(jù)接收字符數(shù)組大小

  //構(gòu)造函數(shù)/

  private TCPServer() {

  }

  /**

  * 獲取實例

  * @return TCPServer實例serverInstance

  */

  public static TCPServer getServerInstance(){

  if(serverInstance==null)

  serverInstance = new TCPServer();

  return serverInstance;

  }

  /**

  * 開啟服務(wù)器

  * @throws IOException

  */

  public void openTCPServer() throws IOException{    if(serverSocket==null || serverSocket.isClosed()){

  serverSocket = new ServerSocket(serPort);

  flag = true;

  }

  }

  /**

  * 關(guān)閉服務(wù)器

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

  }

  /**

  * 服務(wù)器向客戶端發(fā)送數(shù)據(jù)

  * @param bytes[]:待發(fā)送的字符數(shù)組

  * @param key 客戶端的key,為空或""時表示數(shù)據(jù)群發(fā)

  * @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);

  }

  }

  /**

  * 服務(wù)器向客戶端發(fā)送數(shù)據(jù)

  * @param key 客戶端的key,為空或""時表示數(shù)據(jù)群發(fā)

  * @param msgStr:待發(fā)送的字符串

  * @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("服務(wù)器線程已經(jīng)啟動");   while(true){

  try {

  while(flag){

  logger.info("服務(wù)器線程在監(jiān)聽狀態(tài)中");

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

  }

  }

  }

  /**

  * 處理連接后的數(shù)據(jù)接收請求內(nèi)部類

  * @author xiang

  *

  */

  private class SocketThread extends Thread{

  private Socket socket;

  private String key;

  private OutputStream out;

  private InputStream in;

  //構(gòu)造函數(shù)

  public SocketThread(Socket socket,String key) {

  this.socket = socket;

  this.key = key;

  }

  /**

  * 發(fā)送數(shù)據(jù)

  * @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);

  }

  }

  /**

  * 關(guān)閉連接,釋放資源

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

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

  *

  * 接收數(shù)據(jù)后的處理過程

  *

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

  }

  // 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() + "] 回復(fù)客戶端的消息發(fā)送成功");

  closeConnect();

  socketMaps.remove(key);

  } catch (Exception e) {

  e.printStackTrace();

  try {

  closeConnect();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  }

  //////////////

  public int getport(){

  return socket.getPort();

  }

  }

  //. end SocketThread

  }

【Java如何通過Socket實現(xiàn)TCP服務(wù)端】相關(guān)文章:

如何運用Java socket實現(xiàn)多人聊天室功能11-06

講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實現(xiàn)09-03

java如何通過url讀取文件05-07

如何通過編程發(fā)現(xiàn)Java死鎖08-30

java如何實現(xiàn)漢諾塔08-08

java通用組合算法如何實現(xiàn)09-12

Java中如何實現(xiàn)顯示動態(tài)的時間09-28

Java網(wǎng)絡(luò)基礎(chǔ)和Socket通信基礎(chǔ)10-25

Java中Socket設(shè)置連接超時的代碼09-08