基本的Socket程式設計-基於Swing和AWT的客戶端
阿新 • • 發佈:2018-11-25
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