1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
2.找到主机后如何可靠高效地进行数据传输
1.对应问题一:IP和端口号
2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路)
1.IP:唯一的标识Interent上的计算机(通信实体)
2.在Java中使用InetAddress类表示IP
3.IP分类:IPv4和IPv6;万维网和局域网
4.域名:例如:www.baidu.com www.mi.com(IP地址过于难记,因此用实际的域名抽象IP地址 )
域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立链接.
5.本地回路地址:127.0.0.1 对应方法:localhost
6.如何实例化InetAddress:两个方法:getByName(String host)、getLocalHost()两个常用方法:getHostName()/getHostAddress()
理解:此类的对象就代表着一个具体的IP地址
1.实例化:getByName(String host)、getLocalHost()
2.常用方法:getHostName()/getHostAddress()
1.理解:正在计算机上运行的进程
要求:不同的进程有不同的端口号
范围:被规定为一个16位的整数 0~65535.
2.端口号与IP地址的组合得出一个网络套接字:Socket
1.使用TCP协议前,必须先建立TCP连接,形成传输数据通道
2.传输前,采用“三次握手”方式,点对点通讯,是可靠的。
三次握手理解: **第一次握手->**我给小王发消息说我是鱼总,**第二次握手->**小王收到了我的消息说我知道你是鱼总,第三次握手->,我收到了小王的消息并知道了小王知道我是鱼总
套娃行为!!!!
3.TCP协议进行通信的两个应用进程:客户端、服务端
**客户端:**客户端(Client)又称为用户端,是指与服务器相对应,为客户提供本地服务的程序
服务器端:服务器端,从广义上讲,服务器是指网络中能对其它机器提供某些服务的计算机系统
4.在连接中可进行大数据量的传输
5.传输完毕,需要释放已建立的连接,但是效率比较低。
实例:打电话
客户端发送信息给服务端,服务端将数据显示在控制台上
代码实现:
/**
* @author 一只鱼zzzz
* @version 1.0
*/
public class TCPTest1 {
@Test
public void client() throws IOException {
//指明对方IP
InetAddress inet = InetAddress.getByName("127.0.0.1");
//创建Socket对象,指明服务器端的ip和端口号,port:端口号
Socket socket = new Socket(inet,8899);
//获取一个输出流,用于输出数据
OutputStream os = socket.getOutputStream();
//写出数据操作
os.write("你好,我是客户端mm".getBytes());
//资源关闭
os.close();
socket.close();
}
@Test
public void server() throws IOException {
//创建服务器端的socket,指明自己的端口号
ServerSocket ss = new ServerSocket(8899);
//用于接受来自客户端的socket
Socket socket = ss.accept();
//获取输入流
InputStream is = socket.getInputStream();
//不建议,可能出现乱码
// byte[]buffer = new byte[20];
// int len=0;
// while((len=is.read(buffer))!=-1){
// String str=new String(buffer,0,len);
// System.out.println(str);
// }
//读取输入流中的数据
//数据都存入到baos数组中,并且该数组会自动扩容
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[]buffer=new byte[5];
int len=0;
while((len=is.read(buffer))!=-1){
baos.write(buffer,0, len);
}
System.out.println(baos.toString());
//关闭资源
baos.close();
is.close();
socket.close();
ss.close();
}
}
客户端发送文件给服务器,服务端将文件保存在本地
代码实现:
/**
* @author 一只鱼zzzz
* @version 1.0
*/
public class TCPTest2 {
@Test
public void client() throws IOException {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
OutputStream os = socket.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("zyb.jpg")));
byte[] buffer = new byte[1024];
int len;
while((len=bis.read(buffer))!=-1){
os.write(buffer,0,len);
}
bis.close();
os.close();
socket.close();
}
@Test
public void server() throws IOException {
ServerSocket serverSocket = new ServerSocket(9090);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("zyb2.jpg"));
byte[]buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
从客户端发送文件到服务端,服务端保存到本地。并返回“发送成功”给客户端,然后关闭相应连接
代码实现:
/**
* @author 一只鱼zzz
* @version 1.0
*/
@SuppressWarnings({"all"})
public class TCPTest3 {
@Test
public void client() throws IOException {
//创建Socket对象,指明服务器端的IP和端口号
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 1010);
//获取一个输出流,用于输出数据
OutputStream os = socket.getOutputStream();
//将文件输入到程序
FileInputStream fis = new FileInputStream(new File("zyb.jpg"));
//读取输入流所输入的文件,并再输出出去
byte[]buffer=new byte[1024];
int len;
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//关闭数据的输出
socket.shutdownOutput();
//接收来自于服务器端的数据,并显示到控制台上
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[]bufferr = new byte[20];
int len1;
while((len1=is.read(bufferr))!=-1){
baos.write(bufferr,0,len1);
}
System.out.println(baos.toString());
//关流
baos.close();
is.close();
fis.close();
os.close();
socket.close();
}
@Test
public void server() throws IOException {
//创建服务器端的socket,指明端口号
ServerSocket ss = new ServerSocket(1010);
//接收来自客户端的socket
Socket accept = ss.accept();
//获取输入流
InputStream is = accept.getInputStream();
//输出流
FileOutputStream fos = new FileOutputStream(new File("zyb3.jpg"));
//读取输入流中的数据
byte[]buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
System.out.println("图片传输完成");
//服务器端给予客户端反馈
OutputStream os = accept.getOutputStream();
os.write("你好,帅哥,照片我已经收到,非常帅".getBytes());
//关流
os.close();
fos.close();
is.close();
accept.close();
ss.close();
}
}
(不可靠连接)
1.将数据、源、目的封装成数据包,不需要建立连接
2.每个数据包的大小限制在64K内
3.发送不管对方是否准备好,接收方收到也不确定,所以是不可靠的
4.可以广播发送
5.发送数据时无需释放资源,开销小,速度快。
实例:发送短信,发送电报,直播。
代码实现:
/**
* UDP协议的网络编程
* @author 一只鱼zzzz
* @version 1.0
*/
public class UDPTest {
//发送端
@Test
public void sender() throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "我是UDP方式发送的导弹";
byte[]data=str.getBytes();
InetAddress localHost = InetAddress.getLocalHost();
//将数据都封装到DatagramPacket报中
DatagramPacket packet = new DatagramPacket(data, 0, data.length, localHost,9090);
socket.send(packet);
socket.close();
}
//接收端
@Test
public void receiver() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9090);
byte [] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
datagramSocket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
datagramSocket.close();
}
}
1.TCP是可靠的数据传输(三次握手),UDP是不可靠的数据传输。
2.TCP可以进行大数据量的传输,UDP每次都以数据报的形式发送,有限定大小。
3.TCP效率低,UDP效率高。
统一资源定位符,对应着互联网上的某一个资源地址
http://localhost:8080/examples/zyb.jpg?username=Yu
协议 主机名 端口号 资源地址 参数列表
URL url = new URL("http://192.168.14.100:8080/examples/hello.txt?username=Tom");
public String getProtocol()—>获取该URL的协议名
public String getHost()—>获取该URL的主机名
public String getPort() —>获取该URL的端口号
public String getPath()—>获取该URL的文件路径
public String getFile()—>获取该URL的文件名
public String getQuery()—>获取该URL的查询名
Java网络编程入门只能解决一些很小的问题,面对真正的计算机网络技术这点知识显然是不够的,网络编程的进一步学习将会在接下来的JavaWeb中继续,目前我正在写一个基于JavaSE中的swing技术,多线程,IO流,网络编程,已经JDBC和MySQL基础技术实现一个多人联网的坦克大战小游戏,因此我会将复习的javase技术,SQL基础以及JDBC基础做成笔记发布记录,实现坦克大战之后我会将源码上传,可能还会出一期教程,目前是大一,加油吧!