欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于java TCP網(wǎng)絡(luò)通信的實(shí)例詳解

 更新時(shí)間:2013年05月21日 16:37:16   作者:  
本篇文章是對(duì)java中TCP網(wǎng)絡(luò)通信的實(shí)例進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
JAVA中設(shè)計(jì)網(wǎng)絡(luò)編程模式的主要有TCP和UDP兩種,TCP是屬于即時(shí)通信,UDP是通過(guò)數(shù)據(jù)包來(lái)進(jìn)行通信,UDP當(dāng)中就會(huì)牽扯到數(shù)據(jù)的解析和傳送。在安全性能方面,TCP要略勝一籌,通信過(guò)程中不容易出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象,有一方中斷,兩方的通信就會(huì)結(jié)束,UDP數(shù)據(jù)包傳送的過(guò)程當(dāng)中,一方中斷,數(shù)據(jù)包有很大的可能丟失,還有可能傳來(lái)的數(shù)據(jù)包的順序是錯(cuò)亂的;在效率方面,UDP要比TCP快的不只是一點(diǎn)點(diǎn)的問(wèn)題,若終端有解析數(shù)據(jù)方法的函數(shù),數(shù)據(jù)包就會(huì)源源不斷的傳送過(guò)來(lái),然后反饋回去。
以上都是我自己的理解,下面是關(guān)于TCP協(xié)議通信的兩個(gè)類;
Server類:
復(fù)制代碼 代碼如下:

package TCP;
import java.io.*;
import java.net.*;
import javax.swing.*;
 public class Server {
     //服務(wù)器端的輸入流
    static  BufferedReader br;
     //服務(wù)器端的輸出流
    static  PrintStream ps;
     //服務(wù)器相關(guān)的界面組件
    static  JTextArea text;   
            JFrame frame;

    public Server(){
        //服務(wù)器端的界面的實(shí)例化
        JFrame frame=new JFrame("服務(wù)器端");
        text=new JTextArea();
        JScrollPane scroll =new JScrollPane(text);
        frame.add(scroll);
        frame.setVisible(true);
        frame.setSize(300,400);
        //這里設(shè)置服務(wù)器端的文本框是不可編輯的
        text.setEditable(false);
    }

    public static void main(String[] args) throws Exception{      
        new Server();    //生成服務(wù)器界面
        //通過(guò)服務(wù)器端構(gòu)造函數(shù)  ServerSocket(port) 實(shí)例化一個(gè)服務(wù)器端口
        ServerSocket server=new ServerSocket(2000);
        text.append("監(jiān)聽2000端口"+"\n");
        //實(shí)例化一個(gè)接受服務(wù)器數(shù)據(jù)的對(duì)象
        Socket client=server.accept();
        br =new BufferedReader(new InputStreamReader(client.getInputStream()));
        ps =new PrintStream(client.getOutputStream());       
        String msg;
        //如果輸入流不為空,將接受到的信息打印到相應(yīng)的文本框中并反饋回收到的信息
        while ((msg =br.readLine())!=null) 
        {
            text.append("服務(wù)器端收到:"+msg+"\n");
            ps.println(msg);
            if(msg.equals("quit"))
            {  
                text.append("客戶端“2000”已退出!"+"\n");
                text.append("服務(wù)器程序?qū)⑼顺觯?);               
                break;
            }
        }
        ps.close();
        br.close();
        client.close();
    }
}

Client類:
復(fù)制代碼 代碼如下:

package TCP;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.net.*;
public class Client implements ActionListener{
   //這里有兩個(gè)圖形界面,一個(gè)是連接的frame,另一個(gè)和服務(wù)器通信的界面frame1   
    private  JFrame frame;
    private  JLabel adress;
    private  JLabel port;
             JTextField adresstext;
             JTextField porttext;
             JButton connect;

    private JFrame frame1;
    private JLabel shuru;
    private JPanel panel1;
    private JPanel panel2;
    private JLabel jieshou;
            JButton send;
    static JTextArea shurukuang;
    static TextArea jieshoukuang;

    //從服務(wù)端接受的數(shù)據(jù)流
    static BufferedReader br1;
    //從客戶端輸出的數(shù)據(jù)流
    static PrintStream ps;
    //從通信界面中的輸入框接受的數(shù)據(jù)流
    static BufferedReader br2;
    static Socket client;
    //將輸入框字符串轉(zhuǎn)換為字符串流所需的字符串的輸入流
    static ByteArrayInputStream stringInputStream ;

   public Client() {
       //連接界面的實(shí)例化
        frame=new JFrame();
        adress=new JLabel("IP 地址");
        port =new JLabel("端口號(hào)");
        adresstext=new JTextField("127.0.0.1",10);
        porttext=new JTextField("2000",10);
        connect=new JButton("連接");
            //連接界面的布局          
        frame.setLayout(new FlowLayout());
        frame.add(adress);
        frame.add(adresstext);
        frame.add(port);  
        frame.add(porttext);
        frame.add(connect);
        frame.setVisible(true);
        frame.setSize(200,150);          
        connect.addActionListener(this);
          //通信界面的實(shí)例化
        frame1=new JFrame();
        shuru=new JLabel("請(qǐng)輸入");
          shurukuang=new JTextArea("請(qǐng)輸入····",5,40); 

          panel1=new JPanel();
          panel1.add(shuru);
          panel1.add(shurukuang);
          panel1.setLayout(new FlowLayout());

          send=new JButton("發(fā)送");
          panel2=new JPanel();
          jieshou=new JLabel("已接受");

         jieshoukuang=new TextArea(8,60);    
          jieshoukuang.setEditable(false);

          panel2.add(jieshou);
          panel2.add(jieshoukuang);
          panel2.setLayout(new FlowLayout());       
          frame1.setLayout(new FlowLayout());
              //通信界面都的布局
          frame1.add(BorderLayout.NORTH,panel1);
          frame1.add(send);
          frame1.add(BorderLayout.SOUTH,panel2);
             //連接時(shí)通信界面是處于看不到的
          frame1.setVisible(false);
          frame1.setSize(500,350);
          send.addActionListener(this); 
            }
         //兩個(gè)界面當(dāng)中都有相應(yīng)的按鈕時(shí)間,為相應(yīng)的時(shí)間添加動(dòng)作
      public  void  actionPerformed(ActionEvent e) {
         if(e.getSource()==connect){   
          try {
                  //當(dāng)觸發(fā)連接按鈕時(shí),實(shí)例化一個(gè)客戶端
                client=new Socket("127.0.0.1",2000);   
                  //隱藏連接界面,顯示通信界面
                frame.setVisible(false);
                frame1.setVisible(true);
                jieshoukuang.append("已經(jīng)連接上服務(wù)器!"+"\n");           
           } catch (IOException e1){
                 System.out.println("鏈接失??!");
                e1.printStackTrace();
             }
         }
         //通信界面中的發(fā)送按鈕相應(yīng)的時(shí)間處理
        if(e.getSource()==send){
              //將輸入框中的字符串轉(zhuǎn)換為字符串流
             stringInputStream = new ByteArrayInputStream((shurukuang.getText()).getBytes());
             br2 =new BufferedReader(new InputStreamReader(stringInputStream));
             String msg;
             try{
              while((msg=br2.readLine())!=null){   
                  ps.println(msg);   //將輸入框中的內(nèi)容發(fā)送給服務(wù)器端       
                  jieshoukuang.append("向服務(wù)器發(fā)送:"+msg+"\n");
                  jieshoukuang.append("客戶端接受相應(yīng):"+br1.readLine()+"\n");
                  if(msg.equals("quit"))
                     {
                        jieshoukuang.append("客戶端將退出!");
                        br1.close();
                        ps.close();
                        client.close();
                        frame1.setVisible(false);
                        break;
                           }                     
                      }   
             }catch(IOException e2){
                 System.out.println("讀輸入框數(shù)據(jù)出錯(cuò)!");                 
              }
             shurukuang.setText("");
          }
      } 

      public static void main(String[] args) throws IOException{
           new Client();  //實(shí)例化連接界面
           client=new Socket("127.0.0.1",2000);            
           //從服務(wù)端接受的數(shù)據(jù) 
           br1=new BufferedReader(new InputStreamReader(client.getInputStream()));
            //從客戶端輸出的數(shù)據(jù)
           ps =new PrintStream(client.getOutputStream());         
              }
        }

寫完這兩個(gè)類以后還是有幾個(gè)問(wèn)題:
1)main 函數(shù)為什么非要用 static 來(lái)修飾?
2)緩沖對(duì)象 BufferedReader 為什么不能直接用于判斷,非要將讀到的數(shù)據(jù)賦值給字符串來(lái)進(jìn)行操作?
3)在連接界面當(dāng)中的 Connect 按鈕事件 當(dāng)中我有實(shí)例化一個(gè) 客戶端的對(duì)象,但是我注釋掉主函數(shù)當(dāng)中 client=new Socket("127.0.0.1",2000); 的這一句的時(shí)候,就會(huì)發(fā)現(xiàn)拋出 NULLPOINTEXCEPTION 異常,我很不理解?
希望有看到這文章的大牛們能不吝賜教,我也正在不停的翻著《Think in java》希望在某個(gè)不起眼的角落里面發(fā)現(xiàn)我的答案。

