運用JAVA的concurrent.ExecutorService線程池實現socket的TCP和UDP連接


最近在項目中可能要用到socket相關的東西來發送消息,所以初步研究了下socket的TCP和UDP實現方式,並且結合java1.5的concurrent.ExecutorService類來實現多線程。

具體實現方式見代碼:

一、TCP方式:

1、服務端實現方式:

TCP的服務端實現方式主要用到ServerSocket類,接收等待客戶端連接的方法是accept();

代碼如下:類SocketServerTCP

 1 private int port = 8823;
2 private ServerSocket serverSocket;
3 private ExecutorService executorService;// 線程池
4 private final int POOL_SIZE = 100;// 單個CPU線程池大小
5
6 public SocketServerTCP() {
7 try {
8 serverSocket = new ServerSocket(port);
9 executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
10 .availableProcessors() * POOL_SIZE);
11 logger.info("端口號為" + port + "的服務器啟動");
12 } catch (IOException e) {
13 e.printStackTrace();
14 }
15 }
16
17 public void service() {
18 System.out.println("socket初始化成功!");
19 logger.info("socket服務端初始化成功!");
20 while (true) {
21 Socket socket = null;
22 try {
23 // 接收客戶連接,只要客戶進行了連接,就會觸發accept();從而建立連接
24 socket = serverSocket.accept();
25 executorService.execute(new CallService(socket));
26 } catch (Exception e) {
27 e.printStackTrace();
28 }
29 }
30 }


 CallService類主要作用是接收到消息后,來實現具體業務。

代碼如下:

 1 /**
2 * 功能說明:執行具體業務的線程
3 */
4 class CallService implements Runnable {
5 Logger logger = Logger.getLogger(CallService.class);
6 private Socket socket;
7
8 private BufferedReader is;
9 private PrintWriter os;
10
11 public CallService(Socket socket) {
12 this.socket = socket;
13 }
14
15 public void run() {
16 try {
17 is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
18 os = new PrintWriter(socket.getOutputStream());
19
20 String msg = is.readLine();
21
22 System.out.println("接到客戶端消息" + msg);
23
24 //返回消息給客戶端
25 String responseMsg="服務端返回消息:" + msg;
26 os.println(responseMsg);
27 os.flush();
28 } catch (IOException e) {
29 e.printStackTrace();
30 } finally {
31 try {
32 if (os != null) {
33 os.close();
34 }
35 if (is != null) {
36 is.close();
37 }
38 if (socket != null) {
39 socket.close();
40 }
41 } catch (IOException e) {
42 e.printStackTrace();
43 }
44 }
45 }

服務器啟動方式:

1 public static void main(String[] args) {
2 new SocketServerTCP().service();
3 }

 

2、TCP客戶端實現代碼

客戶通過new Socket(ip, port)創建一個socket,並通過PrintWriter來向服務器發送消息

 1 public class SocketClientTCP {
2 public String sendMsg(String ip, int port, String msg) {
3 Socket client = null;
4 try {
5 // 創建Socket
6 client = new Socket(ip, port);
7
8 // 向服務器發送消息
9 PrintWriter out = new PrintWriter(new BufferedWriter(
10 new OutputStreamWriter(client.getOutputStream())), true);
11 out.println(msg);
12 out.flush();
13
14 // 接收來自服務器的消息
15 BufferedReader in = new BufferedReader(new InputStreamReader(
16 client.getInputStream()));
17 String str = in.readLine();
18 // 關閉流
19 out.close();
20 in.close();
21 // 關閉Socket
22 client.close();
23 return str;
24 } catch (IOException e) {
25 e.printStackTrace();
26 }
27 return "";
28 }
29
30 public static void main(String[] args) {
31 SocketClientTCP client = new SocketClientTCP();
32 String str1 = client.sendMsg("127.0.0.1", 8823,"xiaoxi_1234567890A1234567!");
33 System.out.println("str1=====" + str1);
34 }
35 }

二、UDP實現方式

1、“服務端”實現方式

 

UDP的服務端主要是用到DatagramSocket、DatagramPacket類,通過new DatagramSocket(port)來創建一個socket,並且通過DatagramPacket來接收消息
代碼如下:類SocketServerUDP:

 1 private int port = 1114;
2 private DatagramSocket dataSocket;
3 private ExecutorService executorService;// 線程池
4 private final int POOL_SIZE = 100;// 單個CPU線程池大小
5
6 public SocketServerUDP() {
7 try {
8 dataSocket = new DatagramSocket(port);
9 executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
10 .availableProcessors() * POOL_SIZE);
11 logger.info("端口號為" + port + "的服務器啟動");
12 } catch (IOException e) {
13 e.printStackTrace();
14 }
15 }
16
17 public void service() {
18 System.out.println("socket初始化成功!");
19 logger.info("socket服務端初始化成功!");
20
21 while (true) {
22 try {
23 byte[] buff = new byte[128];// 傳輸消息不超過64字
24 DatagramPacket dataPacket = new DatagramPacket(buff, buff.length);
25 dataSocket.receive(dataPacket);// 等待接收來自客戶端的數據包
26
27 executorService.execute(new UdpCallService(dataPacket));//接收到消息后執行具體的業務
28 } catch (Exception e) {
29 e.printStackTrace();
30 }
31 }
32 }

 UDPCallService類主要作用是接收到消息后,來實現具體業務。

代碼如下:

 1 class UdpCallService implements Runnable {
2 Logger logger = Logger.getLogger(UdpCallService.class);
3 private DatagramPacket packet;
4 private DatagramSocket dataSocket;
5
6 public UdpCallService(DatagramPacket packet) {
7 try {
8 this.packet = packet;
9 // 創建本機可以端口的DatagramSocket
10 dataSocket = new DatagramSocket();
11 } catch (SocketException e) {
12 e.printStackTrace();
13 }
14 }
15
16 public void run() {
17 String str=new String(packet.getData());
18 System.out.println("接收到消息:"+str);
19 //返回數據給客戶端
20 responeSocket("UDP消息返回:"+str);
21 }
22
23 //返回消息給客戶端
24 public void responeSocket(String message){
25 // 構造響應數據包
26 byte[] response = message.toString().getBytes();
27 DatagramPacket dataPacket = new DatagramPacket(response, response.length, packet.getAddress(), packet.getPort());
28 try {// 發送
29 dataSocket.send(dataPacket);
30 } catch (IOException e) {
31 e.printStackTrace();
32 }
33 }

服務器啟動方式:

1 public static void main(String[] args) {
2 new SocketServerUDP().service();
3 }

2、UDP客戶端實現方式

      UDP客戶端的實現方式與"服務端"實現方式差不多,因為UDP本身就沒有很嚴格的服務端和客戶端定義。

代碼如下:

 1 public class SocketClientUDP {
2
3 private int PORT;
4
5 public SocketClientUDP(int PORT) {
6 this.PORT=PORT;
7 }
8
9 public String getMessage() {
10 String msg = "";
11 try {
12
13 String str = "hello world ";
14 DatagramSocket socket = new DatagramSocket();
15
16 // 發送UPD消息給服務端
17 DatagramPacket requestPacket = new DatagramPacket(str.getBytes(),
18 str.length(), InetAddress.getLocalHost(), PORT);
19 socket.send(requestPacket);
20
21 // 接收服務端返回的UDP消息
22 byte[] data = new byte[128];
23 DatagramPacket responsePacket = new DatagramPacket(data,data.length);
24 socket.receive(responsePacket);
25 msg = new String(responsePacket.getData(), 0,responsePacket.getLength());
26 socket.close();
27 } catch (UnknownHostException e) {
28 System.err.println("Exception: host could not be found");
29 } catch (Exception e) {
30 System.err.println("Exception: " + e);
31 e.printStackTrace();
32 }
33 return msg;
34 }
35
36 public static void main(String[] args){
37 SocketClientUDP clientUdp = new SocketClientUDP(1114);
38 String str1= clientUdp.getMessage();
39 System.out.println("str1====="+str1);
40 }

 

具體的JAVA文件下載地址:

http://files.cnblogs.com/fbsk/Socket_TCP_UDP.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM