Socket編程

對(duì)于Java Socket編程而言,有兩個(gè)概念,一個(gè)是ServerSocket,一個(gè)是Socket。服務(wù)端和客戶端之間通過Socket建立連接,之后它們就可以進(jìn)行通信了。首先ServerSocket將在服務(wù)端監(jiān)聽某個(gè)端口,當(dāng)發(fā)現(xiàn)客戶端有Socket來試圖連接它時(shí),它會(huì)accept該Socket的連接請(qǐng)求,同時(shí)在服務(wù)端建立一個(gè)對(duì)應(yīng)的Socket與之進(jìn)行通信。這樣就有兩個(gè)Socket了,客戶端和服務(wù)端各一個(gè)。


Socket模型

Socket編程

 Server端五步

  1.啟動(dòng)Server  ServerSocket serverSocket = new ServerSocket(port)
  2.偵聽連接    Socket socket = serverSocket.accept();
  3.讀取數(shù)據(jù)    BufferedReader input = new BufferedReader(new 
                InputStreamReader(socket.getInputStream()));
                input.readLine();
   4.寫數(shù)據(jù)    BufferedWriter output = new BufferedWriter(new
                     OutputStreamWriter(socket.getOutputStream()));
                output.write();
  5.關(guān)閉連接    socket.close();
                serverSocket.close();

 Client端四步 

1.啟動(dòng)Server  ServerSocket serverSocket = new ServerSocket(port)
2.偵聽連接  Socket socket = serverSocket.accept();
3.讀取數(shù)據(jù)  BufferedReader input = new BufferedReader(new 
              InputStreamReader(socket.getInputStream()));
              input.readLine();
4.寫數(shù)據(jù)      BufferedWriter output = new BufferedWriter(new
               OutputStreamWriter(socket.getOutputStream()));
              output.write();
5.關(guān)閉連接  socket.close();
            serverSocket.close();

下面實(shí)現(xiàn)一個(gè)簡單的點(diǎn)對(duì)點(diǎn)的聊天,輸入“bye”時(shí),聊天結(jié)束

Sever.java

package com.day1006.oo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;


public class Server {
    public static void main(String[] args) {
        try {
            System.out.println("正在啟動(dòng)服務(wù)器...");
            ServerSocket serverSocket  = new ServerSocket(1000);
            System.out.println("服務(wù)器啟動(dòng)成功...");
            
            System.out.println("等待連接...");
            Socket socket = serverSocket.accept();
            System.out.println("連接成功...");
            
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
            BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            
            Scanner sc = new Scanner(System.in);
            boolean shouldContinue =true;
            String clientMsg;
            String serverMsg = null;
            while(shouldContinue){
                clientMsg = input.readLine();
                System.out.println("client:"+clientMsg);
                
                if(!"bye".equals(clientMsg)){
                    System.out.print("請(qǐng)輸入回復(fù):");
                    serverMsg = sc.nextLine();
                    System.out.println("server:"+serverMsg);
                    output.write(serverMsg+"\r");
                    output.flush();
                }
                
                if("bye".equals(serverMsg)|| "bye".equals(clientMsg)){
                    shouldContinue = false;
                }
            }
            
            
            
            serverSocket.close();
            sc.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Client.java

package com.day1006.oo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        try {
            System.out.println("等待連接...");
            Socket socket = new Socket("localhost", 1000);
            System.out.println("連接成功...");

            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            Scanner sc = new Scanner(System.in);
            boolean shouldContinue = true;
            String clientMsg;
            String serverMsg = null;

            while (shouldContinue) {
                clientMsg = sc.nextLine();
                System.out.println("client:" + clientMsg);
                output.write(clientMsg + "\r");
                output.flush();
                if (!"bye".equals(clientMsg)) {
                    serverMsg = input.readLine();
                    System.out.println("server:" + serverMsg);
                }
                if ("bye".equals(serverMsg) || "bye".equals(clientMsg)) {
                    shouldContinue = false;
                }
            }

            sc.close();
            socket.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java Socket編程 對(duì)于Java Socket編程而言,有兩個(gè)概念,一個(gè)是ServerSocket,一個(gè)是...
    天空下天的月亮閱讀 2,123評(píng)論 10 41
  • 大家好,我是徐愛卿。博客地址:flutterall.com 引言 Android網(wǎng)絡(luò)編程一直都是我想記錄的一篇文章...
    徐愛卿閱讀 45,870評(píng)論 52 218
  • 前言 兩個(gè)進(jìn)程如果要進(jìn)行通訊最基本的一個(gè)前提就是能夠唯一的標(biāo)識(shí)一個(gè)進(jìn)程,在本地進(jìn)程通訊中我們可以使用 PID...
    米奇小林閱讀 3,833評(píng)論 3 19
  • 仇諾是個(gè)好孩子,她自己是這樣覺得的。仇諾總是喜歡發(fā)呆,如果哪天學(xué)校里面舉行一場發(fā)呆比賽,她覺得冠軍肯定非她莫屬。每...
    左神話閱讀 551評(píng)論 2 0
  • 以前我錯(cuò)了 對(duì)感情總是太認(rèn)真 總以為拿真心就會(huì)換到真心 現(xiàn)在我懂了 緣分是順其自然,感情是貼心才暖 強(qiáng)扭的瓜不甜,...
    谷中百合花閱讀 1,387評(píng)論 0 0

友情鏈接更多精彩內(nèi)容