Java的Socket网络编程基础知识入门教程

一、TCP/IP简介

TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中。
TCP/IP协议族包括了IP协议、TCP协议和UDP协议。

IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失、乱序或者
重复发送。TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用
程序间建立起透明的连接。

不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接,
之后通过在消息中加入序列号来恢复消息中的错误。而UDP只是简单地扩展了IP协议,
使它能够在应用程序之间工作,而不是主机之间。

关于IP地址,一台主机可以有多个网络接口,而一个接口又可以有多个地址。
有些IP地址是有特殊用途的:

A.回环地址:127.0.0.1,总是被分配给一个回环接口,主要用于测试。

B.私有地址:以10、192.168、172.(16-31)开头,用于私有网络。NAT设备转发报文
时,将一个接口中报文的私有地址端口对映射成另一个接口中的公有地址端口对。这
就使一小组主机能够共享一个IP地址对。

C.多播地址:第一个数字在224~239之间。

二、Socket基础

1.地址的获得

public static void main(String[] args) { 

  try {
    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
    while (interfaces.hasMoreElements()) {
      NetworkInterface iface = interfaces.nextElement();
      System.out.println("Interface: " + iface.getName()); 

      Enumeration<InetAddress> addrList = iface.getInetAddresses();
      if (!addrList.hasMoreElements())
        System.out.println("No address"); 

      while (addrList.hasMoreElements()) {
        InetAddress address = addrList.nextElement();
        System.out.println("Address: " + address.getHostAddress());
      }
    } 

  } catch (SocketException e) {
    e.printStackTrace();
  } 

}

2.TCP实例程序

要注意一点,虽然在Client端只用了一个write()方法发送字符串,服务器端也可能从
多个块中接受该信息。即使回馈字符串在服务器返回时存于一个块中,也可能被TCP
协议分割成多个部分。

TCPEchoClientTest.java

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

  String server = args[0];
  byte[] data = args[1].getBytes();
  int port = 7; 

  Socket socket = new Socket(server, port);
  System.out.println("Connected to server..."); 

  InputStream in = socket.getInputStream();
  OutputStream out = socket.getOutputStream(); 

  out.write(data); 

  int totalBytesRcvd = 0;
  int bytesRcvd;
  while (totalBytesRcvd < data.length) {
    if ((bytesRcvd = in.read(data, totalBytesRcvd,
        data.length - totalBytesRcvd)) == -1)
      throw new SocketException("Connection closed");
    totalBytesRcvd += bytesRcvd;
  } 

  System.out.println("Received: " + new String(data)); 

  socket.close();
}

TCPEchoServerTest.java

private static final int BUFSIZE = 32; 

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

  ServerSocket serverSocket = new ServerSocket(7); 

  int recvMsgSize;
  byte[] receiveBuf = new byte[BUFSIZE];
  while (true) {
    Socket socket = serverSocket.accept();
    System.out.println("Handling client " +
        " from remote " + socket.getRemoteSocketAddress() +
        " at local " + socket.getLocalSocketAddress()); 

    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream(); 

    while ((recvMsgSize = in.read(receiveBuf)) != -1) {
      out.write(receiveBuf, 0, recvMsgSize);
    }
    socket.close();
  } 

}

注意new Socket时指定的是远端服务器监听的端口号而没有指定本地端口,因此将
采用默认地址和可用的端口号。在我的机器上Client端口是4593,连接到服务器的
端口7。

3.UDP实例程序

为什么使用UDP协议?如果应用程序只交换少量的数据,TCP连接的建立阶段就至少
要传输其两倍的信息量(还有两倍的往返时间)。

