1. 程式人生 > >基本的Socket程式設計-基於Swing和AWT的客戶端

基本的Socket程式設計-基於Swing和AWT的客戶端



import
java.net.ServerSocket; import java.net.Socket; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.IOException; import java.io.BufferedReader; import java.io.PrintStream; /** ServerSocket服務端 */ public class SimpleServer{ //服務端 ServerSocket serverSkt = null;
//服務端accept返回的客戶端物件 Socket clientSkt = null; //服務端Socket的輸入流和輸出流,客戶端和服務端的輸入流、輸出流都是以對方為物件,都需要轉換成可列印的字元流 BufferedReader in = null; PrintStream out = null; //Socker服務端是基於Socket型別的埠,所以在建立物件時需要引數:埠,還需要接收客戶端請求和返回響應 public SimpleServer(int port){ System.out.println("服務端正在監聽埠:"+port);
try{ serverSkt = new ServerSocket(port); }catch(IOException e){ System.out.println("服務端埠"+port+"監聽失敗..."); e.printStackTrace(); } try{ //服務端返回的Socket物件 clientSkt = serverSkt.accept(); System.out.println(
"連線成功"); }catch(IOException e){ System.out.println("連線失敗..."); e.printStackTrace(); } try{ in = new BufferedReader(new InputStreamReader(clientSkt.getInputStream())); out = new PrintStream(clientSkt.getOutputStream()); System.out.println("初始化成功"); }catch(IOException e){ e.printStackTrace(); } } //通過服務端Socket物件,獲取客戶端的請求內容 public String getRequest(){ String frmClt = null; try{ frmClt = in.readLine(); System.out.println("server收到的請求:"+frmClt); }catch(IOException e){ System.out.println("無法獲取埠"); e.printStackTrace(); System.exit(1); } return frmClt; } //通過服務端socket物件,返回響應給客戶端,響應內容自定義 public void sendResponse(String response){ //Prints a String and then terminate the line. System.out.println("服務端響應:"+response); out.println(response); } public static void main(String[] args){ SimpleServer sa = new SimpleServer(8888); //等待客戶端的請求並自動返回全部響應 while(true){ sa.sendResponse(sa.getRequest()); } } }
import java.net.Socket;
import java.io.PrintStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

/**
Socket客戶端
*/

public class SimpleClient{
    Socket clientSkt = null;
    //客戶端Socket的輸入流和輸出流,客戶端和服務端的輸入流、輸出流都是以對方為物件
    PrintStream out = null;
    BufferedReader in = null;
    
    //通過服務端IP和監聽的埠進行連線
    public SimpleClient(String host, int port){
        try{
            clientSkt = new Socket(host, port);
            System.out.println("建立客戶端例項物件");
            in = new BufferedReader(new InputStreamReader(clientSkt.getInputStream()));
            out = new PrintStream(clientSkt.getOutputStream());
        }catch(IOException e){
            System.out.println("無法連線伺服器");
            e.printStackTrace();
            }
        }
    
    //傳送請求
    public void sendRequest(String request){
        out.println(request);
        System.out.println("向服務端傳送請求:"+request);
        }
        
    //接收響應
    public String getResponse(){
        String frmSer = null;
        try{
            frmSer = in.readLine();
            System.out.println("接收服務端響應:"+frmSer);
        }catch(IOException e){
            e.printStackTrace();
            }
        return frmSer;
        }    
    }
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import java.lang.System;

public class ClientFrame extends JFrame implements ActionListener{
    JButton sendButton;            //"傳送"按鈕
//    JTextField sendTextField;        //使用單行傳送單個請求
    JTextArea sendTextField;            //使用多行發多個送請求
    static JTextArea responseTextArea;    //接收響應
    static SimpleClient client;            //客戶端
    
    public ClientFrame(){
        JLabel sendLable = new JLabel();
        sendLable.setText("請求:");
//        sendTextField = new JTextField(20);        //宣告單行請求編輯框的列
        sendTextField = new JTextArea(6, 30);        //宣告多行請求編輯框的行和列
        sendTextField.setEditable(true);                //宣告多行編輯框可編輯
        JScrollPane scrollPane1= new JScrollPane(sendTextField);
        
        JPanel panel1 = new JPanel();
        panel1.add(sendLable);
        panel1.add(scrollPane1);
        
        JLabel receiveLable = new JLabel();
        receiveLable.setText("響應:");
        responseTextArea = new JTextArea(6, 30);    //宣告多行響應編輯框的行和列
        responseTextArea.setEditable(false);            //宣告多行編輯框不可編輯
        JScrollPane scrollPane2= new JScrollPane(responseTextArea);
        JPanel panel2 = new JPanel();
        panel2.setLayout(new BorderLayout());
        panel2.add(receiveLable, BorderLayout.NORTH);
        panel2.add(scrollPane2, BorderLayout.CENTER);
        
        sendButton = new JButton();
        sendButton.setText("傳送");
        sendButton.addActionListener(this);        //給"傳送"按鈕進行監聽
        
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(panel1, BorderLayout.NORTH);
        panel.add(sendButton, BorderLayout.CENTER);
        panel.add(panel2, BorderLayout.SOUTH);
        
        this.setTitle("Socket客戶端");
        this.getContentPane().add(panel);
        //關閉JFrame視窗時預設是隱藏視窗,需要更改預設行為
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
    public void actionPerformed(ActionEvent e){
        //The object on which the Event initially occurred.
        if(e.getSource()==sendButton){        //判斷是否是"傳送"按鈕觸發的事件
            client.sendRequest(sendTextField.getText());
            //介面responseTextArea動態更新展示內容 是以 按鈕操作觸發為參照,所以以換行傳送的多請求,客戶端每次順序從傳送佇列獲取請求傳送,所以僅能順序獲取一個響應
            //Socket請求是以'\r'或者'\n'作為間隔符,換行也是多請求的間隔符
//            responseTextArea.append(client.getResponse() + "\n");
            }
        }
        
    public static void main(String[] args){
        ClientFrame cliFrame = new ClientFrame();
        //元件自動匹配大小
        cliFrame.pack();
        //建立和服務端的連線
        cliFrame.client = new SimpleClient("127.0.0.1",8888);
        cliFrame.setVisible(true);
        //接收服務端所有響應並等待服務端響應
        //按鈕操作完以後,服務端返回的所有響應,客戶端都全部接收,而且等待新的請求響應
        while(true){
            responseTextArea.append(client.getResponse() + "\n");
            }
        }        
    }

後臺客戶端執行結果:

G:\maul keyboard\network programming\base socket programming\ClientFrame>java ClientFrame
建立客戶端例項物件
向服務端傳送請求:sfa
接收服務端響應:sfa
向服務端傳送請求:sfa
faf
gak
接收服務端響應:sfa
接收服務端響應:faf
接收服務端響應:gak

 

Swing和AWT的客戶端執行結果:

 

服務端執行結果:

G:\maul keyboard\network programming\base socket programming\ClientFrame>java SimpleServer
服務端正在監聽埠:8888
連線成功
初始化成功
server收到的請求:sfa
服務端響應:sfa
server收到的請求:sfa
服務端響應:sfa
server收到的請求:faf
服務端響應:faf
server收到的請求:gak
服務端響應:gak