真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

黑馬程序員——網(wǎng)絡(luò)編程篇

------- android培訓(xùn)、java培訓(xùn)、期待與您交流! ----------

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的仙游網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

概述

     1、網(wǎng)絡(luò)模型
       (1)、OSI參考模型
       (2)、TCP/IP參考模型
  2、網(wǎng)絡(luò)通訊要素
        (1)、IP地址
       (2)、端口號(hào)
        (3)、傳輸協(xié)議
   3、過程
       1,找到對(duì)方IP。

       2,數(shù)據(jù)要發(fā)送到對(duì)方指定的應(yīng)用程序上。為了標(biāo)識(shí)這些應(yīng)用程序,所以給這些網(wǎng)絡(luò)應(yīng)用程序都用數(shù)字進(jìn)行標(biāo)識(shí)。

       為了方便稱呼這個(gè)數(shù)據(jù),叫做端口(邏輯端口);

       3,定義通信規(guī)則。這個(gè)通訊規(guī)則稱為協(xié)議。

       國際組織定義了通用協(xié)議TCP/IP

       端口范圍:0~65535

       0~1024一般都被系統(tǒng)預(yù)定的

   常見端口:

       web服務(wù)默認(rèn)端口80

       Tomcat默認(rèn)端口8080

       MySQL默認(rèn)端口3306

--------------------------------------------------

數(shù)據(jù)模型

        OSI數(shù)據(jù)模型     TCP/IP參考模型

       ----------------------------

          應(yīng)用層    |

       -------------

          表示層    |    應(yīng)用層

       -------------

          會(huì)話層    |

       ----------------------------

          傳輸層    |    傳輸層            TCP/UDP

       ----------------------------

          網(wǎng)絡(luò)層    |    網(wǎng)際層            IP地址協(xié)議

       ----------------------------

        數(shù)據(jù)鏈路層  |

       -------------  主機(jī)至網(wǎng)絡(luò)層

          物理層    |

       ----------------------------

-----------------------------------------------------------

IP地址
       1、IP地址
           (1)、網(wǎng)絡(luò)中設(shè)備的標(biāo)識(shí)
           (2)、不易記憶,可用主機(jī)名
           (3)、本地回環(huán)地址:127.0.0.1 主機(jī)名:localhost
      2、端口號(hào)
           (1)、用于標(biāo)識(shí)進(jìn)程的邏輯地址,不同進(jìn)程的標(biāo)識(shí)
           (2)、有效端口:0~65535,其中0~1024系統(tǒng)使用或保留端口
       3、傳輸協(xié)議
           (1)、通訊的規(guī)則
           (2)、常見協(xié)議:TCP,UDP
       static InetAddress getLocalHost() 返回本地主機(jī)。
       String getHostAddress() 返回 IP 地址字符串(以文本表現(xiàn)形式)。
       String getHostName() 獲取此 IP 地址的主機(jī)名。

       static InetAddress getByName(String host) 在給定主機(jī)名的情況下確定主機(jī)的 IP 地址。

----------------------------------------------------------

UDP和TCP

   UDP

       1、面向無連接。

       2、將數(shù)據(jù)及源和目的封裝成數(shù)據(jù)包中,不需要建立連接。每個(gè)數(shù)據(jù)包的大小限制在64K內(nèi)。

       3,因?yàn)闊o連接,是不可靠協(xié)議。

       4,不需要建立連接,速度快。

       例子:聊天軟件。視頻會(huì)議。只追求速度,即便丟失部分?jǐn)?shù)據(jù)無傷大雅。

   TCP

       建立連接,形成傳輸數(shù)據(jù)的通道。

       在連接中進(jìn)行大數(shù)據(jù)量傳輸。

       通過三次握手完成連接,是可靠協(xié)議。

       必須建立連接,效率會(huì)稍低。

--------------------------------------------------------------------------

Socket服務(wù)

       1、Socket就是為網(wǎng)絡(luò)服務(wù)提供的一種機(jī)制
       2、通信的兩端都有Socket
       3、網(wǎng)絡(luò)通信其實(shí)就是Soket間的通信
       4、數(shù)據(jù)在兩個(gè)Socket間通過IO傳輸

---------------------------------------------------------------------------------------------------

UDP發(fā)送端和接收端

