使用Java實(shí)現(xiàn)簡(jiǎn)單的server/client回顯功能的方法介紹
Socket是指在一個(gè)特定編程模型下,進(jìn)程間通信鏈路的端點(diǎn)。因?yàn)檫@個(gè)特定編程模型的流行,Socket這個(gè)名字在其他領(lǐng)域得到了復(fù)用,包括Java叫技術(shù)。
如果要建立連接,一臺(tái)機(jī)器必須運(yùn)行一個(gè)進(jìn)程來(lái)等待連接,而另一臺(tái)機(jī)器必須試圖到達(dá)第一臺(tái)機(jī)器。這個(gè)電話(huà)系統(tǒng)類(lèi)似:一方必須發(fā)起呼叫,而另一方在此時(shí)必須等待電話(huà)呼叫。
java網(wǎng)絡(luò)模型圖
下面通過(guò)一個(gè)有“回顯”功能的服務(wù)器和客戶(hù)端來(lái)介紹應(yīng)用java.net包編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序。
這個(gè)例子主要功能是服務(wù)器端的程序等待客戶(hù)的輸入,然后將讀取到的信息回顯給客戶(hù)端,同時(shí)在服務(wù)器端的控制臺(tái)輸出。而客戶(hù)端從控制臺(tái)接收信息后,向客戶(hù)端發(fā)送輸入,并接收服務(wù)器的回顯數(shù)據(jù),然后顯示在控制臺(tái)。
客戶(hù)端程序代碼如下:
package com.javapp.ch11;
import java.io.*;
import java.net.*;
/**
* Description: 具有“回顯”功能的服務(wù)器端和客戶(hù)端程序
*/
public class EchoClientDemo {
// 服務(wù)器端的服務(wù)端口。
public static final int SERVERPORT = 990;
public static void main(String[] args) {
try {
// 建立連接套接字。
Socket s = new Socket("localhost",SERVERPORT);
System.out.println("socket = " + s);
// 新建網(wǎng)絡(luò)連接的輸入流。
BufferedReader in = new BufferedReader(new InputStreamReader(s
.getInputStream()));
// 新建網(wǎng)絡(luò)連接的自動(dòng)刷新的輸出流。
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())),true);
// 先使用System.in構(gòu)造InputStreamReader,再構(gòu)造BufferedReader。
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Enter a string, Enter BYE to exit! ");
while (true) {
// 讀取從控制臺(tái)輸入的字符串,并向網(wǎng)絡(luò)連接輸出,即向服務(wù)器端發(fā)送數(shù)據(jù)。
out.println(stdin.readLine());
// 從網(wǎng)絡(luò)連接讀取一行,即接收服務(wù)器端的數(shù)據(jù)。
String str = in.readLine();
// 如果接收到的數(shù)據(jù)為空(如果直接按Enter,不是空數(shù)據(jù)),則退出循環(huán),關(guān)閉連接。
if (str == null) {
break;
}
System.out.println(str);
}
s.close();
} catch (IOException e) {
System.err.println("IOException" + e.getMessage());
}
}
}
上面客戶(hù)端程序中。首先用java.net包中的Socket類(lèi)建立一個(gè)連接套接字,其后應(yīng)用的Socket對(duì)象的getInputStream方法從服務(wù)器接收數(shù)據(jù),并且應(yīng)用Socket對(duì)象的getOuputStream方法發(fā)送數(shù)據(jù)到服務(wù)器。創(chuàng)建完輸入輸出流,就可以像讀寫(xiě)文件的方式來(lái)讀寫(xiě)數(shù)據(jù)。
支持多客戶(hù)端的“回顯”服務(wù)器端程序代碼如下:
package com.javapp.ch11;
import java.io.*;
import java.net.*;
/**
* Description:支持多客戶(hù)端的“回顯”服務(wù)器端程序
*/
public class EchoServerThreadDemo {
// 服務(wù)器端的服務(wù)端口。
public static final int SERVERPORT = 990;
public static void main(String[] args) {
try {
// 已經(jīng)連接上的客戶(hù)端的序號(hào)。
int number = 1;
// 建立服務(wù)器端傾聽(tīng)套接字。
ServerSocket s = new ServerSocket(SERVERPORT);
System.out.println("Started: " + s);
while (true) {
// 等待并接收請(qǐng)求,建立連接套接字。
Socket incoming = s.accept();
System.out.println("Connection " + number + " accepted: ");
System.out.println(incoming);
// 啟動(dòng)一個(gè)線(xiàn)程來(lái)進(jìn)行服務(wù)器端和客戶(hù)端的數(shù)據(jù)傳輸。
// 主程序繼續(xù)監(jiān)聽(tīng)是否有請(qǐng)求到來(lái)。
Thread t = new EchoThread(incoming,number);
t.start();
number++;
}
} catch (IOException e) {
System.err.println("IOException");
}
}
}
class EchoThread extends Thread {
private Socket s;
int n;
public EchoThread(Socket incoming,int number) {
s = incoming;
n = number;
}
public void run() {
try {
// 新建網(wǎng)絡(luò)連接的輸入流。
BufferedReader in = new BufferedReader(new InputStreamReader(s
.getInputStream()));
// 新建網(wǎng)絡(luò)連接的自動(dòng)刷新的輸出流。
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())),true);
System.out.println("Hello! Enter BYE to exit.");
// 回顯客戶(hù)端的輸入。
while (true) {
// 從網(wǎng)絡(luò)連接讀取一行,即接收客戶(hù)端的數(shù)據(jù)。
String line = in.readLine();
// 如果接收到的數(shù)據(jù)為空(如果直接按Enter,不是空數(shù)據(jù)),則退出循環(huán),關(guān)閉連接。
if (line == null) {
break;
} else {
if (line.trim().equals("BYE")) {
System.out.println("The client " + n + " entered BYE!");
System.out.println("Connection " + n + " will be closed!");
break;
}
System.out.println("Echo " + n + ": " + line);
// 向網(wǎng)絡(luò)連接輸出一行,即向客戶(hù)端發(fā)送數(shù)據(jù)。
out.println("Echo " + n + ": " + line);
}
}
// 關(guān)閉套接字。
s.close();
} catch (IOException e) {
System.err.println("IOException");
}
}
}
在服務(wù)器端程序中,首先用java.net包中的ServerSocket類(lèi)創(chuàng)建一個(gè)服務(wù)器端偵聽(tīng)套接字。其后應(yīng)用ServerSocket類(lèi)的accept方法等待并接收用戶(hù)請(qǐng)求。當(dāng)服務(wù)器每接收到一個(gè)連接請(qǐng)求后,就啟動(dòng)一個(gè)線(xiàn)程來(lái)單獨(dú)處理服務(wù)器和客戶(hù)端的數(shù)據(jù)傳輸。服務(wù)器端數(shù)據(jù)的接收和發(fā)送與上面介紹的客戶(hù)端數(shù)據(jù)的發(fā)送和介紹相同。
- PHP中soap用法示例【SoapServer服務(wù)端與SoapClient客戶(hù)端編寫(xiě)】
- Java虛擬機(jī)JVM之server模式與client模式的區(qū)別
- Python Socket實(shí)現(xiàn)簡(jiǎn)單TCP Server/client功能示例
- Android系統(tǒng)進(jìn)程間通信(IPC)機(jī)制Binder中的Server和Client獲得Service Manager接口之路
- python實(shí)現(xiàn)的udp協(xié)議Server和Client代碼實(shí)例
- SQL Server Native Client下載 SQL Server Native Client安裝方法
- python client使用http post 到server端的代碼
- Asp.Net 不同的OnClick事件區(qū)別小結(jié)(onserverclick,onclientclick)
- JVM Client和Server端有什么區(qū)別
相關(guān)文章
使用JavaScript制作一個(gè)簡(jiǎn)單的計(jì)數(shù)器的方法
這篇文章主要介紹了使用JavaScript制作一個(gè)簡(jiǎn)單的計(jì)數(shù)器的方法,用于計(jì)算網(wǎng)頁(yè)用戶(hù)的來(lái)訪次數(shù),需要的朋友可以參考下2015-07-07JavaScipt基本教程之JavaScript語(yǔ)言的基礎(chǔ)
2008-01-01淺談JavaScript編程語(yǔ)言的編碼規(guī)范
本文淺談 JavaScript 編程中關(guān)于編碼規(guī)范的問(wèn)題,分析其中緣由。希望引起更多 Web 開(kāi)發(fā)人員對(duì) JavaScript 編碼規(guī)范問(wèn)題的關(guān)注和對(duì)軟件產(chǎn)品質(zhì)量問(wèn)題的重視2011-10-10Javascript入門(mén)學(xué)習(xí)第八篇 js dom節(jié)點(diǎn)屬性說(shuō)明
上2篇文章我們講了 用dom方式 創(chuàng)建節(jié)點(diǎn),復(fù)制節(jié)點(diǎn),插入節(jié)點(diǎn), 刪除節(jié)點(diǎn),替換節(jié)點(diǎn),查找節(jié)點(diǎn),獲取屬性等。。。2008-07-07JavaScript入門(mén)教程(9) Document文檔對(duì)象
Document文檔對(duì)象是JavaScript中window和frames對(duì)象的一個(gè)屬性,是顯示于窗口或框架內(nèi)的一個(gè)文檔。2009-01-01javascript的日期對(duì)象、數(shù)組對(duì)象、二維數(shù)組使用說(shuō)明
這篇文章主要介紹了javascript的日期對(duì)象、數(shù)組對(duì)象、二維數(shù)組使用說(shuō)明,需要的朋友可以參考下2014-12-12JavaScript靜態(tài)類(lèi)型檢查工具FLOW簡(jiǎn)介
這篇文章主要介紹了JavaScript靜態(tài)類(lèi)型檢查工具FLOW簡(jiǎn)介,需要的朋友可以參考下2015-01-01深入理解JavaScript系列(22):S.O.L.I.D五大原則之依賴(lài)倒置原則DIP詳解
這篇文章主要介紹了深入理解JavaScript系列(22):S.O.L.I.D五大原則之依賴(lài)倒置原則DIP詳解,本文講解了DIP and JavaScript、何時(shí)依賴(lài)注入等內(nèi)容,需要的朋友可以參考下2015-03-03