Socket编程基本概念----imooc(1)

来源:互联网 发布:时序数据库 编辑:程序博客网 时间:2024/05/16 05:43

这俩天在学多线程,http相关的知识,感觉慕课网不错,听听记记

Socket编程

@(JAVA)


Socket编程基本概念—-imooc(1)
Socket编程基本概念—-imooc(2)
Socket编程基本概念—-imooc(3)


http://www.imooc.com/learn/161

  • Socket编程
    • 课程简介
    • 网络基础知识
    • InetAddress
    • java中的URL应用
    • socket简介
    • 编程实现基于TCP的Socket通信实现用户登录

课程简介

  1. 网络基础知识
  2. InetAddress类
  3. URL
  4. TCP编程
  5. UDP编程

网络基础知识

  • 俩台计算机通过网络进行通信的3个必备条件

    • IP地址 (电脑的名字,唯一的)(比如:手机号码)
    • 协议 (沟通的语言)
    • 端口 (一台电脑运行不同应用的标识,区分不同应用程序)(比如:http:80 ftp:20 telnet:23)
  • TCP/IP协议

    • 是目前世界上应用最广泛的协议
    • 是以TCP和IP为基础的不同层次上多个协议的集合
    • TCP : Transmission Control Protocol 传输控制协议
    • IP:Internet Protocol 互联网协议
  • TCP/IP模型

    • 1层物理层 :网线,网卡
    • 4层传输层 (TCP IP)
    • 5层应用层 (HTTP (超文本传输协议)FTP(文件传输协议)SMTP(简单邮件传送协议)Telnet(远程登录服务))
  • socket

    • IP地址和端口号组成了socket
    • socket是网络上运行的程序之间双向通信链路的终结点,是TCP 和 UDP的基础
  • java 中的网络支持

    • InetAddress : 用于标识网络上的硬件资源
    • URL:统一资源定位符 通过URL可以直接读取与写入网络上的数据
    • Scorck:使用TCP协议实现网络通信的Socket相关的类
    • Dategram:使用UDP协议,将数据保存在数据报中,通过网络进行通信

InetAddress

  • 没有构造函数
  • 实例:
import java.net.InetAddress;import java.net.UnknownHostException;/** * Created by zhangzexiang on 2016/9/15. */public class InetAddressTest {    public static void main(String[] args) throws UnknownHostException {        InetAddress address = InetAddress.getLocalHost();        System.out.println("computer name: "+address.getHostName());        System.out.println("computer ip: "+address.getHostAddress());    }}

output:

computer name: idea-PCcomputer ip: 169.254.195.114Process finished with exit code 0

java中的URL应用

  • URL(Uniform Resource Locator) 统一资源定位符,表示Internet上某一资源的地址
  • URL由俩部分组成:协议名称和资源名称,中间用冒号隔开
  • java.net包中,提供了URL类来表示URL
  • URL实例1