import java.net.*;
/*
需求:通過udp傳輸方式,將一段文字?jǐn)?shù)據(jù)發(fā)送出去。
定義一個(gè)udp發(fā)送端。
思路:
1,建立udpsocket服務(wù)。
2,提供數(shù)據(jù),并將數(shù)據(jù)封裝到數(shù)據(jù)包中。
3,通過socket服務(wù)的發(fā)送功能,將數(shù)據(jù)包發(fā)送出去。
4,關(guān)閉資源。
*/
class UdpSend
{
    public static void main(String[] args) throws Exception
    {
        //1,創(chuàng)建udp服務(wù),通過DatagramScket對(duì)象。
        DatagramSocket ds = new DatagramSocket();
        //2。確定數(shù)據(jù),并封裝成數(shù)據(jù)包。
        byte[] data = "udp ge men lai le".getBytes();
        DatagramPacket dp =
                    //數(shù)據(jù)包數(shù)組    //長度     //目的地址。                         //目的端口號(hào)
            new DatagramPacket(data,data.length,InetAddress.getByName("10.182.177.226"),1000);
        //3,通過socket服務(wù),將已有的數(shù)據(jù)包發(fā)送出去,通過send方法。
        ds.send(dp);
        //關(guān)閉資源。
        ds.close();
    }
}
/*
需求:
定義一個(gè)應(yīng)用程序,用于接收udp協(xié)議傳輸?shù)臄?shù)據(jù)并處理。
定義udp的接收端。
思路:
1,定義udpsocket服務(wù)。通常會(huì)監(jiān)聽一個(gè)端口。其實(shí)就是給這個(gè)接受網(wǎng)絡(luò)應(yīng)用程序定義數(shù)字標(biāo)識(shí)。
    方便于明確哪些數(shù)據(jù)過來改應(yīng)用程序可以處理。
2,定義一個(gè)數(shù)據(jù)包(沒有數(shù)據(jù)),因?yàn)橐鎯?chǔ)接受到的字節(jié)數(shù)據(jù),因?yàn)閿?shù)據(jù)包對(duì)象中有更多功能可以提前字節(jié)數(shù)據(jù)中的不同數(shù)據(jù)信息。
3,通過socket服務(wù)的receive方法將接受到的數(shù)據(jù)存入定義好的數(shù)據(jù)包中。
4,通過數(shù)據(jù)包對(duì)象的特有功能,將這些不同的數(shù)據(jù)取出,打印在控制臺(tái)上。
5,關(guān)閉資源。
*/
class UdpRece
{
    public static void main(String[] args) throws Exception
    {
        //1,創(chuàng)建udp socket,建立端點(diǎn)。
        DatagramSocket ds = new DatagramSocket(10000);
        while(true)
        {
            //2,定義數(shù)據(jù)包,用于存儲(chǔ)數(shù)據(jù)。
            byte[] buf = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf,buf.length);
            //3,通過服務(wù)的receive方法將接受到的數(shù)據(jù)存入數(shù)據(jù)包中。
            ds.receive(dp);
            //4,通過數(shù)據(jù)包的方法獲取其中的數(shù)據(jù)。
            String ip = dp,getAddress().getHostAddress();
            String data = new String(dp.getData(),0,dp.getLength());
            int port = dp.getPort();
            System.out.println(ip+":"+data+";"+port);
        }
        //關(guān)閉資源。
        //ds.close();
    }
}

---------------------------------------------------------------------------

UDP-使用鍵盤錄入方式傳輸數(shù)據(jù)。

import java.net.*;
import java.io.*;
class UdpSend2
{
    public static void main(String[] args) throws Exception
    {
        //創(chuàng)建UDP服務(wù)。
        DatagramSocket ds = new DatagramSocket();
        //鍵盤錄入。
        BufferedReader bufr =
            new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while((line = bufr.readLine())!=null)
        {
            if("over" .equals(line))//判斷結(jié)束標(biāo)記
                break;
            byte[] buf = line.getBytes();
            //定義用于發(fā)送的數(shù)據(jù)報(bào)包,將數(shù)據(jù)發(fā)送端指定的主機(jī)的端口上。
            DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);
            ds.send(dp);
        }
        ds.close();
    }
}
class UdpRece2
{
    public static void main(String[] args)throws Exception
    {
        //創(chuàng)建udp服務(wù),并指定端口。
        DatagramSocket ds = new DatagramSocket(10001);
        while (true)
        {
            byte[] buf = new byte[1024];//定義容器,存儲(chǔ)數(shù)據(jù)。
            //定義用于接收的數(shù)據(jù)報(bào)包。
            DatagramPacket dp = new DatagramPacket(buf,buf.length);
            //接受數(shù)據(jù)報(bào)包。
            ds.receive(dp);
            String ip = dp.getAddress().getHostAddress();
            String data = new String(dp.getData(),0,dp.getLength());
            System.out.println(ip+":"+data);
        }
                                                                                                                                                  
    }
}

