黑马程序员-java网络编程
Java网络编程(即所谓的socket编程),在通信的2个端点之间都有socket,数据就是在这2个socket之间通过IO进行传输的,网络模型主要有:1.OSI参考模型(应用层->表示层->会话层->传输层->网络层->数据链路层->物理层),2.TCP/IP参考模型(应用层->传输层->网际层->主机至网络层)
网络的通讯要素有:1.IP地址 2.端口号 3.传输协议,这里主要说一下传输协议,协议主要分为2大类(UDP和TCP),它们都是互联网的传输协议,而不同之处主要表现在数据的安全性和完整性方面:
UDP协议是面向无连接的协议,同TCP协议相比是一个不安全的数据传输协议。UDP数据包中的验证信息要比TCP协议少的多。所以对数据安全性和完整性的验证就没有TCP协议安全了,相对TCP的大数据量传输,UDP的每个数据包限制在64k内,因为是不可靠的协议,故不需要建立连接,所以速度较快。
TCP协议是面向连接的协议,所以是一个安全的数据传输协议,当在校验的过程中发现数据传输错误的话,会立即进行数据的重传,以保证数据的正确性和完整性,是个安全的数据传输协议,此外TCP可以进行大数据量的传输,因为是可靠协议,故必须建立连接,所以在效率方面相对UDP而言会稍低些。
通过UDP协议进行简单的网络传输:
发送端的代码
Java代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend {
public static void main(String[] args) throws Exception {
// 1.创建udp服务,通过DatagramScoket对象
DatagramSocket ds = new DatagramSocket();
// 2.确定数据,并封装成数据包,DatagramPacket(byte[] buf, int length, InetAddress
// address, int port)
byte[] buf = "以udp形式发送的数据".getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress
.getByName("127.0.0.1"), 10000);
// 3.通过socket服务,将已有的数据包发送出去,通过send方法
ds.send(dp);
// 4.关闭资源
ds.close();
}
}
接收端代码
Java代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive {
public static void main(String[] args) throws Exception {
// 1.创建udp socket,建立端口
DatagramSocket ds = new DatagramSocket(10000);
// 2.定义数据包,用于存储数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 3.通过服务的recieve方法将收到的数据存入数据包中
ds.receive(dp); //阻塞式方法
// 4.通过数据包的方法获取其中的数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println(ip + "::" + data + "::" + port);
//5.关闭资源
ds.close();
}
}
通过TCP协议进行简单的网络传输:
服务器端代码
Java代码
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws Exception {
//建立服务端socket,并监听一个端口
ServerSocket ss = new ServerSocket(9999);
//通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + ".....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf, 0, len));
s.close();
ss.close();
}
}
客户端代码
Java代码
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws Exception {
//创建客户端socket服务,指定目的主机和端口
Socket s = new Socket("127.0.0.1", 9999);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("以tcp形式发送的数据".getBytes());
s.close();
}
}
补充:软件开发 , Java ,