Java 网络编程

一. 网络编程的基本概念,TCP/IP协议简介
1.网络基础知识
  计算机网络形式多样,内容繁杂。网络上的计算机要互相通信,必须遵循一定的协议。目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议。
  网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
  目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
2.网络基本概念
IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔。
    如:166.111.136.3 , 166.111.52.80
主机名(hostname):网络地址的助记名,按照域名进行分级管理。
端口号(port number):网络通信时同一机器上的不同进程的标识。
    如:80,21,23,25,其中1~1024为系统保留的端口号
服务类型(service):网络的各种服务。
    http(port 80), telnet(port 22)
3.两种传输协议TCP,UDP
  虽然TCP/IP协议中有TCP这个协议名称,但是在TCP/IP协议传输层中存在TCP,UDP两个协议。
  TCP (传输控制协议)
  TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
  UDP(用户数据报协议)
  UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。
二.URL
1。一致资源定位器URL
  URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。
  URL是最为直观的一种网络定位方法。使用URL符合人们的语言习惯,容易记忆,所以应用十分广泛。而且在目前使用最为广泛的TCP/IP中对于URL中主机名的解析也是协议的一个标准,即所谓的域名解析服务。
2.创建一个URL
  为了表示URL, java.net中实现了类URL。我们可以通过下面的构造方法来初始化一个URL对象:
  (1) public URL (String spec);
     通过一个表示URL地址的字符串可以构造一个URL对象。

		   URL urlBase=new URL("http://www. 263.net/")

(2) public URL(URL context, String spec);
     通过基URL和相对URL构造一个URL对象。

   		   URL net263=new URL ("http://www.263.net/");
        URL index263=new URL(net263, "index.html")

(3) public URL(String protocol, String host, String file);

            new URL("http", "www.gamelan.com", "/pages/Gamelan.net. html");

new URL(“http”, “www.gamelan.com”, “/pages/Gamelan.net. html”);
(4) public URL(String protocol, String host, int port, String file);

		   URL gamelan=new URL("http", "www.gamelan.com", 80, "Pages/Gamelan.network.html");

异常处理

try{
     URL myURL= new URL(…)
  }catch (MalformedURLException e){
        e.printStackTrace();
  }

3.URL类提供的方法
   public String getProtocol() 获取该URL的协议名。
   public String getHost() 获取该URL的主机名。
   public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。
   public String getFile() 获取该URL的文件名。
   public String getRef() 获取该URL在文件中的相对位置。
   public String getQuery() 获取该URL的查询信息。
   public String getPath() 获取该URL的路径
   public String getAuthority() 获取该URL的权限信息
   public String getUserInfo() 获得使用者的信息
   public String getRef() 获得该URL的锚
三.Socket
1.概念
  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
  建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
2.服务端
例: 简单的服务端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class fuwuqi {
    public static void main(String[] args) throws IOException {
        ServerSocket serversocket = new ServerSocket(5000);
        System.out.println("服务器创建成功,端口号是"+5000);
        while (true) {
            Socket socket = serversocket.accept();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        handlo(socket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
    private static void handlo(Socket socket) throws IOException {
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
        while (true){
            byte[] bytes = new byte[1024];
            int len=in.read(bytes);
            if (len==-1){
                break;
            }
            String s = new String(bytes);
            out.write(s.getBytes());
            System.out.println(s);
        }
    }
}

3.客户端

package liaotian;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class kehuiduan {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        Socket socket = new Socket("127.0.0.1",5000);
        String s1 = sc.nextLine();
        OutputStream out = socket.getOutputStream();
        out.write(s1.getBytes());
        InputStream in = socket.getInputStream();
        while (true){
            byte[] bytes = new byte[1024];
            int len=in.read(bytes);
            if (len==-1){
                break;
            }
            String s = new String(bytes,0,len);
            System.out.println(s);
        }
        socket.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值