网络编程
网络编程
计算机网络
将不同地理位置的计算机,通过网线,使多台计算机通过软件可以共享数据
java提供的网络类库,将实现细节隐藏起来
网络的通讯要素
IP/端口号:精确找到计算机某台主机
网络通信协议:快速传输数据
IP地址:InetAddress
唯一的标识 Internet 上的计算机
本地回环地址(hostAddress):127.0.0.1
主机名(hostName):localhost
端口号
不同的进程有不同的端口号
被规定为一个 16 0~65535
InetAddress类
Internet上的主机有两种方式表示地址:
域名(hostName):www.baidu.com
IP 地址(hostAddress):220.181.111.37
方法:
InetAddress.getByName("www.baidu.com");
getHostAddress();
getHostName();
public static void main(String[] args) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress);
System.out.println(inetAddress.getHostAddress());//主机地址
System.out.println(inetAddress.getHostName());//主机名
}
网络通信协议
–传输控制协议TCP(Transmission Control Protocol)
–用户数据报协议UDP(User Datagram Protocol)。
传输控制协议TCP
使用前,需建立TCP连接,形成数据传输通道
可靠的数据传输方式
传输前"三次握手",断开时"四次挥手"
断开时比较烦杂,速度慢
用户数据报协议UDP
使用时,不需要提前建立连接
不可靠
每个数据报的大小限制在64K
结束时无需释放资源,速度快
Socket套接字
创建服务器端
//创建服务器
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("等待连接");
//服务器监听等待链接的客户端请求连接
Socket socket = serverSocket.accept();//阻塞式 监听
System.out.println("连接成功");
创建客户端
//创建客户端,创建时需要建立连接
Socket socket = new Socket("127.0.0.1", 8888);
如何接收和发送消息
服务器端
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("等待连接");
//服务器监听等待链接的客户端请求连接
Socket socket = serverSocket.accept();//阻塞式 监听
System.out.println("连接成功");
//接收客户端的信息
InputStream in = socket.getInputStream();
byte[] b = new byte[1024];
int length = in.read(b);//将客户端的信息写入byte数组中
//转字符串
String s = new String(b, 0, length, "utf-8");
System.out.println("来自客户端的信息:" + s);
//服务器端向客户端发送消息
OutputStream out = socket.getOutputStream();
out.write("我已收到".getBytes("utf-8"));
}
客户端
public static void main(String[] args) throws IOException {
//创建客户端,创建时需要建立连接
Socket socket = new Socket("127.0.0.1", 8888);
//获得输出流对象
OutputStream out = socket.getOutputStream();
System.out.println("向服务器发送的内容:");
Scanner input = new Scanner(System.in);
String s = input.next();
out.write(s.getBytes("utf-8"));
//客户端收到服务器端的消息
InputStream in = socket.getInputStream();
byte [] b= new byte[1024];
int length = in.read(b);
String ms = new String(b,0,length,"utf-8");
System.out.println("接收到服务器端的信息:"+ms);
out.close();
socket.close();
}
另外一种接收和发送的方法
DataInputStream&&DataOutputStream
/*接收***发过来的信息*/
DataInputStream dataInputStream = new DataInputStream(sss.getInputStream());
String ms = dataInputStream.readUTF();
System.out.println(ms);
/*向***发送信息*/
DataOutputStream dataOutputStream = new DataOutputStream(sss.getOutputStream());
String s = input.next();
dataOutputStream.writeUTF(s);
UDP网络通信
类 DatagramSocket 和 DatagramPacket 实现了基于UDP 协议网络程序。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
客户端
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
//封装数据包/报
Scanner input = new Scanner(System.in);
String str = input.next();
byte[] b = str.getBytes("utf-8");
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket = new DatagramPacket(b,0,b.length,inetAddress,9999);
//发送数据send();
datagramSocket.send(datagramPacket);
}
服务器端
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] b= new byte[1024];
DatagramPacket datagramPacket= new DatagramPacket(b,b.length);
datagramSocket.receive(datagramPacket);//接收数据
//datagramPacket.getLength()实际向数组中装入的长度
String s = new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println(s);
}