UDPEchoClientTest.java

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

  InetAddress serverAddress = InetAddress.getByName(args[0]);
  byte[] bytesToSend = args[1].getBytes(); 

  DatagramSocket socket = new DatagramSocket();
  socket.setSoTimeout(3000); 

  DatagramPacket sendPacket = new DatagramPacket(
    bytesToSend, bytesToSend.length, serverAddress, 7); 

  DatagramPacket receivePacket = new DatagramPacket(
    new byte[bytesToSend.length], bytesToSend.length); 

  // Packets may be lost, so we have to keep trying
  int tries = 0;
  boolean receivedResponse = false;
  do {
    socket.send(sendPacket);
    try {
      socket.receive(receivePacket);
      if (!receivePacket.getAddress().equals(serverAddress))
        throw new IOException("Receive from unknown source");
      receivedResponse = true;
    }
    catch (IOException e) {
      tries++;
      System.out.println("Timeout, try again");
    }
  } while (!receivedResponse && tries < 5); 

  if (receivedResponse)
    System.out.println("Received: " + new String(receivePacket.getData()));
  else
    System.out.println("No response"); 

  socket.close();
}

UDPEchoServerTest.java

private static final int ECHOMAX = 255;  

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

  DatagramSocket socket = new DatagramSocket(7);
  DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX); 

  while (true) {
    socket.receive(packet);
    System.out.println("Handling client at " + packet.getAddress()); 

    socket.send(packet);
    packet.setLength(ECHOMAX);
  } 

}

通过这个例子与之前TCP的实例进行比较,有如下区别:

A.DatagramSocket在创建时不需要指定目的地址,因为UDP不需要建立连接,每个
数据报文都可以发送或接收于不同的目的地址。

B.如果像TCP一样在read()上阻塞等待,将可能永远阻塞在那里,因为UDP协议只是
简单地扩展了IP协议,UDP报文可能丢失掉。所以一定要设置阻塞等待的超时时间。

C.UDP协议保留了消息的边界信息,每次receive()调用最多只能接收一次send()方法
调用所发送的数据。

D.一个UDP报文DatagramPacket能传输的最大数据是65507字节,超出部分的字节将
自动被丢弃,而且对接收程序也没有任何的提示。因此缓存数组可以设置成65000字节
左右是安全的。

E.如果反复使用同一个DatagramPacket实例调用receive()方法,每次调用前都必须显式
地将消息的内部长度重置为缓存区的实际长度。

(0)

