日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于Socket实现网络编程

發(fā)布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Socket实现网络编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Socket是網(wǎng)絡上兩個程序間雙向通訊的一端,它既可以發(fā)送請求,也可以接收請求,利用它可以方便的編寫網(wǎng)絡上數(shù)據(jù)的傳遞,在java中,有專門的類類處理用戶的請求和響應。利用Socket 類的方法,就可以實現(xiàn)兩臺計算機之間的通信,那么怎么利用socket進行網(wǎng)絡編程呢?我試試水~

網(wǎng)絡中的進程之間是如何進行通信的?

本地進程間通信(IPC)有很多種方法,簡而言之可以歸結(jié)為以下四類:

  • 消息傳遞(管道,FIFO,消息隊列);
  • 同步(互斥量,條件變量,讀寫鎖,文件和寫記錄鎖,信號量);
  • 內(nèi)存共享(匿名的和具體的,線程等);
  • 遠程過程調(diào)用(Solaris門和Sun RPC)。
  • 那么,對于網(wǎng)絡中的進程,如何實現(xiàn)通信呢?首先,我們要解決的是如何正確地唯一標識網(wǎng)絡中的進程,在本地環(huán)境中,我們可以通過進程PID來進行標識,但是在網(wǎng)絡中,不可以!但是網(wǎng)絡中的IP地址卻是唯一的可以標識一臺計算機,而位于傳輸層的“網(wǎng)絡+端口”可以唯一的標識主機中的應用程序(進程),這樣,可以利用IP地址+協(xié)議+端口就可以標識網(wǎng)絡中的進程啦!網(wǎng)絡中的進程就可以利用這三元組和其他進程之間進行通信了!

    使用TCP/IP協(xié)議的應用程序通常采用應用編程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已經(jīng)被淘汰),來實現(xiàn)網(wǎng)絡進程之間的通信。就目前而言,幾乎所有的應用程序都是采用socket,而現(xiàn)在又是網(wǎng)絡時代,網(wǎng)絡中進程通信是無處不在,這就是為什么有人說“一切皆socket”。

    什么是Socket?

    socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。我的理解就是Socket就是該模式的一個實現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對其進行的操作(讀/寫IO、打開、關閉)。

    socket接口是TCP/IP網(wǎng)絡協(xié)議的API,socket接口設計者最先將接口放在UNIX操作系統(tǒng)里面,如果了解UNix系統(tǒng)的輸入和輸出,Socket就很好理解了,網(wǎng)絡中的數(shù)據(jù)傳輸是一種特殊的I/O, Socket也是一種文件描述符,也具有一個類似于打開文件的函數(shù)調(diào)用socket(),該函數(shù)返回一個整形的socket描述符,隨后的連接建立,數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該socket實現(xiàn)的。常用的socket類型有兩種,流式Socket和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的Tcp服務應用,而數(shù)據(jù)報式socket是一種面向非連接的UDP服務應用。

    基于Socket的Java網(wǎng)絡編程

    Socket所支持的協(xié)議不光TCP/IP一種,因此兩者之間沒有必然的聯(lián)系,在Java中,socket編程主要是基于TCP/IP協(xié)議的網(wǎng)絡編程。主要過程是:Server端Listen(監(jiān)聽)某個端口是否有連接請求,Client端向Server端發(fā)出Connect(連接)請求,Server端向Client端發(fā)回Accept消息,這樣,一個連接就建立起來了,Server端和Client端都可以通過send,write等方法與對方進行通信。

    對于一個功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過程包含以下四個基本步驟:

    1,創(chuàng)建Socket;

    2,打開連接到Socket的輸入輸出流;

    3,按照一定的協(xié)議對Socket進行讀寫操作;

    4,關閉socket。

    簡單的例子:

    客戶端程序:

    package com.leetch.socket; import java.awt.*; import java.io.*; import java.net.*; import java.io.StringReader;import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; public class TestClient {public static void main(String arg[]) throws Exception{Socket tsocket = new Socket("127.0.0.1",4700);PrintWriter os = new PrintWriter(tsocket.getOutputStream()); //由socket對象得到輸出流,并構(gòu)建PrintWriter對象BufferedReader bReader2 = new BufferedReader(new InputStreamReader(tsocket.getInputStream()));//由Socket對象得到輸入流,并構(gòu)造相應的BufferedReader對象Reader reader = StringReader(textArea.getText().toString());BufferedReader bReader = new BufferedReader(reader);//由textarea構(gòu)造bufferedreader對象String readline = null;readline = bReader.readLine();while(!readline.equals("bye")){ //結(jié)束判斷標志os.println(readline); //把文本域里面的內(nèi)容寫到server端os.flush();System.out.println("Client:"+readline);System.out.println("Server:"+bReader2.readLine());readline = bReader.readLine();}os.close();bReader2.close();tsocket.close();}private static Reader StringReader(String string) {// TODO Auto-generated method stubreturn null;} }

    服務器端代碼:

    package com.leetch.socket; import java.io.*; import java.net.*; import java.applet.Applet;public class TServer{public static void main(String args[]) {try{ServerSocket server=null;server=new ServerSocket(4700);System.out.println("正在監(jiān)聽端口..."); //創(chuàng)建一個ServerSocket在端口4700監(jiān)聽客戶請求Socket socket=server.accept(); //創(chuàng)建一個socket,監(jiān)聽4700端口//由Socket對象得到輸入流,并構(gòu)造相應的BufferedReader對象BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象PrintWriter os=new PrintWriter(socket.getOutputStream());//由系統(tǒng)標準輸入設備構(gòu)造BufferedReader對象BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));System.out.println("Client:"+is.readLine());//在標準輸出上打印從客戶端讀入的字符串String readline;readline=sin.readLine();while(!readline.equals("quit")){ //終止條件os.println(readline); //向客戶端返回請求值,及時刷新os.flush(); System.out.println("Server響應:"+readline); //在系統(tǒng)標準輸出上打印讀入的字符串System.out.println("Client請求:"+is.readLine());//讀取client請求,并顯示readline=sin.readLine(); }System.out.println("已中斷連接...");os.close();is.close(); socket.close();server.close();}catch(Exception e0){e0.printStackTrace();}} }

    測試結(jié)果正確,客戶端和服務器可以互通消息!

    總結(jié)

    以上是生活随笔為你收集整理的基于Socket实现网络编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。