--------------------------------------------------------------------------

UDP-聊天程序

/*
編寫一個(gè)聊天程序。
有收數(shù)據(jù)的部分,和發(fā)數(shù)據(jù)的部分。
這兩部分需要同時(shí)執(zhí)行。
那就需要用到多線程技術(shù)。
一個(gè)線程控制收,一個(gè)線程控制發(fā)。
因?yàn)槭蘸桶l(fā)動(dòng)作是不一致的,所以要定義兩個(gè)run方法。
而且這兩個(gè)方法要封裝到不同的類中。
*/
import java.net.*;
import java.io.*;
class Send implements Runnable
{
    private DatagramSocket ds;
    public Send(DatagramSocket ds)
    {
        this.ds = ds;
    }
    public void run()
    {
        try
        {
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while ((line = bufr.readLine())!=null)
            {
                if("over".equals(line))
                    break;
                byte[] buf = line.getBytes();
                DatagramPacket dp =
                    new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10002);
                ds.send(dp);
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException("發(fā)送失敗");
        }
                                                                                                                                      
    }
}
class Rece implements Runnable
{
    private DatagramSocket ds;
    public Rece(DatagramSocket ds)
    {
        this.ds = ds;
    }
    public void run()
    {
        try
        {
            while (true)
            {
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                ds.receive(dp);
                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(),0,dp.getLength());
                System.out.println(ip+":"+data);
            }
        }
        catch (Exception e)
        {
            throw new RuntimeException("接受失敗");
        }
                                                                                                                                      
                                                                                                                                      
    }
}
class ChatDemo
{
    public static void main(String[] args) throws Exception
    {
        DatagramSocket sendSocket = new DatagramSocket();
        DatagramSocket receSocket = new DatagramSocket(10002);
        new Thread(new Send(sendSocket)).start();
        new Thread(new Rece(receSocket)).start();
    }
}

---------------------------------------------------------

TCP-服務(wù)端和客戶端

/*
演示tcp傳輸。
1,tcp分客戶端和服務(wù)端。
2,客戶端對(duì)應(yīng)的對(duì)象時(shí)Socket。
    服務(wù)端對(duì)應(yīng)的對(duì)象時(shí)ServerSocket。
*/
/*
客戶端
通過查閱socket對(duì)象,發(fā)現(xiàn)在該對(duì)象建立時(shí),就可以去連接指定主機(jī)。
因?yàn)閠cp是面向連接的。所以在建立socket服務(wù)時(shí),
就要有服務(wù)端操作,并連接成功。形成通路后,在該通道進(jìn)行數(shù)據(jù)的傳輸。
需求:給服務(wù)端發(fā)生一個(gè)文本數(shù)據(jù)。
步驟:
1,創(chuàng)建socket訪問,并指定要連接的主機(jī)和端口。
*/
import java.io.*;
import java.net.*;
class TcpClient
{
    public static void main(String[] args) throws Exception
    {
        //創(chuàng)建客戶端的socket服務(wù),指定目的主機(jī)和端口。
        Socket s = new Socket("127.0.0.1",10003);
                                                                                                                             
        //為了發(fā)送數(shù)據(jù),應(yīng)該獲取socket流中的輸入流。
        OutputStream os = s.getOutputStream();
        os.write("tcp ge men lai le".getBytes());
        s.close();
    }
}
/*
需求:定義端點(diǎn)接受數(shù)據(jù)并打印在控制臺(tái)上。
服務(wù)端:
1,建立服務(wù)端的socket服務(wù),SeverSocket();
    并監(jiān)聽一個(gè)端口。
2,獲取連接過來的客戶端對(duì)象。
    通過ServerSocket的accept方法。沒有連接就會(huì)等,所以這個(gè)方法時(shí)阻塞式的。
3,客戶端如果發(fā)過來數(shù)據(jù),那么服務(wù)端要使用對(duì)應(yīng)的客戶端對(duì)象,并獲取到該客戶端對(duì)象的讀取流來讀取發(fā)過來的數(shù)據(jù)。
    并打印在控制臺(tái)。
4,關(guān)閉服務(wù)器.(可選)
*/
class TcpServer
{
    public static void main(String[] args) throws Exception
    {
        //建立服務(wù)端socket服務(wù),并監(jiān)聽一個(gè)端口。
        ServerSocket ss = new ServerSocket(10003);
        //通過accept方法獲取連接過來的客戶端對(duì)象。
        Socket s = ss.accept();
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"---connected");
        //獲取客戶端發(fā)送過來的數(shù)據(jù),那么要使用客戶端對(duì)象的讀取流來讀取數(shù)據(jù)。
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
                                                                                                                             
