第九讲 网络编程
网络协议与TCP/IP 本地回路IP172.0.0.1 用于本地计算机使用 ping 172.0.0.1
IP地址和Port(端口号) 端口号的范围0~65535 0~1023为知名网络服务和应用
IPv4 IPv6
Cmd中显示IP ipconfig/all
TCP: 传输控制协议 Transmission Control Protocol 面向连接 可靠的无差错的传输
UDP:用户数据报协议 User Datagram Protocol, 无连接不可靠传输
数据帧格式:
协议类型 | 源IP | 目标IP | 源端口 | 目标端口 | 帧序号 | 帧数据 |
Java中的网络编程类
Socket是网络驱动层提供给应用程序编程的接口和一种机制。
可以把Socket比喻成是一个港口码头。应用程序只要把货物放到码头,就算完成了货物的运送。应用程序只需等待货物到达码头后,将货物取走。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的ip和Port。
Socket数据发送过程
1应用程序产生Socket,2同时调用bind将Socket的信息通知给驱动程序,3应用程序将要发送的数据传给Socket,4驱动程序从Socket取出数据并通过网卡发送出去。
Socket数据接收过程
1应用程序产生Socket,2同时调用bind将Socket的信息通知给驱动程序,3驱动程序根据从网卡传送来的数据报中的指定目标端口号将处理后的数据传送到相应的Socket中,3应用程序从Socket中取数据。
java中的网络编程类 位于java.net包中
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务端
Socket类用于TCP通信的服务器和客户端
UDP网络程序
DatagramSocket类
构造函数:public DatagramSocket();
Public DatagramSocket(int port);
Public DatagramSocket(int port,inetAddess la d dr)
Close方法:// 关闭Socket函数对象,系统重新分配port
Send(DatagramSocket p)方法//发送数据包
Receive(DatagramSocket p)方法//接收数据包
DatagramPacket类
构造函数:public DatagramPacket(byte[]buf,int length) //接收数据时候用public DatagramPacket(byte[]buf,int length,inetAddress address,int port)//接收时用
GetlnetAddress和getPort方法
GetData和getLength方法
InetAddress类
用于表示IP地址的一个类
GetByName方法
GetHostAddress方法//返回IP地址
用UDP编写网络聊天程序
步骤:1.编写图形用户界面
2.发送功能
3接收功能
import java.net.*;
public class UdpSend{
DatagramSocket ds=new DatagramSocket();
String strInfo="hello www.itcast.cn";
ds.send(newDatagramPacket(strInfo.getByte(),strInfo.length(),InetAddress.getByName("192.168.0.3"),3000));
ds.close();
}
}
接收程序:
import java.net.*;
public class UdpRecv{
public static void main(String[] args){
DatagramSocket ds=new DatagramSocket(3000);
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.receive(dp);
String strInfo=new String(dp.getData(),0,dp.getLength())+"from"+dp.getAddress().getHostAddress()+":"+dp.getPort();
System.out.println(strInfo);
ds.close();
}
}
TCP网络程序
工作原理:交互过程
1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
2)客户端程序创建一个Socket并请求与服务器建立连接
3)服务器接收客户的连接请求并创建一个新的Socket与该客户建立专线连接
4)建立了连接的两个Socket在一个单独的线程上对话
5)服务器开始等待新的连接请求,当新的连接请求到达时重复2~5过程
TCP程序例:
import java.net.*;
import java.io.*;
public class TcpServer
{
public static void main(String[] args)
{
ServerSocket ss=new ServerSocket(8001);
Socket s=ss.accept();
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
ops.write("welcome to www.itcast.cn".getByte());
byte[] buf=new byte[1024];
int len=ips.read(buf);
System.out.println(new String(buf,0,len));
ips.close();
ops.close();
s.close();
.close();
}
}
ServerSocket类
构造函数:
Public ServerSocket()
Public ServerSocket(int port)
Public ServerSocket(int port,int backlog)
Public ServerSocket(int port,int backlog,lnetAddress bindaddr)
Close方法//释放资源
Accept方法//等待客户端的连接请求,返回对象
Socket类
构造函数
Public Socket()//不能直接使用
Public Socket(String host ,int port)
Public Socket(lnetAddress address,int port,)
Public Socket(String host ,int port , lnetAddress localAddr,int localPort)
Public Socket(lnetAddress address, ,int port , lnetAddress localAddr,int localPort)
GetlnputStream和getOutputStream方法
TCP服务器程序
TCP服务器程序必须先启动运行,才能连接上
使用Telnet程序测试TCP服务器程序
使用BufferedReader包装类,从网络输入流中一次读取一行文本
TCP服务器程序要想能接收多个客户连接,要循环调用ServerSocket.accept方法
会话过程不能相互影响
一个线程服务对象与一个服务器端Socket对象相关联,共同完成会话
使用netstat命令查看正在使用的TCP端口号
ObjectInputStream 和ObjectOutputStream
URL --Uniform Resource Locator
由 协议,主机名,端口号,资源名组成
编码规则:将空格转换为加号+
大小写字母,数字不变 %20也是空格
其他字符,用当前字符集编码在内存中的十六进制格式,并在内个字节前加%
Http 消息头 : Connection Accept-language Content-length Range Content-Range
URL类
构造函数:都可引发MalformedURLException异常
Public URL(String spec)
Public URL(String protocol,String host,int port,String file)
Public URL(String protocol,String host,int port,String file,URLStreamHandler handler)
Public URL(URL context,String spec)
getProcol getHost getPort getFile方法
openConnection方法返回URLConnection对象