1. 程式人生 > >java-基本的Socket程式設計-實現伺服器端和客戶端通訊

java-基本的Socket程式設計-實現伺服器端和客戶端通訊

基本的Socket程式設計:
本例項介紹Socket程式設計的基本步驟。啟動Socket服務後,再開啟Socket刻畫段,在輸入框中輸入訊息,然後傳送給伺服器端,伺服器端將收到的訊息返回到客戶端。

關鍵技術:
Socket程式設計的關鍵技術如下;
—–Socket伺服器端需要在某個埠上開啟服務端型別的Socket,即java.net.ServerSocket。通過他的accept方法等待並接收客戶端的請求,返回的是一個java.netSocket物件,如果一直沒有客戶端請求,那麼accept()方法將會一直等待。

—-Socket客戶端根據伺服器端的IP地址(域名)和埠號建立一個Socket物件,連線伺服器端。
—–伺服器端和客戶端都持有一個Socket物件,伺服器端的Socket從伺服器端指向客戶端,而客戶端的Socket從客戶端指向伺服器端,這就像在客戶端和伺服器端建立了兩條單向的管道。
—通過Socket類提供的getOutputStream方法獲得Socket的輸出流,getInputStream方法獲得Socket輸入流。

——————————
本例項分為三個類:SimpleServer實現了Socket伺服器端,SimpleClient實現了Socket客戶端,ClientFrame類將客戶端實現為一個GUI程式。

package com.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;



/*
 * 一個簡單的Socket伺服器,能接收客戶端請求,並將請求返回給客戶端
 * 
 */
public class SimpleServer { ServerSocket serverSkt=null;//伺服器端偵探聽的Socket Socket clientSket=null;//客戶端 BufferedReader in=null;//客戶端輸入流 PrintStream out=null;//客戶端輸出流 //構造方法 public SimpleServer(int port){ System.out.println("===伺服器正在監聽,埠:"+port+"==="); try{ serverSkt=new
ServerSocket(port);//建立監聽Socket }catch(IOException e){ System.out.println("監聽埠+"+port+"失敗"); } try{ clientSket=serverSkt.accept();//接收連線請求 }catch(IOException e){ System.out.println("連線失敗"); } //獲取輸入輸出流 try{ in=new BufferedReader (new InputStreamReader(clientSket.getInputStream())); out=new PrintStream(clientSket.getOutputStream()); }catch(IOException e){ } } //收到客戶端請求 public String getRequest(){ String frmClt=null; try { frmClt=in.readLine(); //從客戶端的輸入流中讀取一行資料 System.out.print("Server收到請求:"+frmClt); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("無法讀取埠....."); System.exit(0); } return frmClt; } //傳送響應給客戶端 public void sendResponse(String response){ try{ out.println(response);//往客戶端輸出流中寫入資料 System.out.println("Server響應請求:"+response); }catch(Exception e){ System.out.print("寫埠失敗"); System.exit(0); } } public static void main(String[] args) { SimpleServer sa= new SimpleServer(8888);//啟動伺服器 while(true){ //讀取客戶端的輸入並且返回客戶端 } } }
package com.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/*
 * 一個簡單的Socket客戶端,能夠往伺服器端傳送請求
 */
public class SimpleClient {
    //客戶端輸入輸出流
    PrintStream  out;
    BufferedReader  in;
    //構造方法
    public  SimpleClient(String  serverName,int port){
        //根據伺服器端名和埠號,連線伺服器
        try {
            Socket  clientSocket=new Socket(serverName, port);
            //獲取Socket的輸入輸出流
            out=new PrintStream(clientSocket.getOutputStream());
            in=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("無法連線到伺服器");
        }

    }

    //傳送請求
    public void sendRequest(String  request){
        out.println(request);//向Socket的輸出流中寫資料
        System.out.print("Client傳送請求:"+request);

    }


    public String  getReponse(){
        String  str=new  String();
        try{
            str=in.readLine();//從Socket的輸入流中讀取資料
            System.out.println("Client收到Server返回:"+str);
        }catch(IOException   e){
        }
        return  str;
    }

}
package com.socket;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * 客戶端的圖形介面
 */
public class ClientFrame extends JFrame implements ActionListener {
    // "傳送"按鈕
    JButton sendButton; 
    // 傳送內容的輸入框
    JTextField inputField; 
    // 伺服器返回內容的文字域
    JTextArea outputArea;

    // 客戶端socket物件
    SimpleClient client;

    // 在建構函式中完成圖形介面的初始化
    public ClientFrame() {
        JLabel label1 = new JLabel("輸入: ");
        inputField = new JTextField(20);
        JPanel panel1 = new JPanel();
        panel1.add(label1);
        panel1.add(inputField);

        JLabel label2 = new JLabel("伺服器返回: ");
        outputArea = new JTextArea(6, 20); 
        JScrollPane crollPane = new JScrollPane(outputArea);
        JPanel panel2 = new JPanel();
        panel2.setLayout(new BorderLayout());
        panel2.add(label2, BorderLayout.NORTH);
        panel2.add(crollPane, BorderLayout.CENTER);

        sendButton = new JButton("發 送");
        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.PAGE_END);

        setTitle("Socket 客戶端");
        this.getContentPane().add(panel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent ae) {
        // 判斷事件源控制元件是否是"傳送"按鈕
        if (ae.getSource() == sendButton) {
            try {
                // 傳送文字框中的文字
                client.sendRequest(inputField.getText()); 
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            // 接收伺服器迴應並寫入文字域
            outputArea.append(client.getReponse() + "\n"); 
        }
    }

    public static void main(String[] args) {
        ClientFrame frame = new ClientFrame();
        frame.pack();
        // 連線伺服器
        frame.client = new SimpleClient("127.0.0.1", 8888); 
        frame.setVisible(true);

    }

}