最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java套接字(Socket)網(wǎng)絡(luò)編程入門(mén)

 更新時(shí)間:2015年10月10日 16:04:05   投稿:goldensun  
這篇文章主要介紹了Java套接字(Socket)網(wǎng)絡(luò)編程入門(mén),Socket可以理解為是對(duì)TCP/IP協(xié)議的抽象,需要的朋友可以參考下

網(wǎng)絡(luò)應(yīng)用模式主要有:

  • 主機(jī)/終端模式:集中計(jì)算,集中管理;
  • 客戶(hù)機(jī)/服務(wù)器(Client/Server,簡(jiǎn)稱(chēng)C/S)模式:分布計(jì)算,分布管理;
  • 瀏覽器/服務(wù)器模式:利用Internet跨平臺(tái)。

www(萬(wàn)維網(wǎng))就是建立在客戶(hù)機(jī)/服務(wù)器模式上,以HTML語(yǔ)言和HTTP協(xié)議為基礎(chǔ),能夠提供各種Internet服務(wù)的信息瀏覽系統(tǒng)。網(wǎng)絡(luò)信息放在主機(jī)的不同位置,www服務(wù)器利用超文本鏈路鏈接各項(xiàng)信息。www客戶(hù)機(jī)(瀏覽器Brower)負(fù)責(zé)與服務(wù)器建立聯(lián)系,向服務(wù)器發(fā)送請(qǐng)求,處理HTML超媒體,提供圖形用戶(hù)界面(GUI),顯示信息等。

在客戶(hù)機(jī)/服務(wù)器工作模式中,在Server端,要準(zhǔn)備接受多個(gè)Client端計(jì)算機(jī)的通信。為此,除用IP地址標(biāo)識(shí)Internet上的計(jì)算機(jī)之外,另還引入端口號(hào),用端口號(hào)標(biāo)識(shí)正在Server端后臺(tái)服務(wù)的線(xiàn)程。端口號(hào)與IP地址的組合稱(chēng)為網(wǎng)絡(luò)套接字(socket)。

Java語(yǔ)言在實(shí)現(xiàn)C/S模式中,套接字分為兩類(lèi):

  1. 在Server端,ServerSocket類(lèi)支持底層的網(wǎng)絡(luò)通信;
  2. 在Client端,Socket類(lèi)支持網(wǎng)絡(luò)的底層通信。

Server機(jī)通過(guò)端口(總線(xiàn)I/O地址)提供面向Client機(jī)的服務(wù);Server機(jī)在它的幾個(gè)不同端口分別同時(shí)提供幾種不同的服務(wù)。Client接入Server的某一端口,通過(guò)這個(gè)端口提請(qǐng)Server機(jī)為其服務(wù)。規(guī)定:端口號(hào)0~1023供系統(tǒng)專(zhuān)用。例如,HTTP協(xié)議在端口80,telnet協(xié)議在端口23。端口1024~65535供應(yīng)用程序使用。

當(dāng)Client程序和Server程序需要通信時(shí),可以用Socket類(lèi)建立套接字連接。套接字連接可想象為一個(gè)電話(huà)呼叫:最初是Client程序建立呼叫,Server程序監(jiān)聽(tīng);呼叫完成后,任何一方都可以隨時(shí)講話(huà)。

雙方實(shí)現(xiàn)通信有流式socket和數(shù)據(jù)報(bào)式socket兩種可選方式:

  1. 流式socket是有連接的通信,即TCP(Transmission Control Protocol):每次通信前建立連接,通信結(jié)束后斷開(kāi)連接。特點(diǎn)是可以保證傳輸?shù)恼_性、可靠性。
  2. 數(shù)據(jù)報(bào)式socket是無(wú)連接的通信,即UDP(User Datagram Protocol):將欲傳輸?shù)臄?shù)據(jù)分成 小包,直接上網(wǎng)發(fā)送。無(wú)需建立連接和拆除連接,速度快,但無(wú)可靠保證。

流式socket在Client程序和Server程序間建立通信的通道。每個(gè)socket可以進(jìn)行讀和寫(xiě)兩種操作。對(duì)于任一端,與對(duì)方的通信會(huì)話(huà)過(guò)程是:
建立socket連接,獲得輸入/輸出流,讀數(shù)據(jù)/寫(xiě)數(shù)據(jù),通信完成后關(guān)閉socket(拆除連接)。

利用socket的構(gòu)造方法,可以在客戶(hù)端建立到服務(wù)器的套接字對(duì)象:
    Socket(String host,int port):host是服務(wù)器的IP地址,port是端口號(hào),這些是預(yù)先約定的。
