真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JAVA如何實(shí)現(xiàn)基于Socket的多線程通信

這篇文章主要介紹了JAVA如何實(shí)現(xiàn)基于Socket的多線程通信,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供鹽邊企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都做網(wǎng)站、H5建站、小程序制作等業(yè)務(wù)。10年已為鹽邊眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

代碼簡(jiǎn)介

代碼思想:

實(shí)現(xiàn)"服務(wù)端-客戶端"之間的通信需要解決兩點(diǎn)問(wèn)題

(1),如何實(shí)現(xiàn)通信

(2),通信中如何避免單線程先接收后發(fā)送(或先發(fā)送后接收)的問(wèn)題;

解決方案:

(1),實(shí)現(xiàn)通信:使用ServerSocket監(jiān)聽(tīng)指定端口后,Socket進(jìn)行連接;然后客戶端與服務(wù)端都獲取Socket對(duì)象的輸入輸出流存入PrintWrite后不斷刷新,即可實(shí)現(xiàn)通信;

(2),彌補(bǔ)單線程缺陷:創(chuàng)建消息接收類和消息發(fā)送類分別繼承Thread;然后通過(guò)開(kāi)啟兩個(gè)線程完避免單線程必須先接收后發(fā)送(或先發(fā)送后接收)的問(wèn)題;

服務(wù)端

package x_Socket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class x_Server{

/** 聲明全局對(duì)象,讓x_Server的內(nèi)部類可以共同調(diào)用這些對(duì)象 **/

static ServerSocket serverSocket = null;//聲明靜態(tài)全局的socket類對(duì)象;讓x_Server的靜態(tài)方法可以直接調(diào)用該對(duì)象;

static Socket socket = null; //聲明靜態(tài)全局的socket類對(duì)象;讓x_Server的靜態(tài)方法可以直接調(diào)用該對(duì)象;

BufferedReader buffSend = null; //信息發(fā)送數(shù)據(jù)流

BufferedReader buffReciever = null; //信息接收數(shù)據(jù)流

PrintWriter printWriter = null; //數(shù)據(jù)讀寫數(shù)據(jù)流

/** 主函數(shù)入口 **/

public static void main(String[] args) throws IOException {

serverSocket = new ServerSocket(5556); //通過(guò)Socket的構(gòu)造函數(shù),監(jiān)聽(tīng)的5556端口(即等待socket對(duì)象向該端口請(qǐng)求連接)

socket = serverSocket.accept(); //如果有socket的對(duì)象請(qǐng)求連接了5556端口,則serverSocket的accept返回一個(gè)socket對(duì)象;

System.out.println("有用戶成功連接客戶端");

Thread xsend = new Thread(new x_Server().new x_Send()); //通過(guò)Thread類的構(gòu)造函數(shù),創(chuàng)建一個(gè)x_Send類的線程對(duì)象

Thread xreciver = new Thread(new x_Server().new x_Receiver()); //通過(guò)外部類對(duì)象去實(shí)例化內(nèi)部類,再通過(guò)Thread的構(gòu)造函數(shù),創(chuàng)建內(nèi)部類x_Reciever的線程二對(duì)象;

xsend.start(); //啟動(dòng)x_Send的線程,讓發(fā)送與接收數(shù)據(jù)可以同時(shí)進(jìn)行

xreciver.start(); //啟動(dòng)x_Receiver的線程,讓發(fā)送與接收數(shù)據(jù)可以同時(shí)進(jìn)行

}

/** 用于服務(wù)端發(fā)送信息的x_Send類(線程一) **/

class x_Send extends Thread{

public void run(){ //繼承Thread類,必須重寫run()方法

try {

buffSend = new BufferedReader(new InputStreamReader(System.in));//獲取從控制臺(tái)輸入數(shù)據(jù)的對(duì)象buffSend

printWriter = new PrintWriter(socket.getOutputStream()); //通過(guò)PrintWriter類的構(gòu)造方法,獲取向客戶端發(fā)送信息的輸出流對(duì)象

String msg = null; //msg:存儲(chǔ)服務(wù)端發(fā)送的信息

do{

msg = buffSend.readLine(); //獲得從控制臺(tái)輸入一行的信息

printWriter.println(msg); //將msg傳到向服務(wù)端發(fā)送信息的輸出流對(duì)象

printWriter.flush(); //刷新輸入輸出流,客戶端端可以立刻收到輸入輸出流的更新信息

}while(!msg.equals("end")); //客戶輸入"end"表示結(jié)束通信

socket.close(); //關(guān)閉端口5556的連接

serverSocket.close(); //不再監(jiān)聽(tīng)端口5556(即不再接收來(lái)自該端口的連接)

} catch (IOException e) {

System.out.println("客戶端連接已斷開(kāi)");

e.printStackTrace();

}

}

}

/** 用于服務(wù)端接收信息的x_Reciever類(線程二) **/

class x_Receiver extends Thread{

public void run(){ //繼承Thread類,必須重寫run()方法

try {

buffReciever = new BufferedReader(new InputStreamReader(socket.getInputStream())); //獲取從socket輸入(客戶端傳輸過(guò)來(lái))數(shù)據(jù)的輸入流對(duì)象

while(true){

System.out.println("接收客戶端消息:"+buffReciever.readLine()); //輸出客戶端傳輸過(guò)來(lái)的信息

}

} catch (IOException e) {

System.out.println("客戶端連接已斷開(kāi):\n");

e.printStackTrace();

}

}

}

}

