------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
网络编程概述
一.网络模型
(1)分为 OSI参考模型和TCP/IP 参考模型。图形表示:
(2)一般来说开发处于传输层和网际层;应用层为:FTP和HTTP协议等;传输层为:UDP和TCP等;网际层为:IP。
(3)OSI参考模型虽然设计精细,但过于麻烦,效率不高,因此才产生了简化版的TCP/IP参考模型。
二. 网络通讯要素
(1) IP地址:
网络中设备的标识;不易记忆,可用主机名;本地回环地址:127.0.0.1 主机名:localhost。
如何获取任意一台主机的IP地址对象:
1.返回InetAddress对象。
2.对于任意主机,需要指定传入主机名的参数。
示例:
import java.net.*;
public class IPDemo
{
public static void main(String[] args) throws Exception
{
//获取本类对象的IP信息
InetAddress i=InetAddress.getLocalHost();
String address=i.getHostAddress();//获取IP地址
String name=i.getHostName();//获取主机名
System.out.println("IP="+address+"\t"+"name="+name);
//获取指定IP地址的IP信息
InetAddress ia=InetAddress.getByName("192.168.137.1");
String address1=ia.getHostAddress();
String name1=ia.getHostName();
System.out.println("IP="+address1+"\t"+"name="+name1);
//获取指定主机名的IP信息
InetAddress iad=InetAddress.getByName("www.poxiao.com");
String address2=iad.getHostAddress();
String name2=iad.getHostName();
System.out.println("IP="+address2+"\t"+"name="+name2);
}
}
(2)
端口号
1.用于标识进程(应用程序)的逻辑地址,不同进程的标识。
2. 有效端口:0~65535,其中0~1024系统使用或保留端口。
(3)传输协议:
通讯的规则,常见协议:UDP、TCP。
UDP协议
一.UDP协议的特点
(1)将数据及源和目的封装成数据包中,不需要建立连接。
(2)每个数据报的大小在限制在64k内。
(3)因无连接,是不可靠协议。
(4)不需要建立连接,速度快。
二.UDP传输
(1)方法:
1.创建 UDPSocket发送服务对象:DatagramSocket(),不指定端口。DatagramSocket(int port),指定端口。
2.发送:void send(DatagramPacket p)。
3.接收:void receive(DatagramPacket p)。
(2)发送数据:
1.建立UDPSocket服务,在此无需指定端口,也可以将端口加入。
2.提供数据,并将数据封装到数据包中。
3.通过socket服务的发送功能,将数据包发送出去。
4.关闭资源。
(3)接收数据:
1.定义 UDPSocket服务。通常会监听一个端口。
2.定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3.
通过
socket
服务的
receive
方法接收到的数据存入已定义好的数据包中。
4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5.关闭资源。
(4)示例:
import java.net.*;
//发送端
public class UdpSocketSend
{
public static void main(String[] args)throws Exception
{
//创建udp服务。(找邮局)
DatagramSocket ds=new DatagramSocket();
//提供数据,并打包
byte[] buf="wo zai xue xi java".getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length, InetAddress.getByName("192.168.137.1"), 60812);
//通过socket服务将数据发送出去,使用send方法
ds.send(dp);
//关闭资源
ds.close();
}
}
//接收端
class UdpSocketReceive
{
public static void main(String[] args) throws Exception
{
//创建udp socket服务(接收端)
DatagramSocket ds=new DatagramSocket(60812);
//定义数据包,用于存储数据
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//通过服务的receive方法接收数据存入数据包中
ds.receive(dp);
//通过数据包的方法获取其中的数据
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println("ip:"+ip+" "+"data:"+data+" "+"port:"+port);
ds.close();
}
}
(4)键盘输入,发送数据:
import java.net.*;
import java.io.*;
public class UdpSend
{
public static void main(String[] args)throws Exception
{
//创建udp服务。
DatagramSocket ds=new DatagramSocket();
DatagramPacket dp=null;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null)
{
byte[] buf=line.getBytes();
//提供数据,并打包
dp=new DatagramPacket(buf,buf.length, InetAddress.getByName("192.168.137.1"), 60812);
ds.send(dp);//通过socket服务将数据发送出去,使用send方法
if("over".equals(line))
break;
}
ds.close();//关闭资源
}
}
class UdpReceive
{
public static void main(String[] args) throws Exception
{
//创建udp socket服务(接收端)
DatagramSocket ds=new DatagramSocket(60812);
//定义数据包,用于存储数据
while(true)
{ byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//通过服务的receive方法接收数据存入数据包中
ds.receive(dp);
//通过数据包的方法获取其中的数据
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println("ip:"+ip+" "+"data:"+data+" "+"port:"+port);
}
}
}
TCP协议
一.TCP协议的特点
(1)
建立连接,形成传输数据的通道。
(2)在连接中进行大数据量传输。(3)通过三次握手完成连接,是可靠协议。
(4)必须建立连接,效率会稍低。
二.TCP传输
(1)TCP分客户端和服务端。客户端对应的对象是Socket,服务端对应的对象是ServerSocket。
(2)TCP客户端:
1.客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
2.连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出 流对象,通过getInputStream(),getOutputStream()获取即可。
3.与服务端通讯结束后,关闭Socket。
(3)TCP服务端:
1.服务端需要明确它要处理的数据是从哪个端口进入的。
2.当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行 数据传输。
3.当该客户端访问结束,关闭该客户端。
(4)服务端和客户端交互示例:
import java.net.*;
import java.io.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//1、创建客户端的Socket服务。指定目的主机和端口
Socket s=new Socket("192.168.137.1",10005);
//2、获取Socket流中输出流,发送数据
OutputStream out=s.getOutputStream();
out.write("你好!".getBytes());
//3、获取Socket流中的输入流,用来接收服务端的反馈信息并打印
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);//读取反馈的数据
System.out.println(new String(buf,0,len));//输出接收的数据
s.close();//关闭资源
}
}
//服务端
class TcpServer
{
public static void main(String[] args)throws Exception
{
//1、创建服务端的Socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(10005);
//2、通过accept方法获取连接过来的客户端对象。
Socket s=ss.accept();
//获取客户端ip
String ip=s.getInetAddress().getHostName();
System.out.println(ip);
//3、获取对应客户端对象的读取流读取发过来的数据,并打印
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
//4、调用对应的客户端的输出流写入返回数据
OutputStream out=s.getOutputStream();
out.write("收到!".getBytes());
//关闭资源
s.close();
ss.close();
}
}
(5)
服务端和客户端
文本转换:
import java.net.*;
import java.io.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建Socket服务
Socket s=new Socket("192.168.137.1",10005);
//定义读取键盘数据的流对象
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//定义目的,将数据写入到Socket输出流。发给服务端
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//定义一个Socket读取流,读取服务端返回的大写信息。
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while ((line=br.readLine())!=null)
{
if("over".equals(line))
break;
pw.println(line);//将数据写入流中
String data=brin.readLine();//读取返回的信息
System.out.println(data);
}
br.close();//关流
s.close();
}
}
//服务端
class TcpServer
{
public static void main(String[] args)throws Exception
{
//创建服务端的ServerSocket服务,并指定监听端口
ServerSocket ss =new ServerSocket(10005);
//获取客户端连接
Socket s=ss.accept();
//获取客户端ip
System.out.println(s.getInetAddress().getHostName()+" connected.......");
//读取Socket读取流中的数据
BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
//将大写数据写入到Socket输出流,并发送给客户端。
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String line=null;
while ((line=brin.readLine())!=null)
{
System.out.println(line);
pw.println(line.toUpperCase());//将读到数据转换为大写后返回
}
s.close();//关流
}
}