例如,代碼:

  try{
    Socket mySocket = new Socket(“http://www.weixueyuan.net” ,1860);
  }catch(IOException e){}


然后,用getInputStream()方法獲得輸入流,用這個(gè)輸入流讀取服務(wù)器放入“線(xiàn)路”的信息;用getOutputStream()方法獲得輸出流,用這個(gè)輸出流將信息寫(xiě)入“線(xiàn)路”。

利用ServerSocket的構(gòu)造方法可以在服務(wù)器建立接受客戶(hù)套接字的服務(wù)器套接字對(duì)象:
    ServerSocket(int port):指定端口號(hào),創(chuàng)建一個(gè)ServerSocket對(duì)象。端口號(hào)port要與客戶(hù)呼叫的端口號(hào)相同。為此,用以下形式代碼:

  try{
    ServerSocket serverSocket = new ServerSocket(1860);
  }catch(IOException e){}


服務(wù)器端程序在指定的端口監(jiān)聽(tīng),當(dāng)收到Client程序發(fā)出的服務(wù)請(qǐng)求時(shí),創(chuàng)建一個(gè)套接字對(duì)象與該端口對(duì)應(yīng)的Client程序通信。例如,執(zhí)行上述建立服務(wù)器套接字對(duì)象的代碼,確立了對(duì)象serverSocket后,就可能它使用accept()方法,得到Socket對(duì)象,接收Client程序來(lái)自套接字mySocket的信息。如以下代碼所示:

  try{
    Socket sc = serverSocket.accept();//ac是一個(gè)Socket對(duì)象
  }catch(IOException e){}


要撤銷(xiāo)服務(wù),可以關(guān)閉Socket對(duì)象sc:

  sc.close();

【例】C/S模式中的Client端應(yīng)用程序。這是一個(gè)Client端的流式Socket通信的簡(jiǎn)單實(shí)例,代碼說(shuō)明Client端程序的編寫(xiě)方法。例中,Client程序向服務(wù)器主機(jī)的端口4441提出請(qǐng)求,連接建立后完成對(duì)服務(wù)器的讀寫(xiě)。

import java.io.*;
import java.net.*;
public class Client{
  public static void main(String args[]){
    String s = null;Socket mySocket;
    DataInputStream in = null;DataOutputStream out = null;
    try{
      mySocket = new Socket(“l(fā)ocalhost”,4441);
      in = new DataInputStream(mySocket.getInputStream());
      out = new DataOutputStream(mySocket.getOutputStream());
      out.writeUTF(“good server!”);
      while(true){
        s = in.readUTF();
        if(s==null) break;
        else System.out.println(s);
      }
      mySocket.close();
    }catch(IOException e){
      System.out.println(“can't connect”);
    }
  }
}

【例】與Client端應(yīng)用程序?qū)?yīng)的Server端應(yīng)用程序。程序在4441端口監(jiān)聽(tīng),當(dāng)檢測(cè)到有客戶(hù)機(jī)請(qǐng)求時(shí),產(chǎn)生一個(gè)內(nèi)為“客戶(hù),你好,我是服務(wù)器”的字符串輸出到客戶(hù)端。

import java.io.*;import java.net.*;
public class Server{
  public static void main(String args[]){
    ServerSocket server = null;
    Socket you = null;String s = null;
    DataOutputStream out = null;
    DataInputStream in = null;
    try{
      server = new ServerSocket(4441);
    }catch(IOException e1){
      system.out.println(“ERROR:” +e1);
    }
    try{
      you = server.accept();
      in = new DataInputStream(you.getInputStream());
      out = new DataOutputStream(you. getOutputStream());
      while(true){
        s = in.readUTF();
        if(s!=null) break;
      }
      out.writeUTF(“客戶(hù),你好,我是服務(wù)器”);
      out.close();
    }
    catch(IOException e){System.out.println(“ERROR:”+e);}
  }
}

為了充分發(fā)揮計(jì)算機(jī)的平行工作能力,可以把套接字連接工作讓一個(gè)線(xiàn)程完成。當(dāng)客戶(hù)端要請(qǐng)求服務(wù)器給予服務(wù),或當(dāng)服務(wù)器端接收到一個(gè)客戶(hù)的服務(wù)請(qǐng)求,就啟動(dòng)一個(gè)專(zhuān)門(mén)完成信息通信的線(xiàn)程,在該線(xiàn)程中創(chuàng)建輸入輸出流,并完成客戶(hù)端與服務(wù)器端的信息交流。

