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

Java利用TCP協(xié)議實現(xiàn)客戶端與服務(wù)器通信(附通信源碼)

 更新時間:2020年07月06日 09:32:18   作者:灰小猿  
這篇文章主要介紹了Java利用TCP協(xié)議實現(xiàn)客戶端與服務(wù)器通信(附通信源碼),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

進行TCP協(xié)議網(wǎng)絡(luò)程序的編寫,關(guān)鍵在于ServerSocket套接字的熟練使用,TCP通信中所有的信息傳輸都是依托ServerSocket類的輸入輸出流進行的。

上一篇博客和大家分享了在網(wǎng)絡(luò)編程中要注意的基礎(chǔ)知識,關(guān)于IP、TCP、UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的這篇文章“盤點那些進行網(wǎng)絡(luò)編程必須要知道的基礎(chǔ)知識”,那么今天大灰狼就來和大家分享一下如何使用TCP/IP進行網(wǎng)絡(luò)程序的開發(fā)。

TCP協(xié)議概念

先來了解一下TCP協(xié)議的基本概念。

我們知道TCP是可靠而非安全的網(wǎng)絡(luò)協(xié)議。它可以保證數(shù)據(jù)在從一端送至另一端的時候可以準確的送達,并且抵達的數(shù)據(jù)的排列順序和送出時的順序是相同的。因此在進行TCP協(xié)議通信的時候,我們首先應(yīng)該保證客戶端和服務(wù)器之間的連接通暢。

而TCP協(xié)議程序的編寫,仍然是依靠套接字Socket類來實現(xiàn)的,并且利用TCP協(xié)議進行通信的兩個程序之間是有主次之分的,即一個是服務(wù)器的程序,另一個是客戶端的程序。因此兩者的功能和編寫上也略有不同。如下圖是服務(wù)器與客戶端之間進行通信的示意圖:

以上就是在TCP協(xié)議中客戶端與服務(wù)器建立連接的過程示意圖。而在這其中起到關(guān)鍵作用的就是服務(wù)器端套接字ServerSocket和客戶端套接字Socket。通過這兩個套接字來建立服務(wù)器和客戶端,從而利用其中的函數(shù)進行數(shù)據(jù)的通信。

在ServerSocket類中有很多需要注意的地方,接下來大灰狼和大家分享一下ServerSocket類的具體用法: 

ServerSocket類

ServerSocket類存在于Java.net包中,表示服務(wù)器端的套接字,在使用時需要首先導(dǎo)入這個類,我們也知道ServerSocket類的主要功能就是通過指定的端口等待來自于網(wǎng)絡(luò)中客戶端的請求并且進行連接。

值得注意的是:服務(wù)器套接字一次只能與一個客戶端套接字進行連接,因此如果存在多臺客戶端同時發(fā)送連接請求,則服務(wù)器套接字就會將請求的客戶端存放到隊列中去,然后從中取出一個套接字與服務(wù)器建立的套接字進行連接,但是服務(wù)器端能夠容納的客戶端套接字也不是無限的,當請求連接的數(shù)量大于最大容納量時,那么多出來的請求就會被拒接,一般來說隊列的默認大小是50。

  • ServerSocket類的構(gòu)造方法通常會拋出IOException異常,具體有以下幾種形式:
  • ServerSocket():創(chuàng)建非綁定服務(wù)器套接字
  • ServerSocket(inr port):創(chuàng)建綁定到特定端口的服務(wù)器套接字
  • ServerSocket(int port, int backlog):利用指定的backlog創(chuàng)建服務(wù)器套接字,并將其綁定到指定的服務(wù)器端口上
  • ServerSocket(int port, int backlog, InetAddress bindAddress):使用指定的端口,偵聽backlog和要綁定到本地的IP地址創(chuàng)建服務(wù)器。這種情況適用于計算機上有多個網(wǎng)卡和多個IP地址的情況,用戶可以明確的規(guī)定ServerSocket在哪塊網(wǎng)卡或哪個IP地址上等待用戶的連接請求。

以下是ServerSocket類中一些常用的方法:

ServerSocket類中常用的方法

方法

返回值 說明
accept() Socket 等待客戶機連接,若連接則創(chuàng)建一個客戶端套接字
isBound() boolean 判斷ServerSocket的綁定狀態(tài)
getInetAddress() InetAddress 返回此服務(wù)器套接字的本地地址
isClosed() boolean 返回服務(wù)器套接字的關(guān)閉狀態(tài)
close() void 關(guān)閉服務(wù)器套接字
bind(SocketAddress endpoint) void 將ServerSocket綁定到特定地址(IP地址和端口號)
getInetAddress() int 返回服務(wù)器套接字等待的端口號

了解了ServerSocket類的基本方法之后,就是如何進行客戶端和服務(wù)器進行連接的問題了。

