Java收集編程之簡略的辦事端客戶端運用實例。本站提示廣大學習愛好者:(Java收集編程之簡略的辦事端客戶端運用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java收集編程之簡略的辦事端客戶端運用實例正文
本文實例講述了Java收集編程之簡略的辦事端客戶端運用。分享給年夜家供年夜家參考。詳細以下:
在Java中,我們應用java.net.Socket及其相干類來完成有關收集的相干功效。Socket類異常簡略易用,由於Java技巧隱蔽了樹立收集銜接和經由過程銜接發送數據的龐雜進程。上面所說的內容只實用於TCP協定。
1、銜接到辦事器
我們可使用Socket類的結構函數來翻開一個套接字,如
Socket sk = new Socket("210.0.235.14",13);
個中,210.0.235.14是一個點分十進制的String對象,表現目標主機的IP地址(或主機名), 13表現指定銜接目的主機的13端口。這裡的210.0.235.14是位於噴鼻港的一個授時辦事器,授時辦事器默許的端口普通都為13.
留意,在勝利銜接到辦事器之前,法式會壅塞。
接上去可使用Socket類的getInputStream()辦法來獲得一個InputStream對象,經由過程這個對象便可以獲得到目的主機給我們發過去的信息:
InputStream inStream = sk.getInputStream();
同理,要向目的主機發送數據,則可以挪用getOutputStream()辦法來獲得一個輸入流對象。
上面的例子功效是銜接授時辦事器,並將前往的信息打印到尺度輸入中:
try
{
Socket sk = new Socket("210.0.235.14",13);
sk.setSoTimeout(3000);
InputStream inStream = sk.getInputStream();
//獲得輸出流對象
Scanner sc = new Scanner(inStream);
//將數據打印到掌握台
while(sc.hasNextLine())
{
String str = sc.nextLine();
System.out.println("Output : " + str);
}
sk.close();
}
catch(SocketTimeoutException e) //超時異常
{
System.out.println("Time Out!");
}
catch(Exception e)
{
e.printStackTrace();
}
代碼中setSoTimeout()辦法可以設置超不時間,即假如跨越了設准時間還沒有完成讀寫操作,則會拋出SocketTimeoutException,可以經由過程捕捉這個異常來封閉銜接。
別的還有一個超時成績是必需要處理的,就是這個Socket類的結構函數
new Socket(host,port);
會一向無窮地壅塞下去,直到勝利樹立了到目的主機的銜接為止。這固然不是我們所願望的。我們可以經由過程以下挪用方法處理此成績:
Socket sk = new Socker(); sk.connect(new InetSocketAddress(host,port),2000); //設置超不時間為2秒
2、獲得主機地址
InetAddress類的靜態辦法getByName(hostname)可以前往代表了某個主機地址的InetAddress對象,這個對象關閉了一個4字節的序列,即主機的IP地址。然後再挪用getHostAddress()辦法前往一個表現IP地址的String對象.
一些拜訪量年夜的主機名平日會對應著多個IP地址以完成負載平衡。我們可以挪用getAllByName()辦法來取得一切主機地址,該辦法前往一個InetAddress對象的數組。
上面是一個簡略的小法式,完成的功效是,假如不在敕令行中設置參數,就打印出當地的IP地址,假如指定了主機名,則打印出該主機一切的IP地址:
package cls;
import java.net.*;
public class ShowIP
{
public static void main(String[] args)
{
try
{
if(args.length > 0)
{
String hostName = args[0]; //主機名
InetAddress[] addr = InetAddress.getAllByName(hostName);
//獲得該主機的一切地址
//打印輸入至掌握台
for(InetAddress address : addr)
{
System.out.println(address.getHostAddress());
}
}
else
{
System.out.println(InetAddress.getLocalHost().getHostAddress());
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
3、辦事器端法式
辦事器端運用法式應用ServerSocket類來創立套接字,並钭其綁定至當地端口中,如
ServerSocket sock = new ServerSocker(8000);
sock.accept()辦法讓法式一直地期待銜接,該辦法只要當有客戶端銜接時才會前往一個代表了新銜接的Socket對象,即該辦法會產生壅塞。
這裡普通要為每一個銜接新開啟一個線程為其辦事。
上面是一個完全的例子,辦事端在8400端口處期待銜接,每當銜接到來時,新開一個線程為其辦事,並將銜接信息寫入的日記文件中:
package cls;
import java.io.*;
import java.net.*;
import java.util.*;
public class ServerDemo
{
/**
* @param args
*/
public static void main(String[] args)
{
try
{
//ServerSocket servSocket = new ServerSocket(8000);
ServerSocket servSocket = new ServerSocket(8400);
int amount = 0;
while(true)
{
Socket client = servSocket.accept();
++amount;
Date time = new Date();
String prompt = time.toString() + ": 第" + amount + "個用戶 " + client.getInetAddress().getHostAddress() + " 已銜接\n";
System.out.print(prompt); //在掌握台輸入信息
ServerDemo.writeLog(prompt); //寫入到文件中
//start a new Thread
Thread th = new Thread(new ServThread(client,amount));
th.start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
//寫入日記文件
public static void writeLog(String str)
{
File logFile = new File("server-log.txt");
try
{
FileWriter out = new FileWriter(logFile,true);
out.append(str);
out.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
/*
* 辦事線程類
*/
class ServThread implements Runnable
{
private Socket client;
private int ix;
public ServThread(Socket soc,int ix)
{
client = soc;
this.ix = ix;
}
public void run()
{
try
{
InputStream inStream = client.getInputStream();
OutputStream outStream = client.getOutputStream();
Scanner recv = new Scanner(inStream);
PrintWriter send = new PrintWriter(outStream,true);
send.println("迎接~隨意聊幾句吧![輸出'bye'封閉聯接]");
while(recv.hasNextLine())
{
String str = recv.nextLine();
if(str.equals("bye"))
{
send.println("See you later ~ ^-^");
break;
}
send.println("這是個測試法式,如今還沒有甚麼功效哦");
}
Date time = new Date();
String prompt = time.toString() + ": 第" + ix + "個用戶 " + client.getInetAddress().getHostAddress() + " 已斷開銜接\n";
System.out.print(prompt);
ServerDemo.writeLog(prompt); //寫入到文件中
client.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
這個法式曾經被放到了辦事器上,年夜家可使用telnet youthol.tk 8400 敕令來體驗一下這個法式的運轉成果
願望本文所述對年夜家的java法式設計有所贊助。