网络编程
网络模型1.OSI参考模型
2.TCP/IP参考模型
网络通讯要素
1.IP地址
●网络中设备标识
●不易记忆,可用主机名
●本地回环地址:127.0.0.1 主机名:localhost
2.端口号
用于标示进程的逻辑地址,不同进程的标示
有效端口0~65535,其中0~1024系统使用或保留端口,
3.传输协议
通讯规则
常见协议:TCP,UDP
UDP
将数据及源和目的封装成数据报,不需要建立连接。
每个数据报的大小限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
Socket
Socket就是为网络服务提供的一种机制
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
UDP用的对象是 DatagramSocket
Ps:xxx.xxx.x.255 是广播地址。
练习:
通过udp传输方式,将一段文字数据发送出去。
思路:
1.建立udpsocket服务;
2.提供数据,并将数据封装到数据包中
3.通过Socket服务的发送功能,将数据包发出去
4.关闭资源。
定义一个应用程序,用于接受UDP协议传输的协议并处理。
思路:
1.定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标示,方便于明确哪些数据过来该应用程序可以处理。
2.定义一个数据包,存储接受到的字节数据,因为数据包对象中有更多功能,可以提取字节数据中的不同数据信息。
3.通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4.通过数据包特有功能,将这些不同的数据取出,处理。
5。关闭资源。
package it.practise.com.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
class UdpSend {
public static void main(String[] args) throws Exception {
// 1.建立udpsocket服务;
DatagramSocket ds = new DatagramSocket();
// 2.提供数据,并将数据封装到数据包中
byte[] data = "First Socket Program !!".getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.100"), 10000);
// 3.通过Socket服务的发送功能,将数据包发出去
ds.send(dp);
// 4.关闭资源。
ds.close();
}
}
class UdpRecive {
public static void main(String[] args) throws Exception {
// 1.定义udpsocket服务
DatagramSocket ds = new DatagramSocket(10000);
// 2.定义一个数据包,存储接受到的字节数据,因为数据包对象中有更多功能,可以提取字节数据中的不同数据信息。
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
// 3.通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
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();
}
}
public class UdpDemo {
public static void main(String[] args) {
}
}
编写一个聊天程序,有收数据的部分和发数据的部分。
这两部分需要同时执行,那就需要多线程技术,一个线程控制发,一个线程控制收。
因为收和发,动作是不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中。
package it.practise.com.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 编写一个聊天程序,有收数据的部分和发数据的部分。
* 这两部分需要同时执行,那就需要多线程技术,一个线程控制发,一个线程控制收。
*
* 因为收和发,动作是不一致的,所以要定义两个run方法。
* 而且这两个方法要封装到不同的类中。
*/
public class ChatDemo {
public static void main(String[] args) throws Exception {
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10002);
Send send = new Send(sendSocket);
Rece rece = new Rece(receSocket);
Thread tSend = new Thread(send);
Thread tRece = new Thread(rece);
tSend.start();
tRece.start();
}
}
class Send implements Runnable {
private DatagramSocket ds;
Send(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine()) != null) {
if("886".equals(line))
break;
byte[] buff = line.getBytes();
DatagramPacket dp = new DatagramPacket(buff, buff.length, InetAddress.getByName("192.168.1.255"), 10002);
ds.send(dp);
}
} catch(Exception e) {
throw new RuntimeException("发送端失败。");
}
}
}
class Rece implements Runnable {
private DatagramSocket ds;
Rece(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
try{
while(true) {
byte[] buff = new byte[1024];
DatagramPacket dp = new DatagramPacket(buff, buff.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println(ip + "::" + data);
}
} catch(Exception e) {
throw new RuntimeException("接收端失败。");
}
}
}