亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java實(shí)現(xiàn)Socket通信之單線程服務(wù)

 更新時(shí)間:2018年07月22日 11:39:43   作者:OneDay-X  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Socket通信的單線程服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

使用基于TCP 協(xié)議的雙向通信時(shí),網(wǎng)絡(luò)中的兩個(gè)應(yīng)用程序之間必須首先建立一個(gè)連接,這兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱(chēng)為一個(gè)socket。

建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(socket)。socket本質(zhì)是編程接口(API),對(duì)TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車(chē),提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。

Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進(jìn)程通信機(jī)制,取后一種意思。通常也稱(chēng)作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來(lái)實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開(kāi)一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,像一個(gè)多孔插座。一臺(tái)主機(jī)猶如布滿(mǎn)各種插座的房間,每個(gè)插座有一個(gè)編號(hào),有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節(jié)目。 客戶(hù)軟件將插頭插到不同編號(hào)的插座,就可以得到不同的服務(wù)。

使用 socket 的通信模式

java.net 程序包將基于TCP 通信的socket 封裝為兩個(gè)類(lèi):類(lèi)Socket 表達(dá)了一個(gè)用于建立TCP 連接的socket,該socket 既可由客戶(hù)程序使用,也可由服務(wù)程序

使用;類(lèi)ServerSocket 則是一個(gè)服務(wù)端專(zhuān)門(mén)監(jiān)聽(tīng)客戶(hù)程序連接請(qǐng)求的socket 的抽象,僅在服務(wù)程序中使用。

Socket通信過(guò)程

服務(wù)器端:

                 ① 創(chuàng)建ServerSocket對(duì)象,綁定監(jiān)聽(tīng)端口

                 ② 通過(guò)accept()方法監(jiān)聽(tīng)客戶(hù)端請(qǐng)求

                 ③ 連接建立后,通過(guò)輸入流讀取客戶(hù)端發(fā)送的請(qǐng)求信息

                 ④ 通過(guò)輸出流向客戶(hù)端發(fā)送響應(yīng)信息

                 ⑤ 關(guān)閉連接

客戶(hù)端:
                 ① 創(chuàng)建Socket對(duì)象,指明需要連接的服務(wù)器的地址和端口號(hào)

                 ② 連接建立后,通過(guò)輸出流想服務(wù)器端發(fā)送請(qǐng)求信息

                 ③ 通過(guò)輸入流獲取服務(wù)器響應(yīng)的信息

                 ④ 關(guān)閉連接

單線程服務(wù)程序代碼

服務(wù)端:

import java.net.*;
import java.io.*;
 
public class EchoServer {
  public static void main(String[] args)throws IOException {
    if (args.length != 1) {
      System.out.println("用法:EchoServer <端口號(hào)>");
      return ;
    }
 
    // 監(jiān)聽(tīng)客戶(hù)程序的連接請(qǐng)求
    ServerSocket listenSocket = new ServerSocket(Integer.parseInt(args[0]));
    System.out.println("服務(wù)程序正在監(jiān)聽(tīng)端口" + args[0]);
    Socket socket = listenSocket.accept();
    // 從與客戶(hù)程序的新建連接獲取輸入流和輸出流
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader
      (socket.getInputStream()));
    // 從客戶(hù)端讀取數(shù)據(jù),并寫(xiě)回?cái)?shù)據(jù)的加工結(jié)果
    String message;
    while ((message = in.readLine()) != null) {
      System.out.println("收到請(qǐng)求:" + message);
      out.println(message.toUpperCase());
    }
 
    // 關(guān)閉連接
    out.close();
    in.close();
    socket.close();
    listenSocket.close();
  }
}

客戶(hù)端:

import java.net.*;
import java.io.*;
 
public class EchoClient {
  public static void main(String[] args)throws Exception {
    if (args.length != 2) {
      System.out.println("用法:EchoClient <主機(jī)名> <端口號(hào)>");
      return ;
    }
 
    // 建立連接并打開(kāi)相關(guān)聯(lián)的輸入流和輸出流
    Socket socket = new Socket(args[0], Integer.parseInt(args[1]));
    System.out.println("當(dāng)前socket信息:" + socket);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader
      (socket.getInputStream()));
 