package imooc.socket;import java.net.MalformedURLException;import java.net.URL;/** * Created by zhangzexiang on 2016/9/15. */public class URLTest {    public static void main(String[] args) throws MalformedURLException {        //create a URL example        URL imooc = new URL("http://www.imooc.com");        URL url = new URL(imooc, "/index.html?username=tom#test"); //?后面表示参数,#后面表示瞄点        System.out.println("协议:"+url.getProtocol());        System.out.println("主机:"+url.getHost());        //如果未指定端口号,则使用默认的端口号,此时getPork()方法返回值为-1        System.out.println("端口:"+url.getPort());        System.out.println("文件路径:"+url.getPath());        System.out.println("文件名:"+url.getFile());        System.out.println("相对路径:"+url.getRef());        System.out.println("查询字符串:"+url.getQuery());    }}

output:

协议:http主机:www.imooc.com端口:-1文件路径:/index.html文件名:/index.html?username=tom相对路径:test查询字符串:username=tom

  • 使用URL读取网页内容
    • 通过URL对象中的 openStream()方法可以得到指定资源的输入流
    • 通过输入流可以读取 访问网络上的数据

package imooc.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;/** * Created by zhangzexiang on 2016/9/15. * * URL读取网页内容 */public class URLTest2 {    public static void main(String[] args){        try {            //create URL ex            URL url  = new URL("http://www.baidu.com");            //通过 URL 的 openStream 方法获取URL对象所表示的资源的字节输入流            InputStream is = url.openStream();            //将字节输入流转换为字符输入流            InputStreamReader isr = new InputStreamReader(is,"utf-8");            //为字符输入流添加缓冲(加快速度?)            BufferedReader br = new BufferedReader(isr);            String data = br.readLine();//读取数据            while(data!=null){//循环读取数据                System.out.println(data);//输出数据                data = br.readLine();            }            br.close();//close BufferedReader            isr.close(); // close InputStreamReader 关闭字符输入流            is.close(); //close InputStream 关闭字节输入流        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}

output:

输出内容为baidu.com的.html文件内容

socket简介

  • TCP协议是面向连接、可靠的、有序的、以字节流的方式发送数据

  • 这里写图片描述

  • Socket通信实现步骤
    • 创建ServerSocket和Socket
    • 打开连接到Socket的输入/输出流
    • 按照协议对Socket进行读/写操作
    • 关闭输入输出流、关闭Socket

编程实现基于TCP的Socket通信,实现用户登录

  • 服务器端:
    • 创建ServerSocket对象,绑定监听端口
    • 通过accept()方法监听客户端请求
    • 连接建立后,通过输入流读取客户端发送的请求
    • 通过输出流向客户端发送响应信息
    • 关闭相关资源
  • 客户端:
    • 创建Socket对象,指明需要连接的服务器的地址和端口号
    • 连接建立后,通过输出流向服务器端发送请求信息
    • 通过输入流获取服务器相应的信息
    • 关闭相关资源
package imooc.socket;import java.io.*;import java.net.ServerSocket;import java.net.Socket;/** * Created by zhangzexiang on 2016/9/17. * * 编程实现基于TCP的Socket通信,实现用户登录 * * 服务器端 */public class Server {    public static void main(String[] args){        try {            //1 创建一个服务器段的Socket,即ServerSocket,指定绑定的端口,并监听此端口            ServerSocket serverSocket = new ServerSocket(8888);            //2 调用accept()方法开始监听,等待客户端的连接            System.out.println("***server is beginning,wait client ***");            Socket socket = serverSocket.accept();            //3 获取输入流,并读取客户端信息            InputStream is = socket.getInputStream();//字节输入流            InputStreamReader isr = new InputStreamReader(is);//将字节流转换为字符流            BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲            String info = null;            while((info=br.readLine())!=null){//循环读取客户端的信息                System.out.println("我是服务器,客户端说:"+info);            }            socket.shutdownInput();//关闭输入流            //4 获取输出流,响应客户端的请求            OutputStream os = socket.getOutputStream();            PrintWriter pw = new PrintWriter(os);   //包装为打印流            pw.write("welcome!");            pw.flush();//调用flush()方法将缓冲输出            //5 关闭资源            pw.close();            os.close();            br.close();            isr.close();            is.close();            socket.close();            serverSocket.close();        } catch (IOException e) {            e.printStackTrace();        }    }}
package imooc.socket;import java.io.*;import java.net.Socket;/** * Created by zhangzexiang on 2016/9/17. * * * 编程实现基于TCP的Socket通信,实现用户登录 * * 客户端 */public class Client {    public static void main(String[] args) {        try {            //1 创建客户端Socket,指定服务器地址和端口            Socket socket = new Socket("localhost",8888);            //2 换取输出流,向服务器端发送信息            OutputStream os = socket.getOutputStream();//字节输出流            PrintWriter pw = new PrintWriter(os); //将输出流包装为打印流            pw.write("username:admin;password:123");            pw.flush();            socket.shutdownOutput();//colse outputStream            //3 获取输入流,并读取服务器端的相应消息            InputStream is =socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            String info = null;            while((info=br.readLine())!=null){//循环读取服务端的信息                System.out.println("我是客户端,服务器说:"+info);            }            //4 colse resource            br.close();            is.close();            pw.close();            os.close();            socket.close();        } catch (IOException e) {            e.printStackTrace();        }    }}

output: (first run Server.java)

***server is beginning,wait client ***我是服务器,客户端说:username:admin;password:123
我是客户端,服务器说:welcome!

0 0
原创粉丝点击