在服務(wù)器端我們可以調(diào)用ServerSocket類的accpet()方法與請求連接的客戶機建立連接,這時會返回一個和客戶端相連接的Socket對象,這個時候其實已經(jīng)連接成功了,使用getInetAddress()方法就可以獲取到進行請求的客戶機的IP地址。

對于如何進行客戶端和服務(wù)器端數(shù)據(jù)的通信,就要用到數(shù)據(jù)的輸入流和輸出流了,服務(wù)器端的Socket對象使用getOutputStream()方法獲取到的輸出流,將指向客戶端的Socket對象使用getInputStream()方法獲取到的輸入流。由此就實現(xiàn)在服務(wù)器向客戶端發(fā)送數(shù)據(jù)的一個過程,同樣的道理,客戶端端的Socket對象使用getOutputStream()方法獲取到的輸出流,將指向服務(wù)器端的Socket對象使用getInputStream()方法獲取到的輸入流。從而實現(xiàn)由客戶端向服務(wù)器發(fā)送數(shù)據(jù)的過程。

注意:accpet()方法會阻塞線程的繼續(xù)執(zhí)行,如果在對應(yīng)的接口沒有收到客戶端的呼叫,則程序會停留在此處,直到獲取到客戶端的呼叫才會繼續(xù)向下執(zhí)行,但是如果服務(wù)器沒有收到來自客戶端的呼叫請求,并且accpet()方法沒有發(fā)生阻塞,那么通常情況下就是程序出了問題,一般來說可能是使用了一個已經(jīng)被其他程序占用了的端口號,導(dǎo)致ServerSocket沒有綁定成功!遇到這種情況可以嘗試更換新的端口號。

了解了TCP協(xié)議的通信過程,接下來就是進行TCP通信程序的書寫啦!

在網(wǎng)絡(luò)通信中,如果只要求客戶機向服務(wù)器發(fā)送信息,不要求服務(wù)器向客戶端反饋信息的行為稱為“單向通信”,要求客戶機和服務(wù)器雙方互相通信的過程稱為“雙向通信”,雙向通信只不過是比單向通信多了一個服務(wù)器向客戶端發(fā)送消息的過程,

接下來分別是服務(wù)器端和客戶端程序的編寫:

 服務(wù)器端程序

package server_1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
 
public class MyTcp {
 
	private ServerSocket server;	//設(shè)置服務(wù)器套接字
	private Socket client;		//設(shè)置客戶端套接字
	