【例】 將套接字連接工作置于線(xiàn)程的客戶(hù)端小應(yīng)用程序。界面在有一個(gè)發(fā)送信息按紐、一個(gè)文本框和一個(gè)文本區(qū)??蛻?hù)端應(yīng)用程序首先與服務(wù)器建立套接字連接。使用數(shù)據(jù)輸入流in反復(fù)讀取服務(wù)器放入線(xiàn)路里的信息,將收到的信息在文本區(qū)中顯示。婐志取的信息是“結(jié)束”,則關(guān)閉套接字連接,并結(jié)束程序。用戶(hù)也可在文本框輸入信息,并按發(fā)送信息按鈕,則客戶(hù)端程序利用數(shù)據(jù)輸出流out,將文本框中的內(nèi)容發(fā)送給服務(wù)器。

import java.net.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.applet.*;
public class Aclient extends Applet implements Runnable,ActionListener{
  JButton button; JTextField textF; JTextArea textA;
  Socket socket; Thread thread;
  DataInputStream in; DataOutputStream out;
  public void init(){
    setBackground(new Color(120,153,137));
    setLayout(new BorderLayout());
    Button = new JButton(“發(fā)送信息”);
    textF = new JTextField(20);
    textA = new JTextArea(20,30);
    setSize(450,350);
    JPanel p = new JPanel();
    p.add(textF); p.add(button);
    add(textA,”Center”); add(p,”South”);
    button.addActionListener(this);
  }
  public void start(){
    try{
      socket = new Socket(this.getCodeBase().getHost(),4441);
      in = new DataInputStream(socket.getInputStream());
      out = new DataOutputStream(socket.getOutputStream());
    }catch(IOException e){}
    if(thread==null){
      thread = new Thread(this);
      thread.setPriority(Thread.MIN_PRIORITY);
      thread.start();
    }
  }
  public void run(){
    String s = null;
    while(true){
      try{
        s = in.readUTF();
      }catch(IOException e){}
      if(s.equals(“結(jié)束”)){
        try{
          socket.close();break;
        }catch(IOException e){}
      }else texA.append(s + “\n”);
    }
  }
  public void actionPerformed(ActionEvent e){
    if(e.getSource()==button){
      String s = textF.getText();
      if(s! = null){
        try{
          out.writeUTF(s);
        }catch(IOException e1){}
      }
      else{
        try{
          out.writeUTF(“請(qǐng)說(shuō)話(huà)”);
        }
        catch(IOException e1){}
      }
    }
  }
}

【例】程序以端4441建立與客戶(hù)端的套接字連接,服務(wù)器端收到客戶(hù)端的申請(qǐng)后,以客戶(hù)的套接字建立一個(gè)線(xiàn)程,并啟動(dòng)。如果沒(méi)有客戶(hù)申請(qǐng),則繼續(xù)監(jiān)聽(tīng)客戶(hù)的申請(qǐng)。線(xiàn)程按客戶(hù)的套接字建立輸入數(shù)據(jù)流in和輸數(shù)據(jù)流out。線(xiàn)程利用in讀取客戶(hù)放入線(xiàn)路里的信息。如果接受的信息是“結(jié)束”,則服務(wù)器回復(fù)“結(jié)束”后關(guān)閉套接字連接;否則回復(fù):“我是服務(wù)器你對(duì)我說(shuō)“,以及服務(wù)器接收到的信息。

import java.net.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.applet.*;
public class Aclient extends Applet implements Runnable,ActionListener{
  JButton button; JTextField textF; JTextArea textA;
  Socket socket; Thread thread;
  DataInputStream in; DataOutputStream out;
  public void init(){
    setBackground(new Color(120,153,137));
    setLayout(new BorderLayout());
    Button = new JButton(“發(fā)送信息”);
    textF = new JTextField(20);
    textA = new JTextArea(20,30);
    setSize(450,350);
    JPanel p = new JPanel();
    p.add(textF); p.add(button);
    add(textA,”Center”); add(p,”South”);
    button.addActionListener(this);
  }
  public void start(){
    try{
      socket = new Socket(this.getCodeBase().getHost(),4441);
      in = new DataInputStream(socket.getInputStream());
      out = new DataOutputStream(socket.getOutputStream());
    }catch(IOException e){}
    if(thread==null){
      thread = new Thread(this);
      thread.setPriority(Thread.MIN_PRIORITY);
      thread.start();
    }
  }
  public void run(){
    String s = null;
    while(true){
       try{
        s = in.readUTF();
      }catch(IOException e){}
      if(s.equals(“結(jié)束”)){
        try{
          socket.close();break;
        }catch(IOException e){}
      }else texA.append(s + “\n”);
    }
  }
  public void actionPerformed(ActionEvent e){
    if(e.getSource()==button){
      String s = textF.getText();
      if(s! = null){
        try{
          out.writeUTF(s);
        }catch(IOException e1){}
      }
      else{
        try{
          out.writeUTF(“請(qǐng)說(shuō)話(huà)”);
        }catch(IOException e1){}
      }
    }
  }
}

