Java ServerSocket和Socket 的網(wǎng)絡(luò)編程

Java ServerSocket和Socket 的網(wǎng)絡(luò)編程

Socket類
Socket(InetAddress address, int port)
創(chuàng)建一個(gè)流套接字并將其連接到指定 IP 地址的指定端口號(hào)狸棍。
Socket(String host, int port)
創(chuàng)建一個(gè)流套接字并將其連接到指定主機(jī)上的指定端口號(hào)涨颜。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
創(chuàng)建一個(gè)套接字并將其連接到指定遠(yuǎn)程地址上的指定遠(yuǎn)程端口。
Socket(String host, int port, InetAddress localAddr, int localPort)
創(chuàng)建一個(gè)套接字并將其連接到指定遠(yuǎn)程主機(jī)上的指定遠(yuǎn)程端口捡鱼。

close()
關(guān)閉此套接字滴铅。
connect(SocketAddress endpoint)
將此套接字連接到服務(wù)器。
connect(SocketAddress endpoint, int timeout)
將此套接字連接到服務(wù)器屯援,并指定一個(gè)超時(shí)值庐橙。
getInetAddress()
返回套接字連接的地址。
getInputStream()
返回此套接字的輸入流。
getLocalPort()
返回此套接字綁定到的本地端口包蓝。
getOutputStream()
返回此套接字的輸出流。
getPort()
返回此套接字連接到的遠(yuǎn)程端口瘾英。

ServerSocket類
ServerSocket(int port)
創(chuàng)建綁定到特定端口的服務(wù)器套接字县爬。
accept()
偵聽并接受到此套接字的連接卷拘。
getInetAddress()
返回此服務(wù)器套接字的本地地址。

Socket編程步驟
服務(wù)器端創(chuàng)建ServerSocket對(duì)象改鲫,調(diào)用accept方法返回Socket對(duì)象
客戶端創(chuàng)建Socket對(duì)象,通過端口連接到服務(wù)器
客戶端锨阿、服務(wù)器端都使用Socket中的getInputStream方法和getOutputStream方法獲得輸入流和輸出流酵使,進(jìn)一步進(jìn)行數(shù)據(jù)讀寫操作

(InetAddress用來描述主機(jī)地址;
Socket用來創(chuàng)建兩臺(tái)主機(jī)之間的連接礁扮;
ServerSocket用來偵聽來自客戶端的請(qǐng)求曙痘;
Socket通常稱作“套接字”罢洲,通常通過“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求院究。)

服務(wù)端步驟:
1业汰、創(chuàng)建套接字
2、將套接字綁定到一個(gè)本地地址和端口上鳍怨。
3鞋喇、將套接字設(shè)為監(jiān)聽模式醒串,準(zhǔn)備接受客戶請(qǐng)求膘壶。
4柬赐、等待客戶請(qǐng)求到來贫堰;當(dāng)請(qǐng)求到來之后,接受連接請(qǐng)求压彭,返回一個(gè)新的對(duì)應(yīng)于此次連接的套接字睦优。啟動(dòng)線程為當(dāng)前的連接服務(wù)。
5壮不、返回汗盘,等待另外一個(gè)客戶請(qǐng)求。
6询一、關(guān)閉套接字

客戶端步驟:
1隐孽、創(chuàng)建套接字。
2健蕊、向服務(wù)器發(fā)出連接請(qǐng)求菱阵。
3、和服務(wù)器端進(jìn)行通信缩功。
4晴及、關(guān)閉套接字。

注意: 由于server和client都是接受一行數(shù)據(jù)嫡锌,所以在發(fā)送數(shù)據(jù)的時(shí)候加 "\r\n" 結(jié)束符

ServerSocket示例

package com.lvyuanj.core.java;

import io.netty.util.CharsetUtil;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class PlainOioServer {

    private final static String END_COMMAND = "\r\n";
    
    private final static String RECEIPINFO ="ACKNOWLEDGE RECEIPT"+ END_COMMAND;

    public void initServer(int port) throws Exception {
        final ServerSocket socket = new ServerSocket(port);
        System.out.println("server start ......");
        while (true) {
            Socket clientSocket = socket.accept();
            System.out.println("Accepted connection from " + clientSocket);
            new Thread(new MyThread(clientSocket)).start();
        }
    }

    class MyThread implements Runnable {

        private Socket socket;

        public MyThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                InputStream in = socket.getInputStream();
                OutputStream out = socket.getOutputStream();

                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String data = null;
                while ((data = reader.readLine()) != null) {
                    System.out.println("receipt "+socket.getInetAddress()+" client data:" + data);
                    out.write(RECEIPINFO.getBytes(CharsetUtil.UTF_8));
                    out.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws Exception {
        PlainOioServer plainOioServer = new PlainOioServer();
        plainOioServer.initServer(8899);
    }
}

client 示例:

package com.lvyuanj.core.java;

import java.io.*;
import java.net.Socket;

public class PlainOioClient {

    private final static String END_COMMAND = "\r\n";

    class ReceiptThread implements Runnable{

        private Socket socket;

        public ReceiptThread(Socket socket){
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                System.out.println("start client console listener:");
                //讀取服務(wù)器返回的消息
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                String str = null;
                while((str = br.readLine())!=null){    //阻塞式讀取數(shù)據(jù)
                    writer.write(str+END_COMMAND);
                    writer.flush();

                    if("bye".equals(str)){
                        socket.close();
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args){
        try{
            Socket socket = new Socket("127.0.0.1",8899);

            PlainOioClient plainOioClient = new PlainOioClient();
            ReceiptThread sendDataThread = plainOioClient.new ReceiptThread(socket);
            //從控制獲取數(shù)據(jù)并發(fā)送服務(wù)器線程
            new Thread(sendDataThread).start();

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String body;
            while((body = reader.readLine()) != null){
                System.out.println("receipt server data:"+body);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虑稼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子势木,更是在濱河造成了極大的恐慌蛛倦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啦桌,死亡現(xiàn)場(chǎng)離奇詭異溯壶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)震蒋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門茸塞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人查剖,你說我怎么就攤上這事钾虐。” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵殷蛇,是天一觀的道長。 經(jīng)常有香客問我史辙,道長菌仁,這世上最難降的妖魔是什么浩习? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮济丘,結(jié)果婚禮上谱秽,老公的妹妹穿的比我還像新娘。我一直安慰自己摹迷,他們只是感情好疟赊,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峡碉,像睡著了一般近哟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲫寄,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天吉执,我揣著相機(jī)與錄音,去河邊找鬼地来。 笑死戳玫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠抑。 我是一名探鬼主播量九,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼适掰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颂碧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起类浪,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤载城,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后费就,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诉瓦,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年力细,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睬澡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡眠蚂,死狀恐怖煞聪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逝慧,我是刑警寧澤昔脯,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布啄糙,位于F島的核電站,受9級(jí)特大地震影響云稚,放射性物質(zhì)發(fā)生泄漏隧饼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一静陈、第九天 我趴在偏房一處隱蔽的房頂上張望燕雁。 院中可真熱鬧,春花似錦鲸拥、人聲如沸贵白。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禁荒。三九已至,卻和暖如春角撞,著一層夾襖步出監(jiān)牢的瞬間呛伴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工谒所, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留热康,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓劣领,卻偏偏與公主長得像姐军,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尖淘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容