一、了解网络基础知识
1、TCP/IP协议
TCP/IP协议是网络通信技术事实上的一个标准,TCP/IP协议是一组协议的总称,它包括了HTTP、SMTP、TCP、UDP、IP等协议,所以也将其称为TCP/IP协议簇。在TCP\IP协议体系结构中,这些协议分为4个层次,从上往下依次为应用层、传输层、互联层、网络接口层。
应用层:有多种协议,几乎包括互联网的所有应用。如用于www服务的HTTP协议。
传输层:有多种协议,每种协议提供不同的服务,主要是UDP和TCP协议。
互联层:由多个协议组成,这些协议互相合作,共同完成互联层的功能,其中最主要的协议是IP协议。
网络接口层:主要是一些硬件设施,如网卡、光纤、等。还包括一些网络协议,如以太网。这一层是网络传输的基础。
2、IP协议
IP协议(Internet Protoclo ,互联网协议)提供无连接的传输服务,它的功能是把数据发送到目标主机,IP协议传输的数据单元称为数据包。每个IP数据包都包含了数据的源IP地址和目的IP地址。
3、TCP协议(Transmission Control Protocol)传输控制协议
传输层主要的两种协议之一,另一种协议是UDP协议。
TCP协议的特点:
(1)、TCP协议是一种面向连接的、可靠的协议。
(2)、建立连接,形成传输数据的通道。
(3)、可进行大量数据的传输。
(4)、因为必须建立连接,效率会稍低
4、UDP协议:(User Datagram Protocol)用户数据报协议,是一种不可靠、无连接的服务,它直接向网络发送数据给一台主机或多台主机,而不需要确认数据是否送达。该协议主要用于一次性传输少量数据。不仅用于点到点的通信。也用于一对多的通信。
UDP协议特点:
(1)、将数据源及目的信息封装成数据报,不需要连接。
(2)、每个数据报的大小限制在64k 以内
(3)、面向无连接,是不可靠协议
(4)、速度快
5、套接字(Socket)
由IP地址和端口号组成,它唯一标识了网络上运行的通信进程。是为网络服务提供的一种机制,通信的两端都有Socket,数据在两个Socket间通信。
6、网络通信的三要素
IP地址:网络中设备的标识
端口号:用于标记进程的逻辑地址,不同进程的标识。是一个16位的正整数,0-1023已被系统占用,用户能够使用的端口号为1024到65535.
传输协议:即通信的规则,常见协议为TCP、IP
二、用UDP进行网络编程
UDP开发主要使用的类:
1、DatagramSocket类:此类表示用来发送和接收数据报包的套接字
DatagramSocket的常用方法
DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
void receive(DatagramPacket p) 从此套接字接收数据报包。
void send(DatagramPacket p) 从此套接字发送数据报包。
2、DatagramPacket类:数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
DatagramPacket的常用方法:
DatagramPacket(byte[] buf,int length) 构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPcket(byte[] buf,int lenght,InetAddress address,int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
byte[] getData() 获得数据报包中的数据
void setData(byte[] buf) 设置数据报包中的数据
3、下面是一个使用UDP协议进行网络上发送数据和接收数据的小实例
(1)、数据接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReciveSocket {
public static void main(String[] args) {
// TODO Auto-generated method stub
int port=2000;
DatagramSocket ds=null;
try {
//给这个网络应用程序 定义 一个数字标识
ds=new DatagramSocket(port);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2.定义一个数据报封包,用来接收数据
while(true){
DatagramPacket dp=null;
byte [] buf=new byte[1024];
dp=new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(data);
System.out.println(dp.getPort());
System.out.println(dp.getAddress().getHostName());
}
ds.close();//关闭资源
}
}
(2)、数据发送端
import java.io.*;
import java.net.*;
/**
* 网络编程学习,发送端
* @author
*
*/
public class SendSocket {
/**
* @param args
*/
public static void main(String[] args)throws IOException{
int port=2000;//端口号
// TODO Auto-generated method stub
//1.建立一个UDPSocket服务\
DatagramSocket ds=null;
try {
ds=new DatagramSocket(2004);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2.添加数据,并封装成数据报包
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
while((str=br.readLine())!=null)
{
if(str.equals("886"))
break;
byte[] buf=str.getBytes();
DatagramPacket dp=null;
try {
dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),2000);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.发送数据 包
try {
ds.send(dp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ds.close();//关闭资源
}
}
三、使用TCP协议进行网络编程
1、Socket类:此类实现客户端套接字,套接字是两台机器间通信的端点。该对象建立连接时,就可以去连接指定的主机,因为TCP是建立连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,才能在该Socket的数据通道进行数据的传输。
(1)、常用方法:
Socket(String host,int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
InputStream getInputStream() 返回此套接字的输入流。
OutputStream getOutputStream() 返回此套接字的输出流。
void close() 关闭此套接字。
2、ServerSocket类:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果
主要方法:
ServerSocket(int port) 构造方法,创建绑定到特定端口的服务器套接字。
Socket accept() 侦听并接受到此客户端套接字的连接。连接成功后返回一个Socket客户端套接字,这个Socket就是客户端的,使用它来与客户进行通信。形成服务器端与服务器一对多的关系。
3、InetAddress类:封装了IP地址等信息。
4、TCP编程客户端的开发步骤
(1)、创建Socket,并与服务器端建立连接
Socket client=new Socket(InetAddress address, int port);
(2)、打开连接到Socket的输入输出流
InputStream is=client.getInputStream();
(3)、对数据进行操作
(4)、关闭socket;
5、TCP编程服务器端的开发步骤
(1)、创建ServerSocket,并指定一个端口进行监听
ServerSocket ss=new ServerSocket(int port)
(2)、接收客户端的连接
Socket clientSocket=ss.accept();
(3)、进行数据传输
(4)、关闭客户端socket
6、下面是一个小例子演示使用TCP协议进行网络通信
建立客户端:
package itcast.Tcpsocket.stu;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.*;
/*
* 定义 一个客户端,发送并接收数据
*
*/
public class TcpClient {
public static void main(String[] args) {
Socket s=null;
OutputStream out=null;
InputStream in=null;
try {
s=new Socket("192.168.1.100",10004);
out=s.getOutputStream();
byte[] b=new byte[1024];
out.write("我是客户端,你好!".getBytes());
in=s.getInputStream();
int len=in.read(b);
System.out.println(new String(b,0,len));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
建立服务器端:
package itcast.Tcpsocket.stu;
import java.net.*;
import java.io.*;
/*
* 定义一个服务器端,先接收数据,收到 后在发给客户端一个数据。
*
*/
public class TcpServer2 {
public static void main(String[] args) throws UnknownHostException {
InetAddress ia=InetAddress.getLocalHost();
System.out.println(ia.getHostAddress());
ServerSocket ss=null;
Socket s=null;
InputStream in=null;
OutputStream out=null;
try {
ss=new ServerSocket(10004);
s=ss.accept();
in=s.getInputStream();
byte[] b=new byte[1024];
int len=in.read(b);
System.out.println(new String(b,0,len));
out=s.getOutputStream();
out.write("我是服务器端:我已收到你的消息!".getBytes());
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}