Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信 原創(chuàng)
在網(wǎng)絡(luò)編程中如果只要求客戶機向服務(wù)器發(fā)送消息,不要求服務(wù)器向客戶機發(fā)送消息,稱為單線通信。客戶機套接字和服務(wù)器套接字鏈接成功后,可估計通過輸出流發(fā)送數(shù)據(jù),服務(wù)器則通過輸入流接受數(shù)據(jù),下面是簡單的單向通信的例子。
實例1:本實例是一個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("等待客戶機的連接");
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("客戶機:"+ 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();
}
}
運行結(jié)果:
服務(wù)器套接字已經(jīng)創(chuàng)建成功
等待客戶機的連接
下面我們再來看一下客戶端程序。
實例2:客戶端程序,實現(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ù)器端運行結(jié)果:
服務(wù)器套接字已經(jīng)創(chuàng)建成功
等待客戶機的連接
客戶機:革命尚未成功,同志仍需努力!
客戶端運行結(jié)果:
嘗試連接
完成連接
革命尚未成功,同志仍需努力!
說明:
當(dāng)一臺機器上安裝了多個網(wǎng)絡(luò)應(yīng)用程序,很可能指定的端口號已被占用。還可能遇到以前運行良好的網(wǎng)絡(luò)程序突然運行不了的情況,這種情況很可能也是由于端口被別的程序占用了。此時使用命令 netstat -an 來查看該程序所使用的端口。
在這里還有很重要的一點,本文所述兩份源碼,一個是服務(wù)器端程序,一個是客戶端程序。運行時一定要先運行服務(wù)器端程序,然后運行客戶端程序,而且兩段代碼的端口號一定要相同。
以上就是本文的全部內(nèi)容,真心希望對大家有所幫助。學(xué)習(xí)是一件任重道遠(yuǎn)的事情,那句老話說得好:革命尚未成功,同志仍需努力!
感謝大家對本站的支持。
相關(guān)文章
基于Java+SpringBoot實現(xiàn)人臉識別搜索
人臉識別搜索技術(shù)作為現(xiàn)代計算機視覺領(lǐng)域的重要研究方向之一,已經(jīng)在多個領(lǐng)域展現(xiàn)出巨大的應(yīng)用潛力,隨著信息技術(shù)的飛速發(fā)展,人臉識別搜索在多個領(lǐng)域得到了廣泛關(guān)注和應(yīng)用,本文旨在探討人臉識別搜索技術(shù)的背景、原理以及其在實際應(yīng)用中的意義和挑戰(zhàn)2023-08-08
springboot中報錯Invalid character found in
這篇文章主要介紹了springboot中報錯Invalid character found in the request的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09

