黑马程序员---java基础-Java之网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、概念

网络通信三要素:IP地址,端口号,传输协议

 

IP地址:

它是网络中的设备标识,java中对应的是InetAddress类,存在于java.net包中。

 

端口号:

        a、用于标识进程的逻辑地址,不用进程的标识。

        b、有效端口:0 ~65535,系统使用或保留的端口是:0~ 1024

 

传输协议:

        即通信规则,包含TCPUDP协议

 

二、Socket

套接字,通信的端点。

就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

示例:

 1 public class NetDemo {

 2     public static void main(String[] args) throws Exception {

 3         Socket s = new Socket("www.baidu.com", 8080);

 4         BufferedReader br = new BufferedReader(new InputStreamReader(

 5                 s.getInputStream()));

 6         String line;

 7         while ((line = br.readLine()) != null) {

 8             System.out.println(line);

 9         }

10     }

11 }

 

三、TCP传输

两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。

tcp的两个端点:

 

一个是客户端,一个是服务端。

客户端:对应的对象,Socket

服务端:对应的对象,ServerSocket

TCP客户端:

1,建立tcpsocket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)

2,如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStreamgetOutputStream就可以获取两个流对象。

3,关闭资源。

TCP服务端:

 

1,创建服务端socket服务,并监听一个端口。

2,服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象。

3,可以通过获取到的socket对象中的socket流和具体的客户端进行通讯。

4,如果通讯结束,关闭资源。注意:要先关客户端,再关服务端。

 

tcp客户端

 1 public class TcpClient {

 2     public static void main(String[] args) throws Exception {

 3         Socket s;

 4         s = new Socket("127.0.0.1", 1000);

 5         OutputStream os = s.getOutputStream();

 6         os.write("你好".getBytes());

 7         InputStream is = s.getInputStream();

 8         byte[] buff = new byte[1024];

 9         int len;

10         len = is.read(buff);

11         System.out.println(new String(buff, 0, len));

12         s.close();

13     }

14 }

 

tcp服务端

public class TcpServer {

    public static void main(String[] args) throws Exception {

        ServerSocket ss = new ServerSocket(1000);

        Socket s = ss.accept();

        String ip = s.getInetAddress().getHostAddress();

        System.out.println(ip + "is connected");

        InputStream is = s.getInputStream();

        byte[] buff = new byte[1024];

        int len = is.read(buff);

        System.out.println(new String(buff, 0, len));

        OutputStream os = s.getOutputStream();

        os.write("已收到".getBytes());

        s.close();

        ss.close();

    }

}

 

客户端和服务的浏览器演示:

浏览器是一个标准的客户端,它可以对服务端传送过来的数据消息进行解析,把符合应用层协议的消息部分解析后,将头信息拆包掉,传送到应用层,只保留了正确的正文主题部分显示在主体部分上。

而由于使用java编译是在传输层和网际层处理的,所以,会接受到全部的消息,包含了头消息。而浏览器处于应用层,已将发送来的头消息去除,只留下了主体信息。

 1 /*

 2  * 在浏览器输入:http://localhost:11000/

 3  * 即可访问,返回"客户端你好"

 4  */

 5 public class ServerDemo {

 6 

 7     public static void main(String[] args) throws Exception {

 8         ServerSocket ss = new ServerSocket(11000);

 9 

10         System.out.println("等待接收...");

11         Socket s = ss.accept();

12         System.out.println("成功");

13         System.out.println(s.getInetAddress().getHostAddress());

14 

15         InputStream in = s.getInputStream();

16         byte[] buf = new byte[1024];

17         int len = in.read(buf);

18         System.out.println(new String(buf, 0, len));

19 

20         // 返回信息写入客户端输出流

21         PrintWriter out = new PrintWriter(s.getOutputStream(), true);// true一定要写

22         out.println("<font color='red' size='7'>客户端你好</font>");

23         s.close();

24         ss.close();

25     }

26 }

 

四、URL和URLConnection

1URL

        URI:范围更大,条形码也包含于此范围

        URL:范围较小,即域名

方法:

        1)构造函数:URL(String protocol,String host,int port,String file);//根据指定 protocolhostport号和 file 创建 URL对象。

        2String getProtocol();//获取协议名称

        3String getHost();//获取主机名

        4int getPort();//获取端口号

        5String getFile();//获取URL文件名

        6String getPath();//获取此URL的路径部分

        7String getQuery();//获取此URL的查询部,客户端传输的特定信息

 

注:一般输入网址,是不带端口号的,此时可进行获取,通过获取网址返回的port,若port-1,则分配一个默认的80端口,如

        int port = getPort();

        if(port == -1)

              port = 80;

 

2URLConnection

方法:

        1URLConnection openConnection();//URL调用此方法,返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

        2InputStream getInputStream();//获取输入流

        3OutputStream getOutputStream();//获取输出流

例:

 1 public class URLConnectionDemo {

 2     public static void main(String[] args) {

 3         // TODO Auto-generated method stub

 4         /*try {

 5             URL url = new URL("http://www.baidu.com");

 6             

 7             URLConnection conn = url.openConnection();

 8             

 9             InputStream is =conn.getInputStream();

10             byte[] buff = new byte[1024];

11             int len;

12             len = is.read(buff);

13             System.out.println(new String(buff, 0, len));

14             

15         } catch (MalformedURLException e) {

16             // TODO Auto-generated catch block

17             e.printStackTrace();

18         }catch (IOException e) {

19             // TODO Auto-generated catch block

20             e.printStackTrace();

21         }*/

22         

23         URL url;

24         try {

25             url = new URL("http://192.168.1.254/myweb/demo.html?name=haha&age=30");

26             System.out.println("getProtocol() :"+url.getProtocol());

27             System.out.println("getHost() :"+url.getHost());

28             System.out.println("getPort() :"+url.getPort());

29             System.out.println("getPath() :"+url.getPath());

30             System.out.println("getFile() :"+url.getFile());

31             System.out.println("getQuery() :"+url.getQuery());

32 

33             /*int port = getPort();

34             if(port==-1)

35                 port = 80;

36             getPort()==-1

37             */

38         } catch (MalformedURLException e) {

39             // TODO Auto-generated catch block

40             e.printStackTrace();

41         }

42     }

43 }

44 /*

45  *  getProtocol() :http

46     getHost() :192.168.1.254

47     getPort() :-1

48     getPath() :/myweb/demo.html

49     getFile() :/myweb/demo.html?name=haha&age=30

50     getQuery() :name=haha&age=30

51  */

 

 

 

你可能感兴趣的:(java基础)