相關(guān)文章

  • Java方法上注解值修改不成功的問(wèn)題

    Java方法上注解值修改不成功的問(wèn)題

    這篇文章主要介紹了Java方法上注解值修改不成功的解決方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • SpringBoot中使用AOP切面編程實(shí)現(xiàn)登錄攔截功能

    SpringBoot中使用AOP切面編程實(shí)現(xiàn)登錄攔截功能

    本文介紹了如何使用AOP切面編程實(shí)現(xiàn)Spring Boot中的登錄攔截,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • Springboot整合支付寶支付功能

    Springboot整合支付寶支付功能

    這篇文章主要介紹了Springboot整合支付寶支付功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析

    Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析

    這篇文章主要為大家介紹了Java中的NoClassDefFoundError含義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-11-11
  • springboot項(xiàng)目配置swagger2示例詳解

    springboot項(xiàng)目配置swagger2示例詳解

    Swagger是一款RESTful接口的文檔在線自動(dòng)生成、功能測(cè)試功能框架。本文重點(diǎn)給大家介紹springboot項(xiàng)目配置swagger2示例代碼詳解,需要的朋友參考下吧
    2021-09-09
  • Java泛型可行與不可行的原理示例解析

    Java泛型可行與不可行的原理示例解析

    這篇文章主要為大家介紹了Java泛型可行與不可行的原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加
    2023-05-05
  • Java垃圾回收算法及GC觸發(fā)條件解讀

    Java垃圾回收算法及GC觸發(fā)條件解讀

    Java垃圾回收機(jī)制自動(dòng)管理內(nèi)存,減輕開發(fā)負(fù)擔(dān)但存在性能開銷與延遲問(wèn)題,主流算法包括標(biāo)記清除、復(fù)制、分代回收等,通過(guò)分代策略提升效率,觸發(fā)條件涉及新生代與老年代,優(yōu)化需調(diào)參、對(duì)象復(fù)用及減少臨時(shí)對(duì)象,未來(lái)趨勢(shì)為低延遲、大內(nèi)存支持及智能化GC技術(shù)
    2025-07-07
  • Javaweb 500 服務(wù)器內(nèi)部錯(cuò)誤的解決

    Javaweb 500 服務(wù)器內(nèi)部錯(cuò)誤的解決

    這篇文章主要介紹了Javaweb 500 服務(wù)器內(nèi)部錯(cuò)誤的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 深入探討JAVA中的異常與錯(cuò)誤處理

    深入探討JAVA中的異常與錯(cuò)誤處理

    這篇文章詳細(xì)介紹了JAVA中的異常與錯(cuò)誤處理,有需要的朋友可以參考一下
    2013-09-09
  • 快速掌握J(rèn)ava中注解與反射

    快速掌握J(rèn)ava中注解與反射

    本文詳細(xì)介紹了Java中注解和反射的概念及應(yīng)用,注解是用于給代碼添加元數(shù)據(jù)的標(biāo)記,如@Override、@Deprecated等,反射機(jī)制則是在運(yùn)行時(shí)獲取和操作類的內(nèi)部信息,提高了代碼的靈活度,感興趣的朋友跟隨小編一起看看吧
    2023-06-06

最新評(píng)論