    // 將控制臺(tái)輸入的字符串發(fā)送給服務(wù)端,并顯示從服務(wù)端獲取的處理結(jié)果
    BufferedReader stdIn = new BufferedReader(new InputStreamReader
      (System.in));
    String userInput;
    while ((userInput = stdIn.readLine()) != null) {
      out.println(userInput);
      System.out.println("返回:" + in.readLine());
    }
    stdIn.close();
    // 關(guān)閉連接
    out.close();
    in.close();
    socket.close();
  }
}

運(yùn)行結(jié)果示例(基于windows)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中List排序的3種常見(jiàn)方法總結(jié)

    Java中List排序的3種常見(jiàn)方法總結(jié)

    在Java編程中List對(duì)象的排序是一個(gè)常見(jiàn)的需求,List接口提供了多種排序方法,這篇文章主要給大家介紹了關(guān)于Java中List排序的3種常見(jiàn)方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Java?Process中waitFor()的問(wèn)題詳解

    Java?Process中waitFor()的問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于Java?Process中waitFor()問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • IDEA MyBatis Plugins自動(dòng)生成實(shí)體類(lèi)和mapper.xml

    IDEA MyBatis Plugins自動(dòng)生成實(shí)體類(lèi)和mapper.xml

    這篇文章主要介紹了IDEA MyBatis Plugins自動(dòng)生成實(shí)體類(lèi)和mapper.xml,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java IO流將一個(gè)文件拆分為多個(gè)子文件代碼示例

    java IO流將一個(gè)文件拆分為多個(gè)子文件代碼示例

    這篇文章主要介紹了java IO流將一個(gè)文件拆分為多個(gè)子文件代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • SpringBoot在Controller層接收參數(shù)的n種姿勢(shì)(超詳細(xì))

    SpringBoot在Controller層接收參數(shù)的n種姿勢(shì)(超詳細(xì))

    這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例

    Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例

    這篇文章主要介紹了Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 運(yùn)行Springboot測(cè)試類(lèi)查詢(xún)數(shù)據(jù)庫(kù)數(shù)據(jù)顯示白網(wǎng)頁(yè)問(wèn)題及解決方法

    運(yùn)行Springboot測(cè)試類(lèi)查詢(xún)數(shù)據(jù)庫(kù)數(shù)據(jù)顯示白網(wǎng)頁(yè)問(wèn)題及解決方法

    Spring Boot應(yīng)用未能啟動(dòng)的原因是它沒(méi)有找到合適的數(shù)據(jù)庫(kù)配置具體來(lái)說(shuō),它需要一個(gè)數(shù)據(jù)源(DataSource),但未能在你的配置中找出,也沒(méi)有找到任何嵌入式數(shù)據(jù)庫(kù)(H2, HSQL 或 Derby),本文給大家分享運(yùn)行Springboot測(cè)試類(lèi)查詢(xún)數(shù)據(jù)庫(kù)數(shù)據(jù)顯示白網(wǎng)頁(yè)問(wèn)題及解決方法,一起看看吧
    2023-11-11
  • BaseJDBC和CRUDDAO的寫(xiě)法實(shí)例代碼

    BaseJDBC和CRUDDAO的寫(xiě)法實(shí)例代碼

    這篇文章主要介紹了BaseJDBC和CRUDDAO的寫(xiě)法實(shí)例代碼,代碼注釋十分詳細(xì),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java編寫(xiě)網(wǎng)絡(luò)聊天程序?qū)嶒?yàn)

    Java編寫(xiě)網(wǎng)絡(luò)聊天程序?qū)嶒?yàn)

    這篇文章主要為大家詳細(xì)介紹了Java編寫(xiě)網(wǎng)絡(luò)聊天程序?qū)嶒?yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Spring中RedisTemplate的基本使用淺析

    Spring中RedisTemplate的基本使用淺析

    Spring Boot Data(數(shù)據(jù)) Redis中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是RedisTemplate的子類(lèi),兩個(gè)方法基本一致。本文介紹了Spring操作Redis的方法,需要的可以參考一下
    2023-02-02

最新評(píng)論