激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java套接字(Socket)網絡編程入門

Java套接字(Socket)網絡編程入門

2020-01-09 14:15goldensun JAVA教程

這篇文章主要介紹了Java套接字(Socket)網絡編程入門,Socket可以理解為是對TCP/IP協議的抽象,需要的朋友可以參考下

網絡應用模式主要有:

  • 主機/終端模式:集中計算,集中管理;
  • 客戶機/服務器(Client/Server,簡稱C/S)模式:分布計算,分布管理;
  • 瀏覽器/服務器模式:利用Internet跨平臺。

www(萬維網)就是建立在客戶機/服務器模式上,以HTML語言和HTTP協議為基礎,能夠提供各種Internet服務的信息瀏覽系統。網絡信息放在主機的不同位置,www服務器利用超文本鏈路鏈接各項信息。www客戶機(瀏覽器Brower)負責與服務器建立聯系,向服務器發送請求,處理HTML超媒體,提供圖形用戶界面(GUI),顯示信息等。

在客戶機/服務器工作模式中,在Server端,要準備接受多個Client端計算機的通信。為此,除用IP地址標識Internet上的計算機之外,另還引入端口號,用端口號標識正在Server端后臺服務的線程。端口號與IP地址的組合稱為網絡套接字(socket)。

Java語言在實現C/S模式中,套接字分為兩類:

  • 在Server端,ServerSocket類支持底層的網絡通信;
  • 在Client端,Socket類支持網絡的底層通信。

Server機通過端口(總線I/O地址)提供面向Client機的服務;Server機在它的幾個不同端口分別同時提供幾種不同的服務。Client接入Server的某一端口,通過這個端口提請Server機為其服務。規定:端口號0~1023供系統專用。例如,HTTP協議在端口80,telnet協議在端口23。端口1024~65535供應用程序使用。

當Client程序和Server程序需要通信時,可以用Socket類建立套接字連接。套接字連接可想象為一個電話呼叫:最初是Client程序建立呼叫,Server程序監聽;呼叫完成后,任何一方都可以隨時講話。

雙方實現通信有流式socket和數據報式socket兩種可選方式:

  • 流式socket是有連接的通信,即TCP(Transmission Control Protocol):每次通信前建立連接,通信結束后斷開連接。特點是可以保證傳輸的正確性、可靠性。
  • 數據報式socket是無連接的通信,即UDP(User Datagram Protocol):將欲傳輸的數據分成 小包,直接上網發送。無需建立連接和拆除連接,速度快,但無可靠保證。

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

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

?
1
2
3
try{
  Socket mySocket = new Socket(“http://www.aspku.net” ,1860);
}catch(IOException e){}


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

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

?
1
2
3
try{
  ServerSocket serverSocket = new ServerSocket(1860);
}catch(IOException e){}


服務器端程序在指定的端口監聽,當收到Client程序發出的服務請求時,創建一個套接字對象與該端口對應的Client程序通信。例如,執行上述建立服務器套接字對象的代碼,確立了對象serverSocket后,就可能它使用accept()方法,得到Socket對象,接收Client程序來自套接字mySocket的信息。如以下代碼所示:

?
1
2
3
try{
  Socket sc = serverSocket.accept();//ac是一個Socket對象
}catch(IOException e){}


要撤銷服務,可以關閉Socket對象sc:

?
1
sc.close();

【例】C/S模式中的Client端應用程序。這是一個Client端的流式Socket通信的簡單實例,代碼說明Client端程序的編寫方法。例中,Client程序向服務器主機的端口4441提出請求,連接建立后完成對服務器的讀寫。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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(“localhost”,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端應用程序對應的Server端應用程序。程序在4441端口監聽,當檢測到有客戶機請求時,產生一個內為“客戶,你好,我是服務器”的字符串輸出到客戶端。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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(“客戶,你好,我是服務器”);
      out.close();
    }
    catch(IOException e){System.out.println(“ERROR:”+e);}
  }
}

為了充分發揮計算機的平行工作能力,可以把套接字連接工作讓一個線程完成。當客戶端要請求服務器給予服務,或當服務器端接收到一個客戶的服務請求,就啟動一個專門完成信息通信的線程,在該線程中創建輸入輸出流,并完成客戶端與服務器端的信息交流。

【例】 將套接字連接工作置于線程的客戶端小應用程序。界面在有一個發送信息按紐、一個文本框和一個文本區。客戶端應用程序首先與服務器建立套接字連接。使用數據輸入流in反復讀取服務器放入線路里的信息,將收到的信息在文本區中顯示。婐志取的信息是“結束”,則關閉套接字連接,并結束程序。用戶也可在文本框輸入信息,并按發送信息按鈕,則客戶端程序利用數據輸出流out,將文本框中的內容發送給服務器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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(“發送信息”);
    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(“結束”)){
        try{
          socket.close();break;
        }catch(IOException e){}
      }else texA.append(s + “ ”);
    }
  }
  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(“請說話”);
        }
        catch(IOException e1){}
      }
    }
  }
}

【例】程序以端4441建立與客戶端的套接字連接,服務器端收到客戶端的申請后,以客戶的套接字建立一個線程,并啟動。如果沒有客戶申請,則繼續監聽客戶的申請。線程按客戶的套接字建立輸入數據流in和輸數據流out。線程利用in讀取客戶放入線路里的信息。如果接受的信息是“結束”,則服務器回復“結束”后關閉套接字連接;否則回復:“我是服務器你對我說“,以及服務器接收到的信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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(“發送信息”);
    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(“結束”)){
        try{
          socket.close();break;
        }catch(IOException e){}
      }else texA.append(s + “ ”);
    }
  }
  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(“請說話”);
        }catch(IOException e1){}
      }
    }
  }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产精品一区 | 国产亚洲在线 | 国内精品免费一区二区2001 | 成人国产精品久久 | 久久99精品久久久久久园产越南 | 亚洲男人的天堂在线视频 | 精品久久久久久久久久久αⅴ | 一级黄色免费观看 | 国产精品久久999 | 午夜精品老牛av一区二区三区 | 欧美一级免费视频 | 91美女视频在线观看 | 成人不卡在线观看 | 成人男女免费视频 | 黑人三级毛片 | 双性帝王调教跪撅打屁股 | 精品国产91久久久久久浪潮蜜月 | 在线中文字幕不卡 | 黄色录像日本 | 91成人免费在线观看 | 国产精品一区在线免费观看 | 鲁久久| 久久精品中文 | 成人爱情偷拍视频在线观看 | 蜜桃欧美性大片免费视频 | 国产一区二区欧美 | 国产激情视频在线 | 天天操综 | 国产精品一区二区三区在线播放 | 一级裸体视频 | 久久99偷拍视频 | 免费视频aaa | 久久99久久98精品免观看软件 | 欧美女优一区 | h色网站在线观看 | 亚洲国产精品二区 | 成人免费毛片一 | 国产男女 爽爽爽爽视频 | 成人颜色视频 | 一级黄色影院 | 久久国产精品久久久久久久久久 |