Socket通信
目錄
一、?什么是Socket?
插述:
二、Socket通信模型
1.服務端
2.客戶端
三、代碼實現
服務端
客戶端
四、總結
?
一、?什么是Socket?
Socket(套接字),用來描述IP地址和端口,是通信鏈的句柄,是支持TCP/IP協議的網絡通信的基本操作單元,是對網絡通信過程中端點的抽象表示。
通過 socket 這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。Socket()函數返回一個整型的Socket描述符,隨后的連接建立、數據傳輸等操作都是通過該Socket實現的。
插述:
TCP(Transmission Control Protocol)傳輸控制協議,是一種面向連接的、可靠的、基于字節流的通信協議。數據在傳輸前要建立連接,傳輸完畢后還要斷開連接。客戶端在收發數據前要使用 connect() 函數和服務器建立連接。建立連接的目的是保證IP地址、端口、物理鏈路等正確無誤,為數據的傳輸開辟通道。
二、Socket通信模型
以下內容來源于菜鳥7.6.2 基于TCP協議的Socket通信(1) | 菜鳥教程 (runoob.com)
?
Socket通信實現步驟解析:
Step 1:創建ServerSocket和Socket
Step 2:打開連接到的Socket的輸入/輸出流
Step 3:按照協議對Socket進行讀/寫操作
Step 4:關閉輸入輸出流,以及Socket
三、Socket編寫
1.服務端
先創建ServerSocket對象,用來綁定監聽的端口;
再調用accept()方法來監聽客戶端的請求;
連接建立后,通過輸入流讀取客戶端發送的請求信息,通過輸出流向客戶端發送響應信息;
最后記得關閉相關資源。
2.客戶端
先創建Socket對象,要指明需要鏈接的服務器的地址和端號,即兩個參數;
鏈接建立后,通過輸出流向服務器發送請求信,通過輸出流獲取服務器響應的信息;
最后關閉相關資源
三、代碼實現
帶界面的聊天程序:
package Java_網絡編程.帶界面的聊天程序;import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date;/*** @Date: 2021/10/29 - 10 - 29 - 11:35* @Description:*/ public class ChatFrame extends JFrame implements ActionListener {JTextField tf;//文本輸入框JTextArea ta;//接收所有聊天記錄JScrollPane sp;//滾動面板JButton send;JPanel p;//面板最下面的int port;//定義端口變量String s="";String myID;Date date;ServerSocket server;//服務器的對象Socket mysocket;//用來進行socket連接的對象BufferedReader is;//用來接收輸入PrintWriter os;//往外發送輸出String line;public ChatFrame(String ID,String remoteID,String IP,int port,boolean isServer){super(ID);myID=ID;this.port=port;ta=new JTextArea();ta.setEditable(false);//文本區域不可編輯sp=new JScrollPane(ta);this.setSize(330,400);this.setResizable(false);//不能改變窗口大小try {//設置界面風格,這是系統的顯示風格UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch (Exception e){System.out.println("UI error");}this.getContentPane().add(sp,"Center");//將滾動面板放在整個區域中央p=new JPanel();this.getContentPane().add(p,"South");send=new JButton("發送");tf=new JTextField(20);//文本輸入區域寬度20個字符tf.requestFocus();//要求光標放在文本輸入框上面p.add(tf);p.add(send);this.setDefaultCloseOperation(EXIT_ON_CLOSE);//設置可以退出this.setVisible(true);//可以顯示send.addActionListener(this);//注冊監聽器,當前對象處理tf.addActionListener(this);//誰當服務器,誰當客戶端if(isServer){try {//服務端server=null;try {server=new ServerSocket(port);}catch (Exception e){System.out.println("can not listen to:"+e);}mysocket=null;try{mysocket=server.accept();}catch (Exception e){System.out.println("Error:"+e);}is=new BufferedReader(new InputStreamReader(mysocket.getInputStream()));os=new PrintWriter(mysocket.getOutputStream());}catch (Exception e){System.out.println("Error:in server client socket"+e);}}else {try{//客戶端mysocket=new Socket(IP,port);os=new PrintWriter(mysocket.getOutputStream());is=new BufferedReader(new InputStreamReader(mysocket.getInputStream()));}catch (Exception e){System.out.println("Error:in client socket"+e);}}while (true){//一直循環try {line=is.readLine();//獲得輸入date=new Date();//顯示日期的格式: 年月日時分秒SimpleDateFormat formatter=new SimpleDateFormat("yyy-MM-dd HH:mm:ss");String currentTime=formatter.format(date);//獲取并轉化為字符穿s+=currentTime+""+remoteID+"說:\n"+line+"\n";ta.setText(s);//顯示文本區域上}catch (Exception e){System.out.println("Error:in receuve remote information"+e);}}}public void actionPerformed(ActionEvent e){//事件處理,捕捉信息date=new Date();//獲得信息SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-ss HH:mm:ss");String currentTime=formatter.format(date);//當前時間轉換格式s+=currentTime+""+myID+"說:\n"+tf.getText()+"\n";ta.setText(s);//顯示文本os.println(tf.getText());//剛文本框輸入信息打印os.flush();//輸出去,相當于從本地發送給另外聊天方tf.setText("");//把發送完的消息清理tf.requestFocus();//文本框獲得焦點} }服務端
package Java_網絡編程.帶界面的聊天程序;/*** @Date: 2021/11/6 - 11 - 06 - 16:34* @Description:*/ public class ChatServerFrame {public static void main(String[] args) {ChatFrame cserver=new ChatFrame("cat","dog","127.0.0.1",2009,true);} }客戶端
package Java_網絡編程.帶界面的聊天程序;/*** @Date: 2021/11/6 - 11 - 06 - 16:36* @Description:*/ public class ChatClientFrame {public static void main(String[] args) {ChatFrame cclient=new ChatFrame("Dog","Cat","127.0.0.1",2009,false);} }四、總結
? //創建Socket 客戶端對象 Socket s = new Socket("127.0.0.1",6666); //創建ServerSocket?服務器端對象。。 ServerSocket ss = new ServerSocket(6666); //監聽服務器連接 s = ss.accept();??
?
總結
- 上一篇: Galaxy s4怎么安装一个预装软件的
- 下一篇: django 403 错误:CSRF t