Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信 原創(chuàng)
在網(wǎng)絡(luò)編程中如果只要求客戶機(jī)向服務(wù)器發(fā)送消息,不要求服務(wù)器向客戶機(jī)發(fā)送消息,稱為單線通信??蛻魴C(jī)套接字和服務(wù)器套接字鏈接成功后,可估計(jì)通過輸出流發(fā)送數(shù)據(jù),服務(wù)器則通過輸入流接受數(shù)據(jù),下面是簡(jiǎn)單的單向通信的例子。
實(shí)例1:本實(shí)例是一個(gè)TCP服務(wù)器端程序,在 getserver() 方法中建立服務(wù)器套接字,調(diào)用getClienMessage()方法獲取客戶端信息。代碼如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class MyTcp { private BufferedReader reader; private ServerSocket server; private Socket socket; void getserver() { try { server = new ServerSocket(8998); System.out.println("服務(wù)器套接字已經(jīng)創(chuàng)建成功"); while(true) { System.out.println("等待客戶機(jī)的連接"); socket = server.accept(); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); getClienMessage(); } }catch(Exception e) { e.printStackTrace(); } } private void getClienMessage() { try { while (true) { System.out.println("客戶機(jī):"+ reader.readLine()); } }catch(Exception e) { e.printStackTrace(); } try { if(reader !=null) { reader.close(); } if(socket !=null) { socket.close(); } }catch(IOException e) { e.printStackTrace(); } } public static void main(String[] args) { MyTcp tcp = new MyTcp(); tcp.getserver(); } }
運(yùn)行結(jié)果:
服務(wù)器套接字已經(jīng)創(chuàng)建成功
等待客戶機(jī)的連接
下面我們?cè)賮砜匆幌驴蛻舳顺绦颉?/p>
實(shí)例2:客戶端程序,實(shí)現(xiàn)將用戶在文本框輸入的信息發(fā)送到服務(wù)器端,并將文本框中輸入的信息顯示在客戶端的文本域中。代碼如下:
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.PrintWriter; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.BevelBorder; public class MyClien extends JFrame{ private PrintWriter writer; Socket socket; private JTextArea ta = new JTextArea(); private JTextField tf = new JTextField(); Container cc; public MyClien(String title) { super(title); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cc = this.getContentPane(); final JScrollPane scrollPane = new JScrollPane(); scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED)); getContentPane().add(scrollPane, BorderLayout.CENTER); scrollPane.setViewportView(ta); cc.add(tf,"South"); tf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { writer.println(tf.getText()); ta.append(tf.getText()+ '\n'); ta.setSelectionEnd(ta.getText().length()); tf.setText(""); } }); } private void connect() { ta.append("嘗試連接\n"); try { socket = new Socket("127.0.0.1",8998); writer = new PrintWriter(socket.getOutputStream(),true); ta.append("完成連接\n"); }catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { MyClien clien = new MyClien("向服務(wù)器傳送數(shù)據(jù)"); clien.setSize(200,200); clien.setVisible(true); clien.connect(); } }
服務(wù)器端運(yùn)行結(jié)果:
服務(wù)器套接字已經(jīng)創(chuàng)建成功
等待客戶機(jī)的連接
客戶機(jī):革命尚未成功,同志仍需努力!
客戶端運(yùn)行結(jié)果:
嘗試連接
完成連接
革命尚未成功,同志仍需努力!
說明:
當(dāng)一臺(tái)機(jī)器上安裝了多個(gè)網(wǎng)絡(luò)應(yīng)用程序,很可能指定的端口號(hào)已被占用。還可能遇到以前運(yùn)行良好的網(wǎng)絡(luò)程序突然運(yùn)行不了的情況,這種情況很可能也是由于端口被別的程序占用了。此時(shí)使用命令 netstat -an 來查看該程序所使用的端口。
在這里還有很重要的一點(diǎn),本文所述兩份源碼,一個(gè)是服務(wù)器端程序,一個(gè)是客戶端程序。運(yùn)行時(shí)一定要先運(yùn)行服務(wù)器端程序,然后運(yùn)行客戶端程序,而且兩段代碼的端口號(hào)一定要相同。
以上就是本文的全部?jī)?nèi)容,真心希望對(duì)大家有所幫助。學(xué)習(xí)是一件任重道遠(yuǎn)的事情,那句老話說得好:革命尚未成功,同志仍需努力!
感謝大家對(duì)本站的支持。
相關(guān)文章
Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的鏈表的概念與實(shí)現(xiàn)
鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針連接次序?qū)崿F(xiàn)的,每一個(gè)鏈表都包含多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)又包含兩個(gè)部分,一個(gè)是數(shù)據(jù)域,一個(gè)是引用域2022-03-03基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報(bào)錯(cuò):Not allowed to load local
這篇文章主要介紹了基于Springboot2.3訪問本地路徑下靜態(tài)資源的方法(解決報(bào)錯(cuò):Not allowed to load local resource),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08springboot集成nacos無(wú)法動(dòng)態(tài)獲取nacos配置的問題
這篇文章主要介紹了springboot集成nacos無(wú)法動(dòng)態(tài)獲取nacos配置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09jenkins如何通過pipeline部署springboot項(xiàng)目
為了提高SpringBoot項(xiàng)目的部署效率和規(guī)范性,建議將項(xiàng)目代碼和部署腳本分離,項(xiàng)目代碼倉(cāng)庫(kù)專注業(yè)務(wù)邏輯,構(gòu)建為jar包;另外設(shè)立獨(dú)立代碼倉(cāng)庫(kù)存放Jenkinsfile等部署配置文件,在Jenkins中配置pipeline,自動(dòng)拉取項(xiàng)目代碼進(jìn)行構(gòu)建和部署2024-09-09關(guān)于activemq安裝配置以及啟動(dòng)錯(cuò)誤的解決
這篇文章主要介紹了關(guān)于activemq安裝配置以及啟動(dòng)錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06java finally塊執(zhí)行時(shí)機(jī)全面分析
下面小編就為大家?guī)硪黄猨ava finally塊執(zhí)行時(shí)機(jī)全面分析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08java之a(chǎn)ssert關(guān)鍵字用法案例詳解
這篇文章主要介紹了java之a(chǎn)ssert關(guān)鍵字用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08