Java Socket編程之TCP

來源:互聯網
上載者:User

標籤:傳輸   處理   buffere   system   info   密碼   ++   import   public   

基於TCP的Socket通訊:

伺服器端:

  1. 建立一個伺服器端Socket,即ServerSocket,指定綁定的連接埠,並監聽此連接埠
  2. 調用accept()方法開始監聽,等待用戶端的串連
  3. 串連建立後,通過輸入資料流讀取客戶發送的請求資訊
  4. 通過輸出資料流向用戶端發送響應資訊
  5. 關閉相關資源

用戶端:

  1. 建立用戶端Socket,指定伺服器位址和連接埠
  2. 串連建立後,通過輸出資料流,向伺服器端發送資訊
  3. 擷取輸入資料流,並讀取伺服器端的響應資訊
  4. 關閉資源

例:伺服器端:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class Server {    public static void main(String[] args) {        try {            //1.建立一個伺服器端Socket,即ServerSocket,指定綁定的連接埠,並監聽此連接埠            ServerSocket serverSocket=new ServerSocket(8888);            Socket socket=null;            //記錄用戶端的數量            int count=0;            System.out.println("***伺服器即將啟動,等待用戶端的串連***");            //迴圈監聽等待用戶端的串連            while(true){                //調用accept()方法開始監聽,等待用戶端的串連                socket=serverSocket.accept();                //建立一個新的線程                ServerThread serverThread=new ServerThread(socket);                //啟動線程                serverThread.start();                count++;//統計用戶端的數量                System.out.println("用戶端的數量:"+count);                InetAddress address=socket.getInetAddress();                System.out.println("當前用戶端的IP:"+address.getHostAddress());            }        } catch (IOException e) {            e.printStackTrace();        }    }}

   用戶端:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class Client {    public static void main(String[] args) {        try {            //1.建立用戶端Socket,指定伺服器位址和連接埠            Socket socket=new Socket("localhost", 8888);            //2.擷取輸出資料流,向伺服器端發送資訊            OutputStream os=socket.getOutputStream();//位元組輸出資料流            PrintWriter pw=new PrintWriter(os);//將輸出資料流封裝為列印流            pw.write("使用者名稱:alice;密碼:789");            pw.flush();            socket.shutdownOutput();//關閉輸出資料流            //3.擷取輸入資料流,並讀取伺服器端的響應資訊            InputStream is=socket.getInputStream();            BufferedReader br=new BufferedReader(new InputStreamReader(is));            String info=null;            while((info=br.readLine())!=null){                System.out.println("我是用戶端,伺服器說:"+info);            }            //4.關閉資源            br.close();            is.close();            pw.close();            os.close();            socket.close();        } catch (UnknownHostException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}

伺服器線程處理類:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;public class ServerThread extends Thread {    // 和本線程相關的Socket    Socket socket = null;        public ServerThread(Socket socket) {        this.socket = socket;    }    //線程執行的操作,響應用戶端的請求    public void run(){        InputStream is=null;        InputStreamReader isr=null;        BufferedReader br=null;        OutputStream os=null;        PrintWriter pw=null;        try {            //擷取輸入資料流,並讀取用戶端資訊            is = socket.getInputStream();            isr = new InputStreamReader(is);            br = new BufferedReader(isr);            String info=null;            while((info=br.readLine())!=null){//迴圈讀取用戶端的資訊                System.out.println("我是伺服器,用戶端說:"+info);            }            socket.shutdownInput();//關閉輸入資料流            //擷取輸出資料流,響應用戶端的請求            os = socket.getOutputStream();            pw = new PrintWriter(os);            pw.write("歡迎您!");            pw.flush();//調用flush()方法將緩衝輸出        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            //關閉資源            try {                if(pw!=null)                    pw.close();                if(os!=null)                    os.close();                if(br!=null)                    br.close();                if(isr!=null)                    isr.close();                if(is!=null)                    is.close();                if(socket!=null)                    socket.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

使用TCP通訊傳輸對象:

       ObjectOutputStream oos=new ObjectOutputStream(os);

       User user=new User(“admin”,”123”);//封裝為對象

       oos.writeObject(user);//序列化

Tips:

   優先順序問題:serverthread.setPriority();//降低優先順序,以防運行速度較慢

        輸入輸出資料流問題:同一個Socket,關閉輸出資料流則會關閉與之關聯的Socket,所以不用關閉輸出資料流,最後關閉Socket即可。

Java Socket編程之TCP

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.