        System.out.println(new String(buf,0,len));
        s.close();
        ss.close();
    }
}

------------------------------------------------------------------------------

TCP--客戶端與服務(wù)端的互訪

import java.io.*;
import java.net.*;
/*
演示tcp的傳輸?shù)目蛻舳撕头?wù)端的互訪。
需求:客戶端給服務(wù)端發(fā)生數(shù)據(jù),服務(wù)端收到后,給剛看的反饋信息。
*/
/*
客戶端:
1,建立socket服務(wù)。指定要連接主機(jī)和端口。
2,獲取socket流中的輸出流,將數(shù)據(jù)寫到該流中。通過網(wǎng)絡(luò)發(fā)送給服務(wù)端。
3,獲取socket流中的輸入流,將服務(wù)端反饋的數(shù)據(jù)獲取到,并打印。
4,關(guān)閉客戶端資源。
*/
class TcpClient2
{
    public static void main(String[] args) throws Exception
    {
        Socket s = new Socket("127.0.0.1",10004);
        OutputStream out = s.getOutputStream();
        out.write("服務(wù)端,你好".getBytes());
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        System.out.println(new String(buf,0,len));
        s.close();
    }
}
class  TcpServer2
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(10004);
        Socket s = ss.accept();
                                                                                                                  
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"---connect");
        InputStream in =s.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        System.out.println(new String(buf,0,len));
        OutputStream out = s.getOutputStream();
        out.write("收到,哥們你也好".getBytes());
                                                                                                                  
        s.close();
        ss.close();
    }
}

-----------------------------------------------------------------

TCP練習(xí)——實(shí)現(xiàn)服務(wù)端的文本轉(zhuǎn)換

/*
需求:建立一個(gè)文本轉(zhuǎn)換服務(wù)器。
客戶端給服務(wù)端發(fā)送文本,服務(wù)端會(huì)將文本轉(zhuǎn)成大寫再返回給客戶端。
而且客戶端可以不斷的進(jìn)行文本轉(zhuǎn)換。當(dāng)客戶端輸入over時(shí),轉(zhuǎn)換結(jié)束。
分析:
客戶端:
既然是操作設(shè)備上的數(shù)據(jù),就可以使用io技術(shù),并按照io的操作規(guī)律來思考。
源:鍵盤錄入。
目的:網(wǎng)絡(luò)設(shè)備,網(wǎng)絡(luò)輸出流。而且操作的文本數(shù)據(jù)??梢赃x擇字符流。
步驟:
1,建立服務(wù)。
2,獲取鍵盤錄入。
3,將數(shù)據(jù)發(fā)送給服務(wù)端。
4,獲取服務(wù)端返回的大寫數(shù)據(jù)。
5,結(jié)束。關(guān)閉資源。
*/
import java.io.*;
import java.net.*;
class  TransClient
{
    public static void main(String[] args) throws Exception
    {
                                                                                                           
        Socket s = new Socket("127.0.0.1",10005);
                                                                                                           
        //定義讀取鍵盤數(shù)據(jù)的流對(duì)象。
        BufferedReader bufr =
            new BufferedReader(new InputStreamReader(System.in));
                                                                                                               
        //定義目的,將數(shù)據(jù)寫入到socket輸入流,發(fā)給服務(wù)端。
        //BufferedWriter bufOut =
            //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
                                                                                                           
        //定義一個(gè)socket讀取流,讀取服務(wù)端返回的大寫信息。
        BufferedReader bufIn =
            new BufferedReader(new InputStreamReader(s.getInputStream()));
                                                                                                               
        String line = null;
                                                                                                               
        while ((line=bufr.readLine())!=null)
        {
            if("over".equals(line))
                break;
            out.println(line);
            //bufOut.write(line);
            //bufOut.newLine();
            //bufOut.flush();
            String str = bufIn.readLine();
            System.out.println("server:"+str);
        }  
        bufr.close();
        s.close();
                                                                                                           
    }
}
/*
服務(wù)端:
獲取socket對(duì)象。
源:socket讀取流。               
目的:serversocket輸出流。    
*/
class  TransServer
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(10005);
                                                                                                           
        Socket s = ss.accept();
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"-----connected");
        //讀取socket讀取流中的數(shù)據(jù)。
        BufferedReader bufIn =
            new BufferedReader(new InputStreamReader(s.getInputStream()));
                                                                                                           
        //目的。socket輸出流。將大寫數(shù)據(jù)寫入到socket輸出流,并發(fā)生個(gè)客戶端。
        //BufferedWriter bufOut =
            //new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        String line = null;
        while ((line=bufIn.readLine())!=null)
        {
            System.out.println(line);
            out.println(line.toUpperCase());
            //bufOut.write(line.toUpperCase());
            //bufOut.newLine();
            //bufOut.flush();
                                                                                                               
        }
        s.close();
        ss.close();
    }
}
/*
該例子出現(xiàn)的問題。
出現(xiàn):客戶端和服務(wù)端都在莫名等等等。
為什么呢?
因?yàn)榭蛻舳撕蚮ws都有阻塞式的方法。這些方法沒有讀到結(jié)束標(biāo)記。那么就一直等。
而導(dǎo)致兩端,都在等待。
*/