客戶端

package x_Socket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

public class x_Client {

/** 聲明全局對(duì)象,讓x_Client的內(nèi)部類可以共同調(diào)用這些對(duì)象 **/

static Socket socket = null; //聲明靜態(tài)全局的socket類對(duì)象;讓x_Client的靜態(tài)方法可以直接調(diào)用該對(duì)象;

BufferedReader buffSend = null; //信息發(fā)送數(shù)據(jù)流

BufferedReader buffReciever = null; //信息接收數(shù)據(jù)流

PrintWriter printWriter = null; //數(shù)據(jù)讀寫數(shù)據(jù)流

/** 主函數(shù)入口 **/

public static void main(String[] args) throws UnknownHostException, IOException {

socket =new Socket("127.0.0.1",5556); //通過(guò)Socket的構(gòu)造函數(shù),連接本地ip的5556端口

System.out.println("連接服務(wù)端信息如下:\nip:127,0.0.1 port:5556");

Thread xsend = new Thread(new x_Client().new x_SendMsg()); //通過(guò)Thread類的構(gòu)造函數(shù),創(chuàng)建一個(gè)x_SendMsg類的線程對(duì)象

Thread xreciver = new Thread(new x_Client().new x_RecieverMsg()); //通過(guò)外部類對(duì)象去實(shí)例化內(nèi)部類,再通過(guò)Thread的構(gòu)造函數(shù),創(chuàng)建內(nèi)部類x_RecieverMsg的線程二對(duì)象;

xsend.start(); //啟動(dòng)x_SendMsg的線程;

xreciver.start(); //啟動(dòng)x_RecieverMsg的線程;兩個(gè)讓發(fā)送與接收數(shù)據(jù)可以同時(shí)進(jìn)行

}

/** 用于客戶端發(fā)送信息的x_SendMsg類(線程一)**/

class x_SendMsg extends Thread{

public void run(){ //繼承Thread類,必須重寫run()方法

try {

buffSend = new BufferedReader(new InputStreamReader(System.in));//獲取從控制臺(tái)輸入數(shù)據(jù)的對(duì)象buffSend

printWriter = new PrintWriter(socket.getOutputStream()); //通過(guò)PrintWriter類的構(gòu)造方法,獲取向服務(wù)端發(fā)送信息的輸出流對(duì)象

String msg = null; //msg:存儲(chǔ)客戶端發(fā)送的信息

do{

msg = buffSend.readLine(); //獲得從控制臺(tái)輸入一行的信息

printWriter.println(msg); //將msg傳到向服務(wù)端發(fā)送信息的輸出流對(duì)象

printWriter.flush(); //刷新輸入輸出流,服務(wù)端可以立刻收到輸入輸出流的更新信息

}while(!msg.equals("end")); //客戶輸入"end"表示結(jié)束通信

socket.close(); //關(guān)閉端口5556的連接

} catch (IOException e) {

System.out.println("服務(wù)端端口已關(guān)閉"); //異常提示信息顯示

e.printStackTrace(); 鄭州祛胎記醫(yī)院哪家好 http://www.zykeda120.com/

}

}

}

/** 用于客戶端接收信息的x_RecieverMsg類(線程二) **/

class x_RecieverMsg extends Thread{

public void run(){ //繼承Thread類,必須重寫run()方法

try {

buffReciever = new BufferedReader(new InputStreamReader(socket.getInputStream())); //獲取從socket輸入(服務(wù)端傳輸過(guò)來(lái))數(shù)據(jù)的輸入流對(duì)象

while(true){

System.out.println("收到服務(wù)端消息:"+buffReciever.readLine()); //輸出服務(wù)端傳輸過(guò)來(lái)的信息

}

} catch (IOException e) {

System.out.println("服務(wù)端端口已關(guān)閉"); //異常提示信息顯示

e.printStackTrace();

}

}

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“JAVA如何實(shí)現(xiàn)基于Socket的多線程通信”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!


網(wǎng)頁(yè)題目:JAVA如何實(shí)現(xiàn)基于Socket的多線程通信
網(wǎng)頁(yè)路徑:http://weahome.cn/article/ipjddd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部