• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            Java Socket編程簡(jiǎn)捷學(xué)習(xí)過(guò)程

              第一步 充分理解Socket

              1.什么是socket

              所謂socket通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過(guò)"套接字"向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。

              以J2SDK-1.3為例,SocketServerSocket類庫(kù)位于java.net包中。ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò)連接時(shí)使用的。在連接成功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì)話。對(duì)于一個(gè)網(wǎng)絡(luò)連接來(lái)說(shuō),套接字是平等的,并沒(méi)有差別,不因?yàn)樵诜?wù)器端或在客戶端而產(chǎn)生不同級(jí)別。不管是Socket還是ServerSocket它們的工作都是通過(guò)SocketImpl類及其子類完成的。

              重要的Socket API

              java.net.Socket繼承于java.lang.Object,有八個(gè)構(gòu)造器,其方法并不多,下面介紹使用最頻繁的三個(gè)方法,其它方法大家可以見(jiàn)JDK-1.3文檔。

              . Accept方法用于產(chǎn)生"阻塞",直到接受到一個(gè)連接,并且返回一個(gè)客戶端的Socket對(duì)象實(shí)例。"阻塞"是一個(gè)術(shù)語(yǔ),它使程序運(yùn)行暫時(shí)"停留"在這個(gè)地方,直到一個(gè)會(huì)話產(chǎn)生,然后程序繼續(xù);通常"阻塞"是由循環(huán)產(chǎn)生的。

              . getInputStream方法獲得網(wǎng)絡(luò)連接輸入,同時(shí)返回一個(gè)IutputStream對(duì)象實(shí)例,。

              . getOutputStream方法連接的另一端將得到輸入,同時(shí)返回一個(gè)OutputStream對(duì)象實(shí)例。

              注意:其中getInputStreamgetOutputStream方法均會(huì)產(chǎn)生一個(gè)IOException,它必須被捕獲,因?yàn)樗鼈兎祷氐牧鲗?duì)象,通常都會(huì)被另一個(gè)流對(duì)象使用。

              2.如何開(kāi)發(fā)一個(gè)Server-Client模型的程序

              開(kāi)發(fā)原理:

              服務(wù)器,使用ServerSocket監(jiān)聽(tīng)指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接。

              客戶端,使用Socket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,打開(kāi)會(huì)話;會(huì)話完成后,關(guān)閉Socket。客戶端不需要指定打開(kāi)的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè)1024以上的端口。

              {建立服務(wù)器}

              import java.net.*;

              import java.io.*;

              public class Server

              {

              private ServerSocket ss;

              private Socket socket;

              private BufferedReader in;

              private PrintWriter out;

              public Server()

              {

              try

              {

              ss = new ServerSocket(10000);

              while (true)

              {

              socket = ss.accept();

              in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

              out = new PrintWriter(socket.getOutputStream(),true);

              String line = in.readLine();

              out.println("you input is :" + line);

              out.close();

              in.close();

              socket.close();

              }

              ss.close();

              }

              catch (IOException e)

              {}

              }

              public static void main(String[] args)

              {

              new Server();

              }

              }

              這個(gè)程序建立了一個(gè)服務(wù)器,它一直監(jiān)聽(tīng)10000端口,等待用戶連接。在建立連接后給客戶端返回一段信息,然后結(jié)束會(huì)話。這個(gè)程序一次只能接受一個(gè)客戶連接。

              {建立客戶端}

              import java.io.*;

              import java.net.*;

              public class Client

              {

              Socket socket;

              BufferedReader in;

              PrintWriter out;

              public Client()

              {

              try

              {

              socket = new Socket("xxx.xxx.xxx.xxx", 10000);

              in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

              out = new PrintWriter(socket.getOutputStream(),true);

              BufferedReader line = new BufferedReader(new InputStreamReader(System.in));

              out.println(line.readLine());

              line.close();

              out.close();

              in.close();

              socket.close();

              }

              catch (IOException e)

              {}

              }

              public static void main(String[] args)

              {

              new Client();

              }

              }

              這個(gè)客戶端連接到地址為xxx.xxx.xxx.xxx的服務(wù)器,端口為10000,并從鍵盤(pán)輸入一行信息,發(fā)送到服務(wù)器,然后接受服務(wù)器的返回信息,最后結(jié)束會(huì)話。

              第二步 多個(gè)客戶同時(shí)連接

              在實(shí)際的網(wǎng)絡(luò)環(huán)境里,同一時(shí)間只對(duì)一個(gè)用戶服務(wù)是不可行的。一個(gè)優(yōu)秀的網(wǎng)絡(luò)服務(wù)程序除了能處理用戶的輸入信息,還必須能夠同時(shí)響應(yīng)多個(gè)客戶端的連接請(qǐng)求。在java中,實(shí)現(xiàn)以上功能特點(diǎn)是非常容易的。

              設(shè)計(jì)原理:

              主程序監(jiān)聽(tīng)一端口,等待客戶接入;同時(shí)構(gòu)造一個(gè)線程類,準(zhǔn)備接管會(huì)話。當(dāng)一個(gè)Socket會(huì)話產(chǎn)生后,將這個(gè)會(huì)話交給線程處理,然后主程序繼續(xù)監(jiān)聽(tīng)。運(yùn)用Thread類或Runnable接口來(lái)實(shí)現(xiàn)是不錯(cuò)的辦法。

              {實(shí)現(xiàn)消息共享}

              import java.io.*;

              import java.net.*;

              public class Server extends ServerSocket

              {

              private static final int SERVER_PORT = 10000;

              public Server() throws IOException

              {

              super(SERVER_PORT);

              try

              {

              while (true)

              {

              Socket socket = accept();

              new CreateServerThread(socket);

              }

              }

              catch (IOException e)

              {}

              finally

              {

              close();

              }

              }

              //--- CreateServerThread

              class CreateServerThread extends Thread

              {

              private Socket client;

              private BufferedReader in;

              private PrintWriter out;

              public CreateServerThread(Socket s) throws IOException

              {

              client = s;

              in = new BufferedReader(new InputStreamReader(client.getInputStream(), "GB2312"));

              out = new PrintWriter(client.getOutputStream(), true);

              out.println("--- Welcome ---");

              start();

              }

              public void run()

              {

              try

              {

              String line = in.readLine();

              while (!line.equals("bye"))

              {

              String msg = createMessage(line);

              out.println(msg);

              line = in.readLine();

              }

              out.println("--- See you, bye! ---");

              client.close();

              }

              catch (IOException e)

              {}

              }

              private String createMessage(String line)

              {

              xxxxxxxxx;

              }

              }

              public static void main(String[] args) throws IOException

              {

              new Server();

              }

              }clip_image001

            posted on 2009-08-14 18:32 肥仔 閱讀(256) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Web-后臺(tái)

            久久久久av无码免费网| 久久99久久无码毛片一区二区| 热RE99久久精品国产66热| 久久久久国色AV免费看图片 | 久久久噜噜噜久久中文字幕色伊伊| 久久99热这里只有精品66| 2021久久精品国产99国产精品| 精品久久久久国产免费| 亚洲av成人无码久久精品| 久久成人18免费网站| 久久午夜伦鲁片免费无码| 久久九九久精品国产| 91精品国产综合久久精品| 亚洲欧美精品一区久久中文字幕 | 99久久99久久精品国产片果冻| 久久香蕉国产线看观看99| 模特私拍国产精品久久| 久久久久久久波多野结衣高潮| 久久国产精品成人影院| 一级做a爰片久久毛片免费陪| 国产亚洲精久久久久久无码| 久久只有这精品99| 亚洲国产成人久久综合野外| 国产一久久香蕉国产线看观看| 久久久久精品国产亚洲AV无码| 久久精品一区二区影院| 久久99国产亚洲高清观看首页 | 无码人妻久久一区二区三区| 久久久久久久久久免免费精品| 国产成人综合久久综合| 久久精品国产亚洲av日韩| 免费无码国产欧美久久18| 日韩中文久久| 伊人伊成久久人综合网777| 久久久久婷婷| 久久只有这里有精品4| 久久天天婷婷五月俺也去| 亚洲国产成人精品女人久久久| 精品无码久久久久久久动漫| 精品熟女少妇aⅴ免费久久| 日本加勒比久久精品|