----------------------------------------------------------------------------

TCP——上傳文本

import java.io.*;
import java.net.*;
class TextClient
{
    public static void main(String[] args) throws Exception
    {
                                                                                              
        Socket s = new Socket("127.0.0.1",10006);
                                                                                                      
        BufferedReader bufr = new BufferedReader(new FileReader("IpDemo.java"));
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        String line = null;
        while ((line=bufr.readLine())!=null)
        {
            out.println(line);
        }
        s.shotdownOutput();//關(guān)閉客戶端的輸出流,相當(dāng)于給流中加入一個(gè)結(jié)束標(biāo)記。
        BufferedReader bufIn  = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str = bufIn.readLine();
        System.out.println(str);
        bufr.close();
        s.close();
    }
}
class  TextServer
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(10006);
        Socket s = ss.accept();
                                                                                              
        String ip = s.getInetAddress().getHostAddress();
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter out = new PrintWriter(new FileWriter("server.txt"),true);
        String line = null;
        while((line=bufIn.readLine())!=null)
        {          
            out.println(line);
        }
        PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
        pw.println("上傳成功");
    }
}

------------------------------------------------------

TCP--多客戶端并發(fā)上傳圖片

/*
需求:上傳圖片。
*/
/*
客戶端
1,服務(wù)端點(diǎn)。
2,讀取客戶端已有的數(shù)據(jù)。
3,通過socket輸出流發(fā)給服務(wù)端。
4,讀取服務(wù)端反饋信息。
5,關(guān)閉。
*/
import java.net.*;
import java.io.*;
class  PicClient
{
    public static void main(String[] args) throws Exception
    {
                                                                                     
        Socket s = new Socket("127.0.0.1",10007);
        FileInputStream fis = new FileInputStream(file);
        OutputStream out = s.getOutputStream();
        byte[] buf = new byte[1024];
        int len =0;
        while ((len=fis.read(buf))!=-1)
        {
            out.write(buf,0,len);
        }
        s.shutdownOutput();
        InputStream in = s.getInputStream();
        byte[] bufIn = new byte[1024];
        int num = in.read(bufIn);
        System.out.println(new String(bufIn,0,num));
        fis.close();
        s.close();
    }
}
/*
服務(wù)端
這個(gè)服務(wù)端有個(gè)局限性,當(dāng)A客戶端連接上以后,被服務(wù)端獲取到,服務(wù)端執(zhí)行具體流程。
這時(shí)B客戶端連接,只有等待。
因?yàn)榉?wù)端還沒有處理完A客戶端的請(qǐng)求,還沒有循環(huán)回來執(zhí)行下次accpet方法。
所以,暫時(shí)獲取不到B客戶端對(duì)象。
為了可以讓多個(gè)客戶端同時(shí)并發(fā)訪問服務(wù)端。
那么服務(wù)端最好就是將沒有客戶端封裝到一個(gè)單獨(dú)的線程中,這樣,就可以同時(shí)處理多個(gè)客戶端請(qǐng)求。
如何定義線程呢?
只有明確了每一個(gè)客戶端要在服務(wù)端執(zhí)行的代碼即可。將該代碼存入run方法中。
*/
class PicThread implements Runnable
{
    private Socket s;
    PicThread(Socket s)
    {
        this.s = s;
    }
    public void run()
    {
        int count =1;
        String ip = s.getInetAddress().getHostAddress();
        try
        {
            System.out.println(ip+"----connect");
            InputStream in = s.getInputStream();
                                                                                         
            File file = new File(ip+"("+(count)+").jpg");
            while (file.exists())
            {
                file = new File(ip+"("+(count++)+").jpg");
            }
                                                                                         
                                                                                         
            FileOutputStream fos = new FileOutputStream(file);
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len=in.read(buf))!=-1)
            {
                fos.write(buf,0,len);
            }
            OutputStream out = s.getOutputStream();
            out.write("上傳成功".getBytes());
            fos.close();
            s.close();
        }
        catch (Exception e)
        {
            throw new RuntimeException(ip+"上傳失敗");
        }
    }
}
class  PicServer
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(10007);
        while (true)
        {
            Socket s = ss.accept();
            new Thread(new PicThread(s)).start();
        }
        //ss.close();
    }
}