	//連接客戶端函數(shù)
	void getServer()
	{
		try {
			server = new ServerSocket(1100);	//建立服務(wù)器 端口為1100
			System.out.println("服務(wù)器建立成功!正在等待連接......");
			client = server.accept();	//調(diào)用服務(wù)器函數(shù)對客戶端進行連接			
			System.out.println("客戶端連接成功!ip為:" + client.getInetAddress());	//返回客戶端IP		
			getClientMessage();		//調(diào)用信息傳輸和接收函數(shù)
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	void getClientMessage()
	{
		try {
			while (true) {
				InputStream is = client.getInputStream();	//獲取到客戶端的輸入流
				byte[] b = new byte[1024];	//定義字節(jié)數(shù)組
				int len = is.read(b);	//由于信息的傳輸是以二進制的形式,所以要以二進制的形式進行數(shù)據(jù)的讀取
				String data = new String(b, 0,len);
				System.out.println("客戶端發(fā)來消息:" + data);
				
				//定義發(fā)送給客戶端的輸出流
				OutputStream put = client.getOutputStream();
				String putText = "我已經(jīng)收到!歡迎你!";
				put.write(putText.getBytes());	//將輸出流信息以二進制的形式進行寫入
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		try {
			//判斷客戶端字節(jié)流不是空,則關(guān)閉客戶端
			if (server != null) {
				server.close();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyTcp myTcp = new MyTcp();	//調(diào)用該類生成對象
		myTcp.getServer();	//調(diào)用方法
	}
 
}

客戶端程序

package client_1;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class MyClient {
	private Socket client;	//定義客戶端套接字
	
	//建立客戶端函數(shù)
	void getClient()
	{
		try {
			client = new Socket("127.0.0.1", 1100);	//建立客戶端,使用的IP為127.0.0.1,端口和服務(wù)器一樣為1100
			System.out.println("客戶端建立成功!");
			
			setClientMessage();		//調(diào)用客戶端信息寫入函數(shù)
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//定義客戶端信息寫入函數(shù)
	void setClientMessage()
	{
		try {		
			OutputStream pt = client.getOutputStream();		//建立客戶端信息輸出流
			String printText = "服務(wù)器你好!我是客戶端!";	
			pt.write(printText.getBytes());		//以二進制的形式將信息進行輸出
			
			InputStream input = client.getInputStream();	//建立客戶端信息輸入流
			byte [] b = new byte[1024];		//定義字節(jié)數(shù)組
			int len = input.read(b);	//讀取接收的二進制信息流
			String data = new String(b, 0,len);
			System.out.println("收到服務(wù)器消息:" + data);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
		try {
			//如果客戶端信息流不為空,則說明客戶端已經(jīng)建立連接,關(guān)閉客戶端
			if (client != null) {
				client.close();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//生成客戶端類對象
		MyClient myClient = new MyClient();
		myClient.getClient();
	}
 
}

同時要注意:在客戶端和服務(wù)器搭建成功之后,應(yīng)該先打開服務(wù)器等待連接,再打開客戶端進行連接,同樣在進行關(guān)閉時,應(yīng)該先關(guān)閉客戶端,再關(guān)閉服務(wù)器。

以上面程序為例:

打開服務(wù)器等待客戶端連接

打開客戶端與服務(wù)器連接成功,并且實現(xiàn)雙向通信:

注意:當一臺機器上安裝了多個網(wǎng)絡(luò)應(yīng)用程序時,很可能指定的端口已經(jīng)被占用,甚至還可能遇到之前運行很好的程序突然卡住的情況,這種情況很可能是端口被別的程序占用了,這時可以運行netstat-help來活的幫助,可以使用命令netstat-an來查看該程序所使用的端口。

到此這篇關(guān)于Java利用TCP協(xié)議實現(xiàn)客戶端與服務(wù)器通信(附通信源碼)的文章就介紹到這了,更多相關(guān)Java 客戶端與服務(wù)器通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中CountDownLatch用法解析

    Java中CountDownLatch用法解析

    這篇文章主要為大家詳細介紹了Java中CountDownLatch用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • springboot中@PostConstruct注解使用小結(jié)

    springboot中@PostConstruct注解使用小結(jié)

    本文主要介紹了springboot中@PostConstruct注解使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • MyBatis后端對數(shù)據(jù)庫進行增刪改查等操作實例

    MyBatis后端對數(shù)據(jù)庫進行增刪改查等操作實例

    Mybatis是appach下開源的一款持久層框架,通過xml與java文件的緊密配合,避免了JDBC所帶來的一系列問題,下面這篇文章主要給大家介紹了關(guān)于MyBatis后端對數(shù)據(jù)庫進行增刪改查等操作的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 如何使用IDEA 搭建 SpringCloud 項目

    如何使用IDEA 搭建 SpringCloud 項目

    所謂微服務(wù),就是要把整個業(yè)務(wù)模塊拆分成多個各司其職的小模塊,做到單一職責(zé)原則,不會重復(fù)開發(fā)相同的業(yè)務(wù)代碼,實現(xiàn)真正意義上的高內(nèi)聚、低耦合,這篇文章主要介紹了如何使用IDEA 搭建 SpringCloud 項目,需要的朋友可以參考下
    2023-11-11
  • spring-boot @Component和@Bean的區(qū)別詳解

    spring-boot @Component和@Bean的區(qū)別詳解

    這篇文章主要介紹了spring-boot @Component和@Bean的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法

    Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法

    本文介紹了解決Spring Boot前端Vue跨域問題的實戰(zhàn)經(jīng)驗,并提供了后端和前端的配置示例,通過配置后端和前端,我們可以輕松解決跨域問題,實現(xiàn)正常的前后端交互,需要的朋友可以參考下
    2023-09-09
  • Spring Boot 項目啟動失敗的解決方案

    Spring Boot 項目啟動失敗的解決方案

    這篇文章主要介紹了Spring Boot 項目啟動失敗的解決方案,幫助大家更好的理解和學(xué)習(xí)使用Spring Boot,感興趣的朋友可以了解下
    2021-03-03
  • Java中OkHttp 超時設(shè)置的實現(xiàn)

    Java中OkHttp 超時設(shè)置的實現(xiàn)

    超時設(shè)置是網(wǎng)絡(luò)編程中不可忽視的一部分,本文就來介紹一下Java中OkHttp 超時設(shè)置的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • IDEA導(dǎo)入外部項目報Error:java: 無效的目標發(fā)行版: 11的解決方法

    IDEA導(dǎo)入外部項目報Error:java: 無效的目標發(fā)行版: 11的解決方法

    這篇文章主要介紹了IDEA導(dǎo)入外部項目報Error:java: 無效的目標發(fā)行版: 11,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 基于SpringBoot+vue實現(xiàn)前后端數(shù)據(jù)加解密

    基于SpringBoot+vue實現(xiàn)前后端數(shù)據(jù)加解密

    這篇文章主要給大家介紹了基于SpringBoot+vue實現(xiàn)前后端數(shù)據(jù)加解密,文中有詳細的示例代碼,具有一定的參考價值,感興趣的小伙伴可以自己動手試一試
    2023-08-08

最新評論