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-08
springboot集成nacos無法動(dòng)態(tài)獲取nacos配置的問題
這篇文章主要介紹了springboot集成nacos無法動(dòng)態(tài)獲取nacos配置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
jenkins如何通過pipeline部署springboot項(xiàng)目
為了提高SpringBoot項(xiàng)目的部署效率和規(guī)范性,建議將項(xiàng)目代碼和部署腳本分離,項(xiàng)目代碼倉庫專注業(yè)務(wù)邏輯,構(gòu)建為jar包;另外設(shè)立獨(dú)立代碼倉庫存放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-06
java finally塊執(zhí)行時(shí)機(jī)全面分析
下面小編就為大家?guī)硪黄猨ava finally塊執(zhí)行時(shí)機(jī)全面分析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
java之a(chǎn)ssert關(guān)鍵字用法案例詳解
這篇文章主要介紹了java之a(chǎn)ssert關(guān)鍵字用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