相關(guān)文章

  • Java之Maven工程打包jar

    Java之Maven工程打包jar

    Maven打包一般可以生成兩種包一種是可以直接運(yùn)行的包,一種是依賴(lài)包(只是編譯包)。Maven默認(rèn)打包時(shí)jar,如果需要修改其他類(lèi)型,可以修改pom.xml。感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • 深入理解java代碼實(shí)現(xiàn)分治算法

    深入理解java代碼實(shí)現(xiàn)分治算法

    分治算法是一種遞歸算法,它將問(wèn)題劃分為幾個(gè)獨(dú)立的子問(wèn)題,然后遞歸地解決這些子問(wèn)題,最后將子問(wèn)題的解合并起來(lái)得到原問(wèn)題的解,本文詳細(xì)的介紹java分治算法,感興趣的可以了解一下
    2023-09-09
  • Spring Boot集成mongodb數(shù)據(jù)庫(kù)過(guò)程解析

    Spring Boot集成mongodb數(shù)據(jù)庫(kù)過(guò)程解析

    這篇文章主要介紹了Spring Boot集成mongodb數(shù)據(jù)庫(kù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java多線(xiàn)程之Worker Thread模式

    Java多線(xiàn)程之Worker Thread模式

    這篇文章主要介紹了Java多線(xiàn)程之Worker Thread模式,Worker的意思是工作的人,在Worker Thread模式中,工人線(xiàn)程Worker thread會(huì)逐個(gè)取回工作并進(jìn)行處理,當(dāng)所有工作全部完成后,工人線(xiàn)程會(huì)等待新的工作到來(lái),下面文章小編回給大家詳細(xì)介紹,需要的朋友可以參考一下
    2021-10-10
  • springcloud 服務(wù)降級(jí)的實(shí)現(xiàn)方法

    springcloud 服務(wù)降級(jí)的實(shí)現(xiàn)方法

    這篇文章主要介紹了springcloud 服務(wù)降級(jí)的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • List、Map、Set接口在Java中的存取元素特點(diǎn)詳細(xì)探討

    List、Map、Set接口在Java中的存取元素特點(diǎn)詳細(xì)探討

    在Java編程語(yǔ)言中集合框架是處理對(duì)象組的重要工具,主要包括List、Set和Map接口,這些接口及其實(shí)現(xiàn)類(lèi)提供了豐富的功能,這篇文章主要給大家介紹了關(guān)于List、Map、Set接口在Java中的存取元素特點(diǎn),需要的朋友可以參考下
    2024-08-08
  • Spring中的@ConfigurationProperties詳解

    Spring中的@ConfigurationProperties詳解

    這篇文章主要介紹了Spring中的@ConfigurationProperties詳解,ConfigurationProperties注解主要用于將外部配置文件配置的屬性填充到這個(gè)Spring Bean實(shí)例中,需要的朋友可以參考下
    2023-09-09
  • MyBatis實(shí)現(xiàn)配置加載的步驟

    MyBatis實(shí)現(xiàn)配置加載的步驟

    本文主要介紹了MyBatis實(shí)現(xiàn)配置加載的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解Spring Cloud Gateway 數(shù)據(jù)庫(kù)存儲(chǔ)路由信息的擴(kuò)展方案

    詳解Spring Cloud Gateway 數(shù)據(jù)庫(kù)存儲(chǔ)路由信息的擴(kuò)展方案

    這篇文章主要介紹了詳解Spring Cloud Gateway 數(shù)據(jù)庫(kù)存儲(chǔ)路由信息的擴(kuò)展方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Android設(shè)備如何保證數(shù)據(jù)同步寫(xiě)入磁盤(pán)的實(shí)現(xiàn)

    Android設(shè)備如何保證數(shù)據(jù)同步寫(xiě)入磁盤(pán)的實(shí)現(xiàn)

    這篇文章主要介紹了Android設(shè)備如何保證數(shù)據(jù)同步寫(xiě)入磁盤(pán)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論

耒阳市| 普陀区| 兴业县| 合肥市| 台东县| 介休市| 龙泉市| 大关县| 慈溪市| 三穗县| 祁门县| 桂阳县| 通榆县| 清水河县| 兴安县| 手游| 德兴市| 黄冈市| 工布江达县| 桐柏县| 璧山县| 彭山县| 安乡县| 资兴市| 临西县| 化隆| 贺兰县| 元氏县| 伊通| 冕宁县| 都昌县| 朝阳市| 达孜县| 博爱县| 综艺| 萨迦县| 石家庄市| 云龙县| 茂名市| 柳林县| 菏泽市|