相关推荐

  • java网络编程基础知识介绍

    网络基础知识 1.OSI分层模型和TCP/IP分层模型的对应关系 这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍. 2.七层模型与协议的对应关系 网络层 ------------ IP(网络之间的互联协议) 传输层 ------------ TCP(传输控制协议).UDP(用户数据报协议) 应用层 ------------ Telnet(Internet远程登录服务的标准协议和主要方式).FTP(文本传输协议).HTTP(超文本传送协议) 3.IP地址和端口号 1.ip地址用于

  • Java网络编程基础教程之Socket入门实例

    当我们想要在Java中使用TCP/IP通过网络连接到服务器时,就需要创建java.net.Socket对象并连接到服务器.假如希望使用Java NIO,也可以创建Java NIO中的SocketChannel对象. 创建Socket 下面的示例代码是连接到IP地址为78.64.84.171服务器上的80端口,这台服务器就是我们的Web服务器(www.jb51.net),而80端口就是Web服务端口. 复制代码 代码如下: Socket socket = new Socket("78.46.84.

  • 简单介绍Java网络编程中的HTTP请求

    HTTP请求的细节--请求行   请求行中的GET称之为请求方式,请求方式有:POST.GET.HEAD.OPTIONS.DELETE.TRACE.PUT,常用的有: GET. POST 用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现. 不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请

  • 简单讲解Java的Socket网络编程的多播与广播实现

    在Java中,我们可以有很多种方法来发送和接收数据.有的方法比较靠近底层,有些问题就需要程序员自己去解决,而有些方法抽象层次比较高,很方便地就可以拿来使用.这些处理数据的方法根据抽象层次由低到高分别有: 1.手动编码:使用位运算逐个自己编码和解析. 2.利用流来自动编码:组合使用OutputStream和ByteArrayOutputStream. 3.序列化:将数据放入一个数据对象中,直接将这个对象序列化后发送. 使用起来很方便,但要注意效率的损失,以及接收方也要使用Java. 4.RMI:将

  • Java网络编程基础篇之单向通信 原创

    在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单线通信.客户机套接字和服务器套接字链接成功后,可估计通过输出流发送数据,服务器则通过输入流接受数据,下面是简单的单向通信的例子. 实例1:本实例是一个TCP服务器端程序,在 getserver() 方法中建立服务器套接字,调用getClienMessage()方法获取客户端信息.代码如下: import java.io.BufferedReader; import java.io.IOException; impo

  • Java套接字(Socket)网络编程入门

    网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统.网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息.www客户机(浏览器Brower)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户

  • Java网络编程之简单的服务端客户端应用实例

    本文实例讲述了Java网络编程之简单的服务端客户端应用.分享给大家供大家参考.具体如下: 在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能.Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程.下面所说的内容只适用于TCP协议. 一.连接到服务器 我们可以使用Socket类的构造函数来打开一个套接字,如 Socket sk = new Socket("210.0.235.14",13); 其中,210.0.23

  • Java 网络编程socket编程等详解

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节. java.net包中提供了两种常见的网络协议的支持: TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称TCP / IP. UDP:UDP是用户数据报协议的缩写,一个无连接的协议.提供了应用程序之间要发送的数据的数据包. 本教程

  • Java的Socket网络编程基础知识入门教程

    一.TCP/IP简介 TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中. TCP/IP协议族包括了IP协议.TCP协议和UDP协议. IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失.乱序或者 重复发送.TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用 程序间建立起透明的连接. 不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接, 之后通过在消息中加入序列号来恢复消息中的错误.而UDP只是简单地扩展了IP协议, 使它

  • Java 网络爬虫基础知识入门解析

    前言 说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬虫而且还能做的非常好,在开源社区中有不少优秀的 Java 网络爬虫框架,例如 webmagic .我的第一份正式工作就是使用 webmagic 编写数据采集程序,当时参与了一个舆情分析系统的开发,这里面涉及到了大量网站的新闻采集,我们就使用了 webmagic 进行采集程序的编写,由于当时不知

  • Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试常考): 第一次握手:客户端 发送SYN报文,设置随机数序号X,服务器由SYN=1知道,客户端要求建立联机 第二次握手:服务器端接收到客户端的报文之后,经过处理,返回给客户端SYN+ACK报文,同时设置随机序号Y,此时返回的报文确认ACK=X+1 第三次握手:接收到报文的客户端,会在处理确认之后,再

  • Java基于TCP协议socket网络编程的文件传送的实现

    先了解一下socket基本概念 socket也叫套接字: 是指在网路中不同主机上的应用进程之间,进行双向通信的端点的抽象. 简单理解就是: 两个主机之间要通信,就需要知道彼此的ip,端口号等信息,而一台主机这些信息的集合: 就可以理解为一个端点,即为套接字 双方通过套接字作为一种坐标,建立信息通道,形成连接(两点连接一条直线) 简单理解了套接字的概念后,来看看如何通过java socket编程来实现 两台主机文件的接收与发送: 代码如下: 发送方: import java.io.*; impor

  • Python socket网络编程TCP/IP服务器与客户端通信

    Python socket网络编程 初学 python,前段时间买了两本书<python 编程从入门到实践><Python 核心编程第三版>,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好看到了这部分网络编程,依然有好多不太理解的地方,不过想来通过自己不断的摸索,不断地搜寻资料学习,早晚应该会变得通透吧....... 这部分主要使用的模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象

  • 详解Python Socket网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用Python 进行TCP Socket 网络编程,假设你已经具

  • python之Socket网络编程详解

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它把各个点.面.体的信息联系到一起,从而实现这些资源的共享.网络是人类发展史来最重要的发明,提高了科技和人类社会的发展. 网络通信的三要素 IP地址 用来表示一台独立的主机 特殊的IP地址 127.0.0.1或称localhost(表示本地回环

  • Java 全面掌握网络编程篇

    目录 计算机网络 网络模型 客户机服务器模式(Client/Server) TCP/IP的概念和实现 TCP三次握手(Three-way handshake) TCP编程 UDP的概念和实现 UDP编程 TCP和UDP的区别 聊天室 服务器处理线程 客户端处理线程 服务器 客户端 效果 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统.包括局域网(intrane

随机推荐