-------------------------------------------------------------

TCP——模擬用戶登陸

/*
客戶端通過鍵盤錄入用戶名。
服務(wù)端對(duì)這個(gè)用戶名進(jìn)行校驗(yàn)。
如果該用戶存在,在服務(wù)端顯示xxx,已登錄。
并在客戶端顯示  xxx,歡迎光臨。
如果該用處不存在,在服務(wù)端顯示xxx,嘗試登陸。
并在客戶端顯示 xxx,該用戶不存在。
最多就登陸三次。
*/
import java.net.*;
import java.io.*;
class  LoginClient
{
    public static void main(String[] args) throws Exception
    {
        Socket s = new Socket("127.0.0.1",10008);
        BufferedReader bufr =
            new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
        for (int x=0;x<3 ;x++ )
        {
            String line = bufr.readLine();
            if(line==null)
                break;
            out.println(line);
                                                                              
            String info = bufIn.readLine();
            System.out.println("info:"+info);
            if(info.contains("歡迎"))
                break;
        }
        bufr.close();
        s.close();
    }
}
class UserThread implements Runnable
{
    private Socket s;
    UserThread(Socket s)
    {
        this.s = s;
    }
    public void run()
    {
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"----------connected");
        try
        {
            for(int x =0;x<3;x++)
            {
                BufferedReader bufIn =
                    new BufferedReader(new InputStreamReader(s.getInputStream()));
                                                                                  
                String name = bufIn.readLine();
                if(name==null)
                    break;
                BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
                                                                                  
                PrintWriter out = new PrintWriter(s.getOutputStream(),true);
                String line = null;
                boolean flag = false;
                while ((line=bufr.readLine())!=null)
                {
                    if (line.equals(name))
                    {
                        flag =true;
                        break;
                    }
                }
                if (flag)
                {
                    System.out.println(name+",已登錄");
                    out.println(name+",歡迎光臨");
                    break;
                }
                else
                {
                    System.out.println(name+",嘗試登陸");
                    out.println(name+",用戶名不存在");
                }
            }
            s.close();
        }
        catch (Exception e)
        {
            throw new RuntimeException(ip+"校驗(yàn)失敗");
        }
    }
}
class  LoginServer
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(10008);
        while (true)
        {
            Socket s = ss.accept();
            new Thread(new UserThread(s)).start();
        }
    }
}

-------------------------------------------------------------------------

自定義客戶端(服務(wù)端—Tomcat;客戶端-瀏覽器)

/*
演示客戶端和服務(wù)端。
1,客戶端:瀏覽器
  服務(wù)端:自定義
2,客戶端:瀏覽器
  服務(wù)端:Tomcat服務(wù)器。
*/
import java.net.*;
import java.io.*;
class ServerDemo
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss = new ServerSocket(11000);
        Socket s = ss.accept();
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"----connected");
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        System.out.println(new String (buf,0,len));
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        out.println("客戶端你好");
        s.close();
        ss.close();
    }
}

