溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java網(wǎng)絡編程基礎篇之單向通信 原創(chuàng)

發(fā)布時間:2020-10-05 13:43:10 來源:腳本之家 閱讀:177 作者:司機 欄目:編程語言

        在網(wǎng)絡編程中如果只要求客戶機向服務器發(fā)送消息,不要求服務器向客戶機發(fā)送消息,稱為單線通信??蛻魴C套接字和服務器套接字鏈接成功后,可估計通過輸出流發(fā)送數(shù)據(jù),服務器則通過輸入流接受數(shù)據(jù),下面是簡單的單向通信的例子。

        實例1:本實例是一個TCP服務器端程序,在 getserver() 方法中建立服務器套接字,調(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("服務器套接字已經(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();
	}
}

運行結果:

服務器套接字已經(jīng)創(chuàng)建成功
等待客戶機的連接

        下面我們再來看一下客戶端程序。

        實例2:客戶端程序,實現(xiàn)將用戶在文本框輸入的信息發(fā)送到服務器端,并將文本框中輸入的信息顯示在客戶端的文本域中。代碼如下:

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("向服務器傳送數(shù)據(jù)");
			clien.setSize(200,200);
			clien.setVisible(true);
			clien.connect();
		}
	}

服務器端運行結果:

服務器套接字已經(jīng)創(chuàng)建成功
等待客戶機的連接
客戶機:革命尚未成功,同志仍需努力!

客戶端運行結果:

嘗試連接
完成連接
革命尚未成功,同志仍需努力!

說明:

        當一臺機器上安裝了多個網(wǎng)絡應用程序,很可能指定的端口號已被占用。還可能遇到以前運行良好的網(wǎng)絡程序突然運行不了的情況,這種情況很可能也是由于端口被別的程序占用了。此時使用命令 netstat -an 來查看該程序所使用的端口。

        在這里還有很重要的一點,本文所述兩份源碼,一個是服務器端程序,一個是客戶端程序。運行時一定要先運行服務器端程序,然后運行客戶端程序,而且兩段代碼的端口號一定要相同。

        以上就是本文的全部內(nèi)容,真心希望對大家有所幫助。學習是一件任重道遠的事情,那句老話說得好:革命尚未成功,同志仍需努力!

        感謝大家對本站的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI