黑马程序员_java网络编程
来源:互联网 发布:淘宝店铺首页装修代码 编辑:程序博客网 时间:2024/06/04 20:09
------- android培训、java培训、期待与您交流! ----------
网络编程
网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
网络模型
计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指OSI(Open System Interconnection开放系统互连)参考模型,TCP/IP参考模型。
网络模型七层概述:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。
网络通信三要素
IP地址:InetAddress,网络中设备的标识,不易记忆,可用主机名。
端口号:用于标识进程的逻辑地址,不同进程的标识。
传输协议:通讯的规则,常见协议TCP,UDP。
InetAddress类的使用:获取任意主机:getByName;
主机名:getHostName;
主机Ip地址:getHostAddress。
端口号:物理端口:网卡口;
逻辑端口:每个网络程序都会至少有一个逻辑端口;
用于标识进程的逻辑地址,不同进程的标识;
有效端口:0~65535,其中0~1024系统使用或保留端口。
传输协议:TCP,建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过 三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。
UDP,将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大 小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。
Socket套接字
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
UDP传输:
DatagramSocket与DatagramPacket
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
UDP传输-发送端思路:
1:建立udp的socket服务
2:将要发送的数据封装成数据包
3:通过udp的socket服务,将数据包发送出
4:关闭资源
代码如下:
import java.net.*;public class UDPSend {public static void main(String[] args) throws Exception{//创建数据包对象DatagramPacketbyte[] bytes = "UDP我来了".getBytes();DatagramPacket dp = new DatagramPacket(bytes, bytes.length,InetAddress.getByName("127.0.0.1"),8000);//创建投递数据包对象DatagramSocketDatagramSocket ds = new DatagramSocket(4000);//调用投递数据包对象方法sendds.send(dp);//关闭资源ds.close();}}
UDP传输-接收端思路
1:建立udp的socket服务.
2:通过receive方法接收数据
3:将收到的数据存储到数据包对象中
4:通过数据包对象的功能来完成对接收到数据进行解析.
5:可以对资源进行关闭
代码如下:
import java.net.*;public class UDPReceive {public static void main(String[] args)throws Exception {//定义字节数组byte[] bytes = new byte[1024];//创建投递包,接收包服务对象DatagramSocket,传递端口号DatagramSocket ds = new DatagramSocket(8000);while(true){//创建数据包对象,接收对方发来的数据包DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//调用投递包对象方法receive接收数据包ds.receive(dp);//拆包//获取发送的字节数组有效长度int length = dp.getLength();//获取发送端IP地址String ip = dp.getAddress().getHostAddress();//获取发送的端口号int port = dp.getPort();//输出接收的字节数组System.out.println(new String(bytes,0,length)+".."+ip+".."+port);}//ds.close();}}
TCP传输
Socket和ServerSocket;
建立客户端和服务器端;
建立连接后,通过Socket中的IO流进行数据的传输;
关闭socket;
同样,客户端与服务器端是两个独立的应用程序。
客户端思路:
1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流。
3:通过Socket对象的方法,可以获取这两个流。
4:通过流的对象可以对数据进行传输。
5:如果传输数据完毕,关闭资源。
代码如下:
import java.net.*;import java.io.*;public class TCPClient {public static void main(String[] args)throws Exception {//创建客户端连接对象,连接服务器Socket s = new Socket("192.168.33.55", 8000);//读取键盘数据BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));//通过客户端连接对象,获取字节输出流向服务器发送数据//OutputStream out = s.getOutputStream();//打印流,简化操作 PrintWriter(任何流数据目的)PrintWriter out = new PrintWriter(s.getOutputStream(),true);String line = null;while((line = bfr.readLine())!=null){if("over".equals(line))break;//发送服务器out.println(line);}bfr.close();s.close();}}
服务端思路:
1:建立服务器端的socket服务,需要一个端口。
2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信。
3:通过客户端的获取流对象的方法,读取数据或者写入数据。
4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的。
代码如下:
import java.net.*;import java.io.*;public class TCPServer {public static void main(String[] args) throws Exception{//创建服务器连接对象,打开8000端口ServerSocket ss = new ServerSocket(8000);//获取客户端连接对象Socket s = ss.accept();//读取客户端数据,客户端连接对象获取字节输入流//InputStream in = s.getInputStream();//发送的字符文本,字节流直接读不方便,转成字符流BufferedReader bfrIn = new BufferedReader(new InputStreamReader(s.getInputStream()));//循环读取客户端数据String line = null;while((line = bfrIn.readLine())!=null){System.out.println(line.toUpperCase());}s.close();ss.close();}}
- 黑马程序员_Java 网络编程
- 黑马程序员_Java网络编程
- 黑马程序员_java网络编程
- 黑马程序员_java网络编程
- 黑马程序员_Java网络编程
- 黑马程序员_java网络编程
- 黑马程序员_java 网络编程
- 黑马程序员_java网络编程
- 黑马程序员_java网络编程
- 黑马程序员_java 网络编程
- 黑马程序员_java网络编程
- 黑马程序员_Java网络编程
- 黑马程序员_Java网络编程
- 黑马程序员_java网络编程
- 黑马程序员_java网络编程
- 黑马程序员_Java网络编程
- 黑马程序员_java网络编程
- 黑马程序员_java网络编程
- linux shell strace 使用 实例
- PHP代码:获取指定URL页面中的所有链接
- C语言中各种整型类型所占字节数
- 剑指offer 算法 (代码的鲁棒性)
- 使用git am打补丁
- 黑马程序员_java网络编程
- Errors running builder 'JavaScript Validator' on project
- java时间的获取
- 修改android的statusbar的高度
- 4.1 在SELinux中客体类存在的目的
- 如何安全退出已调用多个Activity的Application?
- MVC+edmx+数据验证 分属多assembly
- HDU 1260 Tickets
- telnet命令