自定義圖形化界面瀏覽器

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class  MyIEByGUI
{
    private Frame f;
    private Button but;
    private TextField tf;
    private TextArea ta;
                                           
    private Dialog d;//什么時(shí)候出錯(cuò)什么時(shí)候創(chuàng)建對(duì)象。放在這里只是便于閱讀。
    private Label lab;
    private Button okBut;
    MyIEByGUI()
    {
        init();
    }
    public void init()
    {
        f = new Frame("My Window");
        f.setBounds(300,100,500,400);
        f.setLayout(new FlowLayout());
        d = new Dialog(f,"提示信息-self",true);//模式為true時(shí),后面的窗體不能操作。
        d.setBounds(400,200,240,150);
        d.setLayout(new FlowLayout());
        lab = new Label();
        okBut = new Button("確定");
                                               
        d.add(lab);
        d.add(okBut);
        tf = new TextField(40);
        but = new Button("轉(zhuǎn)到");
        ta = new TextArea(20,60);//20行,60列
                                               
                                               
        f.add(tf);//注意,因?yàn)榱魇讲季?,所以按順序添加?        f.add(but);
        f.add(ta);
        myEvent();
        f.setVisible(true);
    }
    private void myEvent()
    {
        d.addWindowListener(new WindowAdapter()
        {
            public void windowCloing(WindowEvent e)
            {
                d.setVisible(false);//不需要關(guān)閉。
            }
                                               
        });
        okBut.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                d.setVisible(false);
            }
                                               
        });
        tf.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode()==KeyEvent.VK_ENTER)
                    showDir();
            }
        });
        but.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                showDir();
            }
        });
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });    
    }
    private void showDir()
    {
        String url = tf.getText();
        int index1 = url.indexof("http://")+2;
        int index2 = url.indexof("/",index1);
        String str = url.substring(index1,index2);
        String path = url.substring(index2);
        ta.setText();
    }      
    public static void main(String[] args)
    {
        new MyIEByGUI();
    }
}

--------------------------------------------------------------------

URL

   1.創(chuàng)建URL類

   URL類的構(gòu)造方法主要有如下幾種

       URL(String spec):使用指定的字符串構(gòu)建。

       URL(String protocol, String host, int port, String file):使用指定的協(xié)議、主機(jī)名、端口號(hào)、文件名創(chuàng)建。

       URL(String protocol, String host, String file):使用指定的協(xié)議、主機(jī)名、文件名創(chuàng)建。

       URL(URL context, String spec):使用基地址和相對(duì)URL創(chuàng)建。

import java.net.*;
import java.io.*;
class URLConnectionDemo
{
    public static void main(String[] args) throws Exception
    {
        URL url = new URL("http://127.0.0.1:8080/myweb/demo.html?name=lisi&age=30");
        URLConnection conn = url.openConnection();
                         
        System.out.println(conn);
        InputStream in =conn.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        System.out.println(new String(buf,0,len));
    }
}

   2、常用方法

        String getFile()

                 獲取此 URL 的文件名。

        String getHost()

                 獲取此 URL 的主機(jī)名(如果適用)。

        String getPath()

                 獲取此 URL 的路徑部分。

        int getPort()

                 獲取此 URL 的端口號(hào)。

        String getProtocol()

                 獲取此 URL 的協(xié)議名稱。

        String getQuery()

                 獲取此 URL 的查詢部分

import java.net.*;
class URLDemo
{
    public static void main(String[] args) throws MalformedURLException
    {
        URL url = new URL("http://127.0.0.1:8080/myweb/demo.html?name=lisi&age=30");
        System.out.println("getProtocol() :"+url.getProtocol() );//獲取協(xié)議
        System.out.println("getHost() :"+url.getHost() );//獲取主機(jī)信息
        System.out.println("getPort() :"+url.getPort() );//獲取端口信息。
        System.out.println("getPath() :"+url.getPath() );//路徑
        System.out.println("getFile() :"+url.getFile() );//文件
        System.out.println("getQuery() :"+url.getQuery() );//獲取此 URL 的查詢部分,即name=lisi&age=30
    }
}

分享文章:黑馬程序員——網(wǎng)絡(luò)編程篇
文章來源:http://weahome.cn/article/ggoiis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部