java通信系列之一by_書訢:通信基礎和簡單服務器客戶端創建

引子:
感謝閱讀
這一篇博客是我們整個JAVA通信的實操第一篇,希望大家多多支持

項目下載地址在文章末尾,如果出現了問題請留言~~
希望作爲讀者的你們可以多多關注我的作品,並留言或者加我qq一起學習

因爲之前自己在學習的時候總是覺得有些博主們講的有些快,所以我會講的比較詳細,能力好的可以快速掠過~~

若需轉載請註明來處:http://blog.csdn.net/SX_csu2016sw
希望你們多多留言,你們的鼓勵與指出的不足都是懶癌青年前進的動力

簡單通信知識

這些時間接觸了通信,在接下來的時間會一步一步將我學習通信的知識進行總結,並將結合有趣的項目進行分享知識,以幫助同行的DREAMER

通信的一些命令行使用總結

ping:使用ping命令可以檢查網絡是否通的,例如這邊我使用的ping www.baidu.com 來檢測我和百度是否連通
!!注意:ping命令只可以檢測我們是否能夠與指定ip的主機連接,並不能知道是否開啓某個端口
這裏寫圖片描述

telnet:telnet用來連接指定ip的主機
例如上面的圖片中我們知道,百度在一臺服務器對我們的響應,ip爲112.80.248.73
我們可以使用telnet 112.80.248.73 80來進行連接 telnet +ip+ 端口號
提供給web端口都是80或者8080,這裏引申一下網頁的一些原理
瀏覽器通過我們的域名將訪問請求發送出去,在某一臺服務器響應以後將html等反饋,在瀏覽器上進行解釋就可以形成我們的網頁了(希望讀者自己去了解一下,書訢可能不是正確的)

netstat /netstat -an:
我們的電腦無時無刻不在通信,通過這個命令我們就可以知道我們的電腦現在在和哪些電腦發生着通信
這裏寫圖片描述

開始創建服務器端


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class QQ_v1 {
    private ServerSocket server;

    /**
     * 創建我們的服務器
     * @param port:端口號
     */
    public void setSever(int port){
        try {
            server = new ServerSocket(port);//這邊需要的是n<65535的所以會出現IO異常
            System.out.println("服務器創建成功");
            while(true){
                Socket socket=server.accept();
                process(socket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * process是對每一個客戶端的處理
     * @param socket客戶端對象
     * @throws Exception
     */
    public void process(Socket socket) throws Exception{
        OutputStream out =socket.getOutputStream();
        InputStream ins=socket.getInputStream();

        sendMsg(out,ins,socket,"歡迎來到我的服務器");

        String read=readString(ins);
        while(!read.equals("bye")){//---------字符串的對比使用equals
            System.out.println("客戶機說了"+read);
            sendMsg(out,ins,socket,"服務器收到"+read+"\r\n");
            read=readString(ins);
        }

        sendMsg(out,ins,socket,"歡迎下次再來");

        out.close();
        ins.close();
        socket.close();
    }
    /**
     * 發送消息都封裝在這個函數中
     * @param out
     * @param ins
     * @param socket
     * @param s
     * @throws IOException
     */
    public void sendMsg(OutputStream out,InputStream ins,Socket socket,String s) throws IOException{
        byte []data=s.getBytes();
        out.write(data);
        out.flush();
    }
    /**
     * 讀一行的數據使得成爲String類型,同時使用trim()作用下面寫了
     * @param input
     * @return
     * @throws Exception
     */
    public String readString(InputStream input) throws Exception  {
        StringBuffer s =new StringBuffer();
        char c=0;
        while (c!=13){
            int i=input.read();
            c=(char)i;
            s.append(c);
        }
        return s.toString().trim();//返回一個字符串,該字符串的值是這個字符串,去掉了所有的開頭和後面的空格。
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        QQ_v1 server=new QQ_v1();
        server.setSever(9090);
    }
}

以上就是我們簡單服務器的所有代碼。
上面我已經將普通的封裝了一下,解釋一下幾個點:
1.ServerSocket server=new ServerSocket (port)創建服務器對象,因爲本機運行代碼所以ip是默認傳過去的,只需要再給一個端口號就可以了。
2. Socket socket=server.accept();這邊會產生阻塞,原因是這邊我們的服務器會一直等待着客戶端的連接,等到客戶機連接上了以後我們的socket就會將客戶機保存至socket對象中,同理在之後我們寫客戶端的時候socket保存的就是我們的服務器。
3. 其他的就是IO處理,但是需要注意的是我們有一個函數readString();裏面的一些操作還是值得一看的~
4. 最後我們怎麼連接上服務器呢?
CMD->telnet localhost 9090 localhost表示本機IP
(因爲我在主函數傳入的端口號是9090所以連接本機時候也需要9090)

運行實例:
這裏寫圖片描述
這裏寫圖片描述

http://download.csdn.net/detail/sx_csu2016sw/9918498源代碼下載地址
感謝閱讀,多多留言,一起學習~

發佈了32 篇原創文章 · 獲贊 30 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章