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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

网络通信-2(TCP通信、ServerSocket、Socket)

發(fā)布時間:2024/10/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网络通信-2(TCP通信、ServerSocket、Socket) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. TCP通信

UDP中只有發(fā)送端和接收端,不區(qū)分客戶端和服務器端。計算機之間可以任意地發(fā)送消息。

TCP通信嚴格區(qū)分客戶端和服務器。

通信時,必須由客戶端去連接服務器才能實現(xiàn)通信。服務器不可主動連接客戶端。

且服務器應事先啟動,等待客戶端的連接。

2. ServerSocket

2.1 構造方法

ServerSocket(int port):創(chuàng)建綁定到特定端口的服務器套接字。

2.2 常用方法

Socket accept():?偵聽并接受到此套接字的連接。

  • accept()之后,服務器端程序會發(fā)生阻塞,直到客戶端發(fā)出連接請求,accept()才會返回一個Socket對象,用于和客戶端實現(xiàn)通信,陳故鄉(xiāng)才能繼續(xù)向下執(zhí)行。

InetAddress getInetAddress():返回此服務器套接字的本地地址。

3. Socket

此類實現(xiàn)客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機器間通信的端點。

3.1 構造方法

Socket(String host,int port):?創(chuàng)建一個流套接字并將其連接到指定主機上的指定端口號。

3.2 常用方法

int gerPort():?返回此套接字連接到的遠程端口。

  • 該對象是和Socket對象相連的端口號

InetAddress getLocalAddress():?獲取套接字綁定的本地地址。

  • 用于獲取Socket對象綁定的本地IP地址,并將IP地址封裝成InetAddress對象返回

close():關閉Socket連接

InputStream getInputStream():返回此套接字的輸入流。

  • 該對象由服務器的Socket返回,則用于讀取客戶端發(fā)動的數(shù)據(jù)
  • 反之,則用于讀取服務器發(fā)送的數(shù)據(jù)

OutputStream getOutputStream():??返回此套接字的輸出流。

  • 若該對象是由服務器端的Socket返回的,則適用于向客戶端發(fā)送數(shù)據(jù)
  • 反之,用于向客戶端發(fā)送數(shù)據(jù)

4. 具體實現(xiàn)

  • 首先創(chuàng)建代表服務器端的ServerSocket對象。該對象相當于開啟一個服務器,并等待客戶端的連接
  • 然后創(chuàng)建代表客戶端的Socket對象,向服務器端發(fā)起連接請求;
  • 服務器端響應請求
  • 兩者建立連接開始通信
  • 4.1 TCP服務器端

  • 創(chuàng)建服務器端的ServerSocket;
  • 偵聽并接受客戶端的Socket;
  • 得輸入流
  • 獲取數(shù)據(jù)
  • 關閉資源
  • package TCPDemo;import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {ServerSocket ss=new ServerSocket(8888);Socket s=ss.accept();InputStream is=s.getInputStream();byte[] bys=new byte[1024];int len=is.read(bys);//數(shù)據(jù)少,不用循環(huán)System.out.println(new String(bys,0,len));is.close();s.close();ss.close();} }

    4.2 TCP客戶端

  • 創(chuàng)建客戶端的Socket
  • 要建立連接,需要知道對方的IP和端口號
  • 獲取輸出流對象
  • 自己new的指向某個文件
  • 現(xiàn)在需指向目標設備,由Socket得到
  • 發(fā)送數(shù)據(jù)
  • 釋放資源
  • package TCPDemo;import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException;public class Client {public static void main(String[] args) throws UnknownHostException, IOException {Socket s=new Socket("10.170.7.148",8888);OutputStream os=s.getOutputStream();os.write("Hello,TCP server,I'm Client!".getBytes());os.close();s.close();} }

    4.3 運行結果

    5.圖片上傳案例

    5.1分析

    5.2服務器端

    package PicDemo;import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;public class Server{public static void main(String[] args) throws IOException {//1.創(chuàng)建服務端Socket對象ServerSocket ss = new ServerSocket(8888);//監(jiān)聽Socket s = ss.accept();//7.獲取輸入流對象InputStream is = s.getInputStream();//8.創(chuàng)建本地輸入流OutputStream os=new FileOutputStream("E:\\b.jpg");//9.讀數(shù)據(jù)byte[] bys = new byte[1024];int len;//用于存儲讀取到的字節(jié)個數(shù)while((len = is.read(bys))!=-1) {os.write(bys,0,len);}//10.獲取Socket輸出流OutputStream sos=s.getOutputStream();//返回數(shù)據(jù)(發(fā)出數(shù)據(jù))sos.write("圖片上傳成功!".getBytes());//釋放資源sos.close();os.close();is.close();s.close();//ss.close();//服務端一般不關閉} }

    5.3服務器端

    package PicDemo;import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//2.創(chuàng)建客戶端Socket對象Socket s = new Socket("10.170.7.148",8888);//3.獲取Socket輸出流對象OutputStream os = s.getOutputStream();//4.創(chuàng)建字節(jié)輸入流InputStream is=new FileInputStream("D:\\JAVA\\a.jpg");//5.把數(shù)據(jù)源中的字節(jié)流寫到Socket輸出流中int len=-1;byte[] bys=new byte[1024];while((len=is.read(bys))!=-1) {os.write(bys,0,len);}//6.讀完后,告訴服務器端s.shutdownOutput();//12.接收數(shù)據(jù)InputStream iis=s.getInputStream();len = iis.read(bys);//輸出數(shù)據(jù)System.out.println(new String(bys,0,len));//釋放資源is.close();os.close();s.close();} }

    運行結果:

    注:客戶端第6步中,需進行調用shutdownOutput();告訴服務器數(shù)據(jù)讀取完畢,否則程序不結束。

    ?

    ?

    總結

    以上是生活随笔為你收集整理的网络通信-2(TCP通信、ServerSocket、Socket)的全部內容,希望文章能夠幫你解決所遇到的問題。

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