程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 基於java TCP收集通訊的實例詳解

基於java TCP收集通訊的實例詳解

編輯:關於JAVA

基於java TCP收集通訊的實例詳解。本站提示廣大學習愛好者:(基於java TCP收集通訊的實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是基於java TCP收集通訊的實例詳解正文


JAVA中設計收集編程形式的重要有TCP和UDP兩種,TCP是屬於即時通訊,UDP是經由過程數據包來停止通訊,UDP傍邊就會牽扯到數據的解析和傳送。在平安機能方面,TCP要略勝一籌,通訊進程中不輕易湧現數據喪失的景象,有一方中止,兩方的通訊就會停止,UDP數據包傳送的進程傍邊,一方中止,數據包有很年夜的能夠喪失,還有能夠傳來的數據包的次序是紊亂的;在效力方面,UDP要比TCP快的不只是一點點的成績,若終端有解析數據辦法的函數,數據包就會源源赓續的傳送過去,然後反應歸去。
以上都是我本身的懂得,上面是關於TCP協定通訊的兩個類;
Server類:

package TCP;
import java.io.*;
import java.net.*;
import javax.swing.*;
 public class Server {
     //辦事器真個輸出流
    static  BufferedReader br;
     //辦事器真個輸入流
    static  PrintStream ps;
     //辦事器相干的界面組件
    static  JTextArea text;   
            JFrame frame;

    public Server(){
        //辦事器真個界面的實例化
        JFrame frame=new JFrame("辦事器端");
        text=new JTextArea();
        JScrollPane scroll =new JScrollPane(text);
        frame.add(scroll);
        frame.setVisible(true);
        frame.setSize(300,400);
        //這裡設置辦事器真個文本框是弗成編纂的
        text.setEditable(false);
    }

    public static void main(String[] args) throws Exception{      
        new Server();    //生成辦事器界面
        //經由過程辦事器端結構函數  ServerSocket(port) 實例化一個辦事器端口
        ServerSocket server=new ServerSocket(2000);
        text.append("監聽2000端口"+"\n");
        //實例化一個接收辦事器數據的對象
        Socket client=server.accept();
        br =new BufferedReader(new InputStreamReader(client.getInputStream()));
        ps =new PrintStream(client.getOutputStream());       
        String msg;
        //假如輸出流不為空,將接收到的信息打印到響應的文本框中並反應收受接管到的信息
        while ((msg =br.readLine())!=null) 
        {
            text.append("辦事器端收到:"+msg+"\n");
            ps.println(msg);
            if(msg.equals("quit"))
            {  
                text.append("客戶端“2000”已加入!"+"\n");
                text.append("辦事器法式將加入!");               
                break;
            }
        }
        ps.close();
        br.close();
        client.close();
    }
}

Client類:

package TCP;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.net.*;
public class Client implements ActionListener{
   //這裡有兩個圖形界面,一個是銜接的frame,另外一個和辦事器通訊的界面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;

    //從辦事端接收的數據流
    static BufferedReader br1;
    //從客戶端輸入的數據流
    static PrintStream ps;
    //從通訊界面中的輸出框接收的數據流
    static BufferedReader br2;
    static Socket client;
    //將輸出框字符串轉換為字符串流所需的字符串的輸出流
    static ByteArrayInputStream stringInputStream ;

   public Client() {
       //銜接界面的實例化
        frame=new JFrame();
        adress=new JLabel("IP 地址");
        port =new JLabel("端標語");
        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);
          //通訊界面的實例化
        frame1=new JFrame();
        shuru=new JLabel("請輸出");
          shurukuang=new JTextArea("請輸出····",5,40); 

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

          send=new JButton("發送");
          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);
             //銜接時通訊界面是處於看不到的
          frame1.setVisible(false);
          frame1.setSize(500,350);
          send.addActionListener(this); 
            }
         //兩個界面傍邊都有響應的按鈕時光,為響應的時光添加舉措
      public  void  actionPerformed(ActionEvent e) {
         if(e.getSource()==connect){   
          try {
                  //當觸發銜接按鈕時,實例化一個客戶端
                client=new Socket("127.0.0.1",2000);   
                  //隱蔽銜接界面,顯示通訊界面
                frame.setVisible(false);
                frame1.setVisible(true);
                jieshoukuang.append("曾經銜接上辦事器!"+"\n");           
           } catch (IOException e1){
                 System.out.println("鏈接掉敗!");
                e1.printStackTrace();
             }
         }
         //通訊界面中的發送按鈕響應的時光處置
        if(e.getSource()==send){
              //將輸出框中的字符串轉換為字符串流
             stringInputStream = new ByteArrayInputStream((shurukuang.getText()).getBytes());
             br2 =new BufferedReader(new InputStreamReader(stringInputStream));
             String msg;
             try{
              while((msg=br2.readLine())!=null){   
                  ps.println(msg);   //將輸出框中的內容發送給辦事器端       
                  jieshoukuang.append("向辦事器發送:"+msg+"\n");
                  jieshoukuang.append("客戶端接收響應:"+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("讀輸出框數據失足!");                 
              }
             shurukuang.setText("");
          }
      } 

      public static void main(String[] args) throws IOException{
           new Client();  //實例化銜接界面
           client=new Socket("127.0.0.1",2000);            
           //從辦事端接收的數據 
           br1=new BufferedReader(new InputStreamReader(client.getInputStream()));
            //從客戶端輸入的數據
           ps =new PrintStream(client.getOutputStream());         
              }
        }

寫完這兩個類今後照樣有幾個成績:
1)main 函數為何非要用 static 來潤飾?
2)緩沖對象 BufferedReader 為何不克不及直接用於斷定,非要將讀到的數據賦值給字符串來停止操作?
3)在銜接界面傍邊的 Connect 按鈕事宜 傍邊我有實例化一個 客戶真個對象,然則我正文失落主函數傍邊 client=new Socket("127.0.0.1",2000); 的這一句的時刻,就會發明拋出 NULLPOINTEXCEPTION 異常,我很不睬解?
願望有看到這文章的年夜牛們能不惜賜教,我也正在一直的翻著《Think in java》願望在某個不起眼的角落外面發明我的謎底。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved