Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
709
2025-04-01
事實(shí)上網(wǎng)絡(luò)編程簡(jiǎn)單的理解就是兩臺(tái)計(jì)算機(jī)相互通訊數(shù)據(jù)而已.對(duì)于程序員而言,去掌握一種編程接口并使用一種編程模型相對(duì)就會(huì)顯得簡(jiǎn)單的多了.Java SDK提供一些相對(duì)簡(jiǎn)單的Api來完成這些工作.Java SOCKET編程就是其中之一.對(duì)于Java而言.這些Api存在與java.net 這個(gè)包里面.因此只要導(dǎo)入這個(gè)包就可以準(zhǔn)備網(wǎng)絡(luò)編程了.
網(wǎng)絡(luò)編程的基本模型就是客戶機(jī)到服務(wù)器模型.簡(jiǎn)單的說就是兩個(gè)進(jìn)程之間相互通訊,然后其中一個(gè)必須提供一個(gè)固定的位置,而另一個(gè)則只需要知道這個(gè)固定的位置.并去建立兩者之間的聯(lián)系..然后完成數(shù)據(jù)的通訊就可以了.這里提供固定位置的通常稱為服務(wù)器,而建立聯(lián)系的通常叫做客戶端.基于這個(gè)簡(jiǎn)單的模型,就可以進(jìn)入網(wǎng)絡(luò)編程啦.
Java對(duì)這個(gè)模型的支持有很多種Api.而這里我只想介紹有關(guān)Java SOCKET編程的編程接口.對(duì)于Java而言已經(jīng)簡(jiǎn)化了Socket的編程接口.首先我們來討論有關(guān)提供固定位置的服務(wù)方是如何建立的.Java提供了ServerSocket來對(duì)其進(jìn)行支持.事實(shí)上當(dāng)你創(chuàng)建該類的一個(gè)實(shí)力對(duì)象并提供一個(gè)端口資源你就建立了一個(gè)固定位置可以讓其他計(jì)算機(jī)來訪問你.ServerSocket server=new ServerSocket(6789);這里稍微要注意的是端口的分配必須是唯一的.因?yàn)槎丝谑菫榱宋ㄒ粯?biāo)識(shí)每臺(tái)計(jì)算機(jī)唯一服務(wù)的.另外端口號(hào)是從0~65535之間的,前1024個(gè)端口已經(jīng)被Tcp/Ip 作為保留端口,因此你所分配的端口只能是1024個(gè)之后的.好了.
我們有了固定位置.現(xiàn)在所需要的就是一根連接線了.該連接線由客戶方首先提出要求.因此Java同樣提供了一個(gè)Java Socket編程對(duì)象來對(duì)其進(jìn)行支持.只要客戶方創(chuàng)建一個(gè)Socket的實(shí)例對(duì)象進(jìn)行支持就可以了.Socket client=new Socket(InetAddress.getLocalHost(),5678);客戶機(jī)必須知道有關(guān)服務(wù)器的IP地址.對(duì)于著一點(diǎn)Java也提供了一個(gè)相關(guān)的類InetAddress 該對(duì)象的實(shí)例必須通過它的靜態(tài)方法來提供.它的靜態(tài)方法主要提供了得到本機(jī)IP 和通過名字或IP直接得到InetAddress的方法.
好了.上面的方法基本可以建立一條連線讓兩臺(tái)計(jì)算機(jī)相互交流了.可是數(shù)據(jù)是如何傳輸?shù)哪?事實(shí)上I/O操作總是和網(wǎng)絡(luò)編程息息相關(guān)的.因?yàn)榈讓拥木W(wǎng)絡(luò)是繼續(xù)數(shù)據(jù)的.除非遠(yuǎn)程調(diào)用,處理問題的核心在執(zhí)行上.否則數(shù)據(jù)的交互還是依賴于IO操作的.所以你也必須導(dǎo)入java.io這個(gè)包.java的IO操作也不復(fù)雜.它提供了針對(duì)于字節(jié)流和Unicode的讀者和寫者,然后也提供了一個(gè)緩沖用于數(shù)據(jù)的讀寫.
BufferedReader?in=new?BufferedReader(new?InputStream
Reader(server.getInputStream()));
PrintWriter?out=new?PrintWriter(server.getOutputStream());
上面兩句就是建立緩沖并把原始的字節(jié)流轉(zhuǎn)變?yōu)閁nicode可以操作.而原始的字節(jié)流來源于Java Socket編程的兩個(gè)方法.getInputStream()和getOutputStream()方.分別用來得到輸入和輸出.那么現(xiàn)在有了基本的模型和基本的操作工具.我們可以做一個(gè)簡(jiǎn)單的Socket例程了.
服務(wù)方:
import?java.io.*;
import?java.net.*;
public?class?MyServer?{
public?static?void?main(String[]?args)?throws?IOException{
ServerSocket?server=new?ServerSocket(5678);
Socket?client=server.accept();
BufferedReader?in=new?BufferedReader(new?InputStreamReader
(client.getInputStream()));
PrintWriter?out=new?PrintWriter(client.getOutputStream());
while(true){
String?str=in.readLine();
System.out.println(str);
out.println("has?receive....");
out.flush();
if(str.equals("end"))
break;
}
client.close();
}
}
這個(gè)Java Socket編程的主要目的在于服務(wù)器不斷接收客戶機(jī)所寫入的信息只到.客戶機(jī)發(fā)送"End"字符串就退出程序.并且服務(wù)器也會(huì)做出"Receive"為回應(yīng).告知客戶機(jī)已接收到消息。
Socket通信讀取有不少需要我們注意的知識(shí)點(diǎn)。當(dāng)我們?cè)谑褂玫臅r(shí)候有很多的問題擺在我們面前。下面我們就來詳細(xì)的學(xué)習(xí)有關(guān)Java Socket通信讀取的相關(guān)代碼編寫。
以下是Java Socket通信讀取的相關(guān)代碼。
import?java.io.BufferedReader;
import?java.io.BufferedWriter;
import?java.io.File;
import?java.io.FileWriter;
import?java.io.InputStreamReader;
import?java.net.URL;public?class?URLReader?{
/**
*?@param?args
*?@throws?Exception
*/
public?static?void?main(String[]?args)?throws?Exception?{
//?聲明拋出所有例外
URL?tirc?=?new?URL(http://www.sina.com);
File?writeFile?=?new?File("d:\style_1.html");
//?構(gòu)建一URL對(duì)象14100
BufferedReader?in?=?new?BufferedReader(new?InputStreamReader(tirc.openStream()));
BufferedWriter?bos?=?new?BufferedWriter(new?FileWriter(writeFile));
//byte[]?b=new?byte[4096];
String?inputLine;
//?使用openStream得到一輸入流并由此構(gòu)造一個(gè)BufferedReader對(duì)象
while?((ininputLine?=?in.readLine())?!=?null){
bos.write(inputLine);
System.out.println(inputLine);
}
bos.flush();
in.close();
bos.close();
}
}
這就是傳說中的Java Socket通信讀取相關(guān)代碼的介紹。
Java Socket線程我們經(jīng)常會(huì)用到的技術(shù),但是有很多程序員還是有不少的使用問題,下面我們就看看如何才能進(jìn)行有關(guān)的代碼編寫,希望大家又說收獲。網(wǎng)絡(luò)的偉大之一也是信息共享,Server可以主動(dòng)向所有Client廣播消息,同時(shí)Client也可以向其它Client發(fā)布消息。
下面看看如何開發(fā)一個(gè)可以實(shí)時(shí)傳遞消息的程序。
Java Socket線程的設(shè)計(jì)原理:
服務(wù)器端接受客戶端的連接請(qǐng)求,同時(shí)啟動(dòng)一個(gè)線程處理這個(gè)連接,線程不停的讀取客戶端輸入,然后把輸入加入隊(duì)列中,等候處理。在線程啟動(dòng)的同時(shí)將線程加入隊(duì)列中,以便在需要的時(shí)候定位和取出。
{源碼}
import?java.io.*;
import?java.net.*;
import?java.util.*;
import?java.lang.*;
public?class?Server?extends?ServerSocket
{
private?static?ArrayList?User_List?=?new?ArrayList();
private?static?ArrayList?Threader?=?new?ArrayList();
private?static?LinkedList?Message_Array?=?new?LinkedList();
private?static?int?Thread_Counter?=?0;
private?static?boolean?isClear?=?true;
protected?static?final?int?SERVER_PORT?=?10000;
protected?FileOutputStream?LOG_FILE?=?new?FileOutputStream("d:/connect.log",?true);
public?Server()?throws?FileNotFoundException,?IOException
{
super(SERVER_PORT);
new?Broadcast();
//append?connection?log
Calendar?now?=?Calendar.getInstance();
String?str?=?"["?+?now.getTime().toString()?+?"]?Accepted?a?connection1512";
byte[]?tmp?=?str.getBytes();
LOG_FILE.write(tmp);
try
{
while?(true)
{
Socket?socket?=?accept();
new?CreateServerThread(socket);
}
}
finally
{
close();
}
}
public?static?void?main(String[]?args)?throws?IOException
{
new?Server();
}
//---?Broadcast
class?Broadcast?extends?Thread
{
public?Broadcast()
{
start();
}
public?void?run()
{
while?(true)
{
if?(!isClear)
{
String?tmp?=?(String)Message_Array.getFirst();
for?(int?i?=?0;?i?
{
CreateServerThread?client?=?(CreateServerThread)Threader.get(i);
client.sendMessage(tmp);
}
Message_Array.removeFirst();
isClear?=?Message_Array.size()?>?0???false?:?true;
}
}
}
}
//---?CreateServerThread
class?CreateServerThread?extends?Thread
{
private?Socket?client;
private?BufferedReader?in;
private?PrintWriter?out;
private?String?Username;
public?CreateServerThread(Socket?s)?throws?IOException
{
client?=?s;
in?=?new?BufferedReader(new?InputStreamReader(client.getInputStream()));
out?=?new?PrintWriter(client.getOutputStream(),?true);
out.println("---?Welcome?to?this?chatroom?---");
out.println("Input?your?nickname:");
start();
}
public?void?sendMessage(String?msg)
{
out.println(msg);
}
public?void?run()
{
try
{
int?flag?=?0;
Thread_Counter++;
String?line?=?in.readLine();
while?(!line.equals("bye"))
{
if?(line.equals("l"))
{
out.println(listOnlineUsers());
line?=?in.readLine();
continue;
}
if?(flag++?==?0)
{
Username?=?line;
User_List.add(Username);
out.println(listOnlineUsers());
Threader.add(this);
pushMessage("["?+?Username?+?"?come?on?in?>]");
}
else
{
pushMessage("<"?+?Username?+?">"?+?line);
}
line?=?in.readLine();
}
out.println("---?See?you,?bye!?---");
client.close();
}
catch?(IOException?e)
{}
finally
{
try
{
client.close();
}
catch?(IOException?e)
{}
Thread_Counter--;
Threader.remove(this);
User_List.remove(Username);
pushMessage("["?+?Username?+?"?left>]");
}
}
private?String?listOnlineUsers()
{
String?s?="-+-?Online?list?-+-1512";
for?(int?i?=?0;?i?
{
s?+=?"["?+?User_List.get(i)?+?"]1512";
}
s?+=?"-+---------------------+-";
return?s;
}
private?void?pushMessage(String?msg)
{
Message_Array.addLast(msg);
isClear?=?false;
}
}
}
以上就是對(duì)Java Socket線程的詳細(xì)介紹。這就是程序運(yùn)行后,多用戶登陸并且輸入信息后的屏幕。實(shí)現(xiàn)了信息的實(shí)時(shí)廣播。用戶輸入"l"就可以列出在線人員表。
Java Socket編程
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。