自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

手把手教你 Socket 通信(TCP/IP)

開(kāi)發(fā) 后端 通信技術(shù)
本文將給出完整 Socket 通信代碼,在 eclipse 中親測(cè)有效。在Android Studio中用Java開(kāi)發(fā)也是一樣的,只是把代碼和控件搭配一下,注冊(cè)監(jiān)聽(tīng)就好。

網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。

建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(socket)。socket 本質(zhì)是編程接口(API),對(duì)TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車(chē),提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。

下載eclipse:

https://www.eclipse.org/

本文將給出完整 Socket 通信代碼,在 eclipse 中親測(cè)有效。在Android Studio中用Java開(kāi)發(fā)也是一樣的,只是把代碼和控件搭配一下,注冊(cè)監(jiān)聽(tīng)就好。區(qū)別就是在 AS 中 import 的聲明不太一樣,然后窗口不需要自己建立。

效果如圖:

在eclipse中,F(xiàn)ile→New→Java Project→起個(gè)英文名字→Finish(我起的名字是TCP)

目錄結(jié)構(gòu):

新建完以后有個(gè)src默認(rèn)包,右鍵 src→New→Package→ 輸入 com.net(因?yàn)槌绦蚶镂矣玫陌拿质沁@個(gè),你可以同時(shí)兩個(gè)一起改)→ Finish

然后右鍵 com.net → New → Class → 輸入 TCPClient(因?yàn)槲页绦蚶锩嬗玫倪@個(gè)類(lèi)名稱)

然后右鍵 com.net → New → Class → 輸入 TCPServer(因?yàn)槲页绦蚶锩嬗玫倪@個(gè)類(lèi)名稱)

兩個(gè)里面分別粘貼代碼:

TCPServer

  1. package com.net; 
  2.  
  3. import java.io.*; 
  4. import java.net.*; 
  5. import java.awt.*; 
  6. import java.awt.event.*; 
  7.  
  8. public class TCPServer { 
  9.  static DataInputStream dis=null
  10.  public static void main(String[] args){ 
  11.   boolean started=false
  12.   Socket s=null
  13.   TextArea ta=new TextArea(); 
  14.   ta.append("從客戶端接受的數(shù)據(jù):"+"\n"); 
  15.   ServerSocket ss=null
  16.   try{ 
  17.    ss=new ServerSocket(8866);                       //端口號(hào) 
  18.   }catch(BindException e){ 
  19.    System.exit(0); 
  20.   }catch(IOException e){ 
  21.    e.printStackTrace(); 
  22.   } 
  23.   Frame f=new Frame("服務(wù)器端");              //窗體名稱  
  24.   f.setLocation(300, 300);           //窗體出現(xiàn)位置 
  25.   f.setSize(200, 200);            //窗體大小 
  26.   f.add(ta,BorderLayout.NORTH); 
  27.   f.pack(); 
  28.   f.addWindowListener(new WindowAdapter(){ 
  29.    public void windowClosing(WindowEvent e){ 
  30.     System.exit(0); 
  31.    } 
  32.   }); 
  33.   f.setVisible(true); 
  34.   try{               //try-catch塊捕捉異常 
  35.    started=true
  36.    while(started){ 
  37.     boolean bConnected=false
  38.     s=ss.accept(); 
  39.     bConnected=true
  40.     dis=new DataInputStream(s.getInputStream()); 
  41.     while(bConnected){ 
  42.         String str=dis.readUTF(); 
  43.         ta.append(str+"\n"); 
  44.     } 
  45.    } 
  46.   }catch(EOFException e){                                  
  47.    System.out.println("Client closed!"); 
  48.   }catch(IOException e){ 
  49.    e.printStackTrace(); 
  50.   }finally{ 
  51.    try{ 
  52.     if(dis!=null
  53.      dis.close(); 
  54.     if(s!=null
  55.      s.close(); 
  56.    }catch(Exception e){ 
  57.     e.printStackTrace(); 
  58.    } 
  59.   } 
  60.  } 

TCPClient

  1. package com.net; 
  2. import java.awt.*; 
  3. import java.awt.event.*; 
  4. import java.io.*; 
  5. import java.net.*; 
  6.  
  7. public class TCPClient extends Frame{ 
  8.  Socket s=null
  9.  DataOutputStream dos=null
  10.  DataInputStream  dis=null
  11.  TextField tf=new TextField(40); 
  12.  List list=new List(6); 
  13.  public static void main(String[] args){ 
  14.   TCPClient client=new TCPClient(); 
  15.   client.list.add("向服務(wù)器端發(fā)送的數(shù)據(jù):"); 
  16.   client.setTitle("客戶端"); 
  17.   client.run(); 
  18.  } 
  19.  public void run(){ 
  20.   setLocation(400,300); 
  21.   this.setSize(300, 300); 
  22.   add(tf,BorderLayout.SOUTH); 
  23.   add(list,BorderLayout.NORTH); 
  24.   pack(); 
  25.   this.addWindowListener(new WindowAdapter(){ 
  26.    public void windowClosing(WindowEvent e){ 
  27.     disconnect(); 
  28.     System.exit(0); 
  29.    } 
  30.   }); 
  31.   tf.addActionListener(new MyListener()); 
  32.   setVisible(true); 
  33.   connect(); 
  34.  } 
  35. public void connect(){ 
  36.  try{ 
  37.   s=new Socket("127.0.0.1",8866); 
  38.   dos=new DataOutputStream(s.getOutputStream()); 
  39.  }catch(UnknownHostException e){ 
  40.   e.printStackTrace(); 
  41.  }catch(IOException e){ 
  42.   e.printStackTrace(); 
  43.  } 
  44. public void disconnect(){ 
  45.  try{ 
  46.   dos.close(); 
  47.   s.close(); 
  48.  }catch(IOException e){ 
  49.   e.printStackTrace(); 
  50.  } 
  51. private class MyListener implements ActionListener{ 
  52.     public void actionPerformed(ActionEvent e){ 
  53.       String s1=null
  54.       String s2=null
  55.       String str=tf.getText().trim(); 
  56.       list.add(str); 
  57.       tf.setText(""); 
  58.       try{ 
  59.        dos.writeUTF(str); 
  60.        dos.flush(); 
  61.       }catch(IOException e1){ 
  62.          e1.printStackTrace();   
  63.       } 
  64.       } 
  65.     } 

然后先運(yùn)行服務(wù)器,再運(yùn)行客戶端,否則會(huì)報(bào)錯(cuò),因?yàn)镾ocket通信本質(zhì)是先打開(kāi)服務(wù)器監(jiān)聽(tīng)端口。然后就會(huì)出現(xiàn)效果圖。

本機(jī)回環(huán) IP 是 127.0.0.1,你可以改為其他 IP 地址,即可實(shí)現(xiàn)跨機(jī) Socket 通信。

本文轉(zhuǎn)載自微信公眾號(hào)「嵌入式Linux系統(tǒng)開(kāi)發(fā)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系嵌入式Linux系統(tǒng)開(kāi)發(fā)眾號(hào)。

 

 

責(zé)任編輯:姜華 來(lái)源: 嵌入式Linux系統(tǒng)開(kāi)發(fā)
相關(guān)推薦

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2021-07-14 09:00:00

JavaFX開(kāi)發(fā)應(yīng)用

2020-03-08 22:06:16

Python數(shù)據(jù)IP

2021-02-26 11:54:38

MyBatis 插件接口

2011-02-22 13:46:27

微軟SQL.NET

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2022-07-27 08:16:22

搜索引擎Lucene

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2021-07-03 09:04:22

XPathPython免費(fèi)代理IP

2020-04-14 10:20:12

MySQL數(shù)據(jù)庫(kù)死鎖

2016-04-27 09:49:16

用戶模型產(chǎn)品總結(jié)

2020-07-09 08:59:52

if else模板Service

2009-11-09 14:57:37

WCF上傳文件

2011-01-06 10:39:25

.NET程序打包

2024-10-16 11:40:47

2021-09-30 18:27:38

數(shù)據(jù)倉(cāng)庫(kù)ETL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)