学习java第二十三天

扶醉桌前 提交于 2019-11-28 21:44:45

学习java第二十三天

网络编程

三大要素:

  1. ip
  2. 端口号
  3. 协议

ip:
获取IP地址的类:InetAddress
常规的方法:
public static InetAddress getLocalHost().返回本地主机
public String getHostAddress()获取ip地址
public String getHostName()获取ip的主机名

端口号:
软件开启时,系统随机生成一个,软件关闭时系统回收
常用软件的端口号:
Tomcat:8080
oracle:1521
mysql:3306
qq:4000

协议:
网络传输的规范:协议分为7层
传输层:TCP UDP+ xmpp协议
web 阶段: http协议 https协议:一次性的连接
UDP面向无连接协议:传输数据快
TCP面向连接协议:传输数据慢

TCP:
类Socket:
套接字(ip地址+端口号)
构造方法:
public Socket(String host, int port)创建一个流套接字并将其连接到指定主机上的指定端口号。

常规方法:
public Socket(String host)
创建一个流套接字并将其连接到指定主机上的指定端口号。

public InputStream getInputStream() 返回此套接字的输入流。
public OutputStream getOutputStream() 返回此套接字的输出流。
public void shutdownOutput() 禁用此套接字的输出流。(类似于flush() )

发消息过程
实例化socket()对象
通过对象OutputStream
调用write()
调用shutdownOutput()
//等待服务器回复。。
5.拿到输入流InputStream
6.ner BufferReader(new InputStreamReader(ner FileInputStream))
7.关闭资源

Socket socket =new Socket("ip地址",端口号);
OutputStream os =socket.getOutputStream();
os.write(byte[] b);
socket.shutdownOutput();
...

socket.close();

类 ServerSocket:
服务器套接字
构造方法:
public ServerSocket(int port) 创建绑定到特定端口的服务器套接字。(需要与客户端口号一样)
常规方法:
public Socket accept() 侦听并接受到此套接字的连接。(返回的是socket对象)

收消息过程
1.实例化ServerSocket。
2. 调用 accept() 返回的是一个socket对象
3.从socket拿到输入流 InputStream
4. new BufferReader(new InputStreamReader(new FileInputStream))
5.得到OutputStream 对象 调用 write()或者打印输出
6.shutdownOutput()
7.关闭资源

ServerSocket serverSocket = new ServerSocket(端口号);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = null;
while ((str = br.readLine()) != null) {
    System.out.println(str);
}
socket.shutdownInput();
socket.close();

对象传输
传输的对象的类需要序列化
在上述收发过程中:
创建ObjectOutputStream对象流
客户机调用对象流写的方法。
服务器调用对象流读的方法。
写读完需要调用shutdownOutput()方法,shutdownInput()方法。

文件传输:
客户机:
读取出需要上传的文件
通过socket调用getOutputStream()写入到服务器

服务器:通过socket调用getInputStream() 读取出来
需要创建一个文件夹保存文件
需要读取系统时间作为名字避免文件覆盖!

UDP:
类 DatagramSocket
此类表示用来发送和接收数据报包的套接字。
构造方法:
public DatagramSocket(int port, InetAddress laddr)
参数:
port - 要使用的本地端口
laddr - 要绑定的本地地址
public DatagramSocket(int port)
参数:
port - 要使用的端口。

常规方法:
public void send(DatagramPacket p)
throws IOException从此套接字发送数据报包。
public void receive(DatagramPacket p)
throws IOException从此套接字接收数据报包。

包裹对象:类 DatagramPacket
此类表示数据报包。
数据报包用来实现无连接包投递服务。
构造:
public DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
参数:
buf - 包数据。
offset - 包数据偏移量。
length - 包数据长度。
address - 目的地址。
port - 目的端口号。

public DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
参数:
buf - 包数据。
offset - 包数据偏移量。
length - 包数据长度。
address - 目的套接字地址。

常规方法:
public SocketAddress getSocketAddress()
获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
返回:SocketAddress

public byte[] getData()返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续 length 长度。
返回:用来接收或发送数据的缓冲区

基于UDP的客户端
实例化这个对象 DatagramSocket
构建一个包裹对象,数据包
发送数据send();
关闭资源

DatagramSocket ds =new DatagramSocket();
String s ="ssss";
InetAddress inetAddress =InetAddress.getLocalHost();//返回本地主机。 
DatagramPacket dp =new DatagramPacket(s.getBytes(),
						s.length(),inetAddress,6789);//6789是服务器的端口号
ds.send(dp);
ds.close();

基于UDP的服务器
实例化对象 DatagramSocket
构建一个包裹对象
接收数据 receive()
拆包裹,调用包裹对象的getData()方法。
关闭资源

DatagramSocket ds=new DatagramSocket(6789);//设置端口号
byte [] b =new byte[2048];
DatagramPacket dp =new DatagramPacket(b,b.length);
ds.receive(dp);
byte [] by= dp.getData();
System.out.println(new String(by,0,by.length));
ds.close();

总结:学习这个网络编程,首次能在自己代码下和同桌实时通信,还是挺有趣的,不过也是容易出错的。还是要好好注意。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!