第一篇 基础网络编程

计算机网络:

所谓计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
计算机网络是现代通信技术与计算机技术相结合的产物,计算机网络可以提供以下一些主要功能。
· 资源共享
· 信息传输与集中处理
· 均衡负荷与分布处理
· 综合信息服务
计算机网络中实现通信必须有一些约定,这些约定称为通信协议。通信协议负责对传输速率、传输代码、代码结构、传输控制步骤、出错控制等制定处理标准。为了让两个节点之间能进行对话,必须在它们之间建立通信工具,使彼此能进行信息交换。

IP地址和端口号:

IP地址用于唯一地标识网络中的一个通信实体,这个通信实体既可以是一台主机,也可以是一台打印机或者是路由器中的某一个端口。
    基于IP协议网络中传输的数据包,都必须使用IP地址进行标识。
    IP地址是数字型的,是一个32位(32bit)的整数,但通常为了便于记忆,将其分为4个8位的二进制数,每8位之间用圆点隔开。
    IP地址被分为A、B、C、D、E五类。    
    A类:10.0.0.0 ~ 10.255.255.255
    B类:172.16.0.0 ~ 172.31.255.255
    C类:192.168.0.0 ~ 192.168.255.255等等
IP地址用于唯一地标识一个网络上的通信实体,但一个通信实体可以有多个通信程序提供网络服务,此时就需要使用端口了。
端口(port)用于表示数据要交给哪个通信程序处理。
    端口是应用程序与外界交流的入口,它是一个抽象的软件结构,包括一些数据结构和I/O(基本输入/输出)缓冲区。
    不同的应用程序处理不同端口上的数据,同一台机器上不能有两个程序使用同一个端口,端口是一个16位的整数,即端口号为0~65535,通常分为三类:
    公认端口(Well Known Ports):0~1023,他们紧密绑定一些特定的服务。
    注册端口(Registered Ports):1024~49151,他们松散地绑定一些服务。应用程序通常使用这个范围内的端口。
    动态和/或私有端口(Dynamic and/or Private Ports):49152~65535,这些端口是应用程序使用的动态端口,应用程序一般不会主动使用这些端口。
因此,同时绑定IP地址和端口号,才能找到特定计算机上的特定应用程序。就像找一个人,找到他的街道号,还需要知道他的门牌号。

UDP通信模型:

服务器端和客户端两个流程之间的主要区别在于对地址的绑定函数(bind()函数),客户端可以不用对地址和端口进行绑定。
服务器端: 建立套接字、 绑定地址、 收发数据和关闭套接字;
客户端:建立套接字、收发数据和关闭套接字。

下面以Java代码为例,实现简单的UDP通信。

服务器端代码:

package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class udpServer {

	InetAddress address = null;
	int port = 8080;
	public udpServer(){
		try {
			address = InetAddress.getLocalHost();
			System.out.println("address:"+address);
			//建立套接字,绑定IP和port
			DatagramSocket socket = new DatagramSocket(port,address);
			//建立数据包
			byte[] buffer = new byte[1024];
			DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
			//接收数据
			socket.receive(packet);
			String getMsg = new String(buffer,0,packet.getLength());
			System.out.println("客户端发来的数据为:"+getMsg);
			//服务器给客户端回送数据
			//InetAddress clientAddress = packet.getAddress();//获取客户端IP地址
			//int clientPort = packet.getPort();//获取客户端端口号
			SocketAddress sendAddress = packet.getSocketAddress();
			String feedback = "Received";
			byte[] backbuf = feedback.getBytes();
			DatagramPacket sendPacket = new DatagramPacket(backbuf,backbuf.length,sendAddress);
			socket.send(sendPacket);
			//关闭套接字
			socket.close();
		}catch (UnknownHostException e) {
			e.printStackTrace();
		}catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	public static void main(String[] args) {
		new udpServer();
	}
}

客户端代码:

package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class udpClient {

	private InetAddress address = null;
	private int port = 8080;
	
	public udpClient(){
		try {
			address = InetAddress.getByName("192.168.203.1");
			//address = InetAddress.getLocalHost();
			//创建数据包
			String msg = "Hello World";
			byte[] buf = msg.getBytes();
			DatagramPacket packet = new DatagramPacket(buf,buf.length,address,port);
			//创建套接字
			DatagramSocket socket = new DatagramSocket();
			//发送数据
			socket.send(packet);
			//接收服务器返回的数据
			byte[] backbuf = new byte[1024];
			DatagramPacket backPacket = new DatagramPacket(backbuf,backbuf.length);
			socket.receive(backPacket);
			String backMsg = new String(backbuf,0,backPacket.getLength());
			System.out.println("服务器返回的数据为:"+backMsg);
			//关闭套接字
			socket.close();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new udpClient();
	}

}
这段代码中,主要使用的函数有:
InetAddress.getByName();通过括号中IP字符串参数,找到对应主机,根据端口号找到相应的应用程序,如果本机测试,还可以均使用getLocalHost()。此外,使用DatagramSocket创建套接字,使用DatagramPacket创建数据包,
其构造函数如下:





参考文章:
《疯狂Java讲义》
http://blog.chinaunix.net/uid-20775448-id-3522052.html
http://blog.csdn.net/woshisap/article/details/6846656
http://www.apihome.cn/api/java/DatagramPacket.html
http://www.apihome.cn/api/java